Kingonion 2019-06-27
1、Xtrabackup介绍
Xtrabackup是有Percona公司发行的一款数据库物理备份工具,可以对InnoDB存储引擎的表实现在线热备,同时可以对数据库进行全备和增量备份以及增量恢复。
2、下载及安装
(1)下载地址:https://www.percona.com/downl... ,根据自身的操作系统选择版本,版本如果不对应,会安装失败,本人使用的是CentOS6.9_X64的操作系统,下载的版本为:percona-xtrabackup-24-2.4.8-1.el6.x86_64.rpm
(2)安装依赖库perl-DBD-MySQL,如果已经安装,直接进入下一步
#查看是否安装 [root@WB-BLOG ~]# rpm -qa | grep perl-DBD-MySQL #如果没有安装,使用下面的命令安装perl-DBD-MySQL [root@WB-BLOG ~]# yum install -y per-DBD-MySQL
(3)安装libev依赖库
a、下载地址:在 http://rpmfind.net/ 直接搜索libev,然后选择和自己操作系统对应的rpm安装包
b、注意:此处也需要注意版本,否则会安装失败,本人用的是CentOS6.9_X64的操作系统,下载的rpm安装包版本为:libev-4.04-2.el6.x86_64.rpm
c、安装:
[root@WB-BLOG ~]# rpm -ivh libev-4.04-2.el6.x86_64.rpm
(4)安装perl-Digest-MD5依赖库,否则在备份过程中会出现错误
[root@WB-BLOG ~]# yum -y install perl-Digest-MD5
(5)安装Xtrabackup
[root@WB-BLOG ~]# rpm -ivh percona-xtrabackup-24-2.4.8-1.el6.x86_64.rpm
3、使用方法
语法:innobackupex [OPTIONS] /path
常用参数OPTIONS说明:
---------------------------------------基本备份参数--------------------------------- --user:指定执行备份操作的用户名 --password:指定执行备份操作的用户密码 --host:指定数据库所在服务器的域名或者IP地址 --port:指定实例端口 --socket:指定socket文件,以便备份进程登陆mysql --databases:指定要备份的数据库,如果需要备份多个数据库,多个数据库之间使用空格隔开,如:--databases="test1 test2" --include:指定要备份的数据库,可以指定多个库"db1.*|db2.*" 还可以指定要备份的表,可以指定多个表"db1.table01|db1.table02|db2.test" --defaults-file:指定数据库实例的配置文件my.cnf。注:如果用该参数,必须放在第一个参数位置,否则会提示错误 --apply-log:通过回滚未提交的事务及同步已经提交的事务至数据文件来保证数据文件处于一致性状态 --redo-only:用来保证全备和增量备份的数据文件在恢复前必须先将在重做日志文件中的已提交的事务重做,该参数将会合并全备和增量备份的数据文件,但不包括最后一次增量备份的数据文件 --copy-back:指定操作为数据的恢复,如果不是全备,不可用这个选项,这个选项用于全备的恢复 --slave-info:在主从库备份中使用,用来备份从库的"show slave status"信息 --stream:指定备份文件的输入格式,如:tar --tmpdir:如果使用stream=tar的时候备份,xtrabackup_logfile可能会放在临时目录/tmp下,如果此时数据库中数据写入量特别大的时候,这个文件会特别大,可能会将/tmp目录占满,使用这个参数可以指定tmp目录 --no-timestamp:该选项后面不用加值,用来指定备份的时候不适用默认的日期目录,而是使用指定好的目录 ---------------------------------------增量备份参数--------------------------------- --incremental:指定操作为增量备份操作 --incremental-basedir:指定本次的增量备份是相对于之前的哪一次备份,指定之前备份数据的目录 --incremental-dir:指定增量备份恢复时,增量备份的目录
其他更多参数,可以使用"innobackupex --help"命令查看。
4、备份及恢复示例
示例1:全量备份127.0.0.1上3306实例中的所有数据,备份到/backup目录下,然后模拟数据丢失恢复
备份:
[root@WB-BLOG ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --port=3306 --socket=/tmp/mysql.sock /backup/ #上述命令执行完成之后,打印completed ok.然后查看是否备份成功,很重要 [root@WB-BLOG ~]# ls /backup/
恢复:
#模拟故障,删除数据目录 [root@WB-BLOG ~]# rm -rf /mnt/mydata/data/* #杀掉mysql的服务进程 [root@WB-BLOG ~]# killall mysqld #应用log日志,目的是为了回滚未提交的事务及同步已经提交的事务至数据目录,保证数据的一致性 [root@WB-BLOG ~]# innobackupex --apply-log /backup/2018-05-29_10-27-53/ #恢复数据,指定配置文件,xtrabackup会将数据文件拷贝到原来的数据目录中 [root@WB-BLOG ~]# innobackupex --defaults-file=/etc/my.cnf --copy-back /backup/2018-05-29_10-27-53/ #拷贝完成之后,权限会有问题,需要重新授权 [root@WB-BLOG ~]# chown -R mysql:mysql /mnt/mydata/data/ #重新启动数据库来验证是否恢复正常 [root@WB-BLOG ~]# service mysqld start
示例2:全量备份127.0.0.1服务器上3306实例的所有数据,并备份到目录/backup/20180619目录下,然后恢复
备份:
[root@WB-BLOG ~]# mkdir -pv /backup/20180619 [root@WB-BLOG ~]# innobackupex --user=root --password=root --host=127.0.0.1 --port=3306 --socket=/tmp/mysql.sock --no-timestamp /backup/20180619/ [root@WB-BLOG ~]# ls /backup/20180619/
恢复,处理过程和示例1相同,不再解释:
[root@WB-BLOG ~]# rm -rf /mnt/mydata/data/* [root@WB-BLOG ~]# killall mysqld [root@WB-BLOG ~]# innobackupex --apply-log /backup/20180619/ [root@WB-BLOG ~]# innobackupex --defaults-file=/etc/my.cnf --copy-back /backup/20180619/ [root@WB-BLOG ~]# chown -R mysql:mysql /mnt/mydata/data/ [root@WB-BLOG ~]# service mysqld start
示例3:备份127.0.0.1服务器上3306实例中的test1和test2数据库,并备份到/backup/part_db/目录下,然后恢复
备份:
[root@WB-BLOG ~]# mkdir -pv /backup/part_db [root@WB-BLOG ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --host=127.0.0.1 --port=3306 --socket=/tmp/mysql.sock --databases="test1 test2" --no-timestamp /backup/part_db/ [root@WB-BLOG ~]# ls /backup/part_db/
恢复:
#模拟数据库丢失 [root@WB-BLOG ~]# mysql -uroot -proot -h127.0.0.1 -P3306 -e "drop database test1" [root@WB-BLOG ~]# mysql -uroot -proot -h127.0.0.1 -P3306 -e "drop database test2" #应用log日志,使未提交的事务回滚,已经提交的数据同步到数据目录中 [root@WB-BLOG ~]# innobackupex --apply-log /backup/part_db/ #由于是部分数据库的恢复,所以不能使用--copy-back选项,所以需要使用拷贝的方法 [root@WB-BLOG ~]# cp -r /backup/part_db/test{1,2}/ /mnt/mydata/data/ #授权 [root@WB-BLOG ~]# chown -R mysql:mysql /mnt/mydata/data/test{1,2} #重启数据库 [root@WB-BLOG ~]# servie mysqld restart
示例4:增量备份127.0.0.1服务器上3306实例中的所有库,第一次增量备份到目录/backup/increment01,第二次增量备份到目录/backup/increment02,全量备份到/backup/allback然后恢复
备份:
#创建全量备份和增量备份目录 [root@WB-BLOG ~]# mkdir -pv /backup/allback [root@WB-BLOG ~]# mkdir -pv /backup/increment{01,02} #完成一次全量备份 [root@WB-BLOG ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --host=127.0.0.1 --port=3306 --socket=/tmp/mysql.sock --no-timestamp /backup/allback/ #完成第一次增量备份,此时可能会有新数据写入 [root@WB-BLOG ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --host=127.0.0.1 --port=3306 --socket=/tmp/mysql.sock --no-timestamp --incremental-basedir=/backup/allback/ --incremental /backup/increment01/ #完成第二次全量备份,此时可能会有新数据写入 [root@WB-BLOG ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --host=127.0.0.1 --port=3306 --socket=/tmp/mysql.sock --no-timestamp --incremental-basedir=/backup/increment01/ --incremental /backup/increment02/ #查看两次备份的数据目录是否正常 [root@WB-BLOG ~]# ls /backup/increment0{1,2}
恢复:
#模拟数据丢失 [root@WB-BLOG ~]# rm -rf /mnt/mydata/data/* [root@WB-BLOG ~]# killall mysqld #完成全备的log日志应用 [root@WB-BLOG ~]# innobackupex --defaults-file=/etc/my.cnf --incremental --apply-log --redo-only /backup/allback/ #完成第一次增量中log日志的应用 [root@WB-BLOG ~]# innobackupex --defaults-file=/etc/my.cnf --incremental --apply-log --redo-only /backup/allback/ --incremental-dir=/backup/increment01/ #完成第二次增量中log日志的应用 [root@WB-BLOG ~]# innobackupex --defaults-file=/etc/my.cnf --incremental --apply-log --redo-only /backup/allback/ --incremental-dir=/backup/increment02/ #两次增量都合并到全量中之后,再应用全量中的log日志 [root@WB-BLOG ~]# innobackupex --defaults-file=/etc/my.cnf --apply-log /backup/allback/ #最后全量恢复全备文件夹中的数据 [root@WB-BLOG ~]# innobackupex --defaults-file=/etc/my.cnf --copy-back /backup/allback/ #重新授权 [root@WB-BLOG ~]# chown -R mysql:mysql /mnt/mydata/data/ #然后启动数据库服务,然后验证数据是否正确 [root@WB-BLOG ~]# service mysqld start
示例5:压缩备份127.0.0.1服务器上的3306实例中的test1库到/backup/test1_data,然后恢复
备份:
#创建备份目录 [root@WB-BLOG ~]# mkdir -pv /backup/test1_data #压缩备份 [root@WB-BLOG ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --host=127.0.0.1 --port=3306 --socket=/tmp/mysql.sock --compress --no-timestamp --databases="test1" /backup/test1_data/
恢复:
#模拟删掉数据库test1 [root@WB-BLOG ~]# mysql -uroot -proot -h127.0.0.1 -P3306 -e "drop database test1" #恢复,首先解压缩 [root@WB-BLOG ~]# innobackupex --decompress /backup/test1_data/ #注意:如果提示如下错误,则需要安装qpress工具,下载地址:ftp://ftp.pbone.net/mirror/ftp5.gwdg.de/pub/opensuse/repositories/home:/AndreasStieger:/branches:/Archiving/CentOS_CentOS-6/x86_64/qpress-1.1-8.3.x86_64.rpm,使用rpm命令安装 innobackupex version 2.4.8 based on MySQL server 5.7.13 Linux (x86_64) (revision id: 97330f7) 180529 12:29:01 [01] decompressing ./ibdata1.qp sh: qpress: command not found cat: write error: Broken pipe Error: thread 0 failed. [root@WB-BLOG ~]# innobackupex --apply-log /backup/test1_data #拷贝备份数据 [root@WB-BLOG ~]# cp -r /backup/test1_data/test1/ /mnt/mydata/data/ [root@WB-BLOG ~]# chown -R mysql:mysql /mnt/mydata/data/test1/ #重启数据库然后验证数据是否正确 [root@WB-BLOG ~]# service mysqld restart
至此,Xtrabackup物理备份工具介绍完毕,常见的用法可以参考上述的示例。另外,该工具还有其他高级用法,使用较少,此处暂未介绍。下篇文章将介绍MySQL的另外一种物理备份方式:基于LVM的逻辑卷备份。欢迎评论转发!