Xtrabackup物理备份工具,备份MySQL5.6.36

(一)Xtrabackup工具简介 percona公司的备份工具,性能比较高。物理备份工具。 特点: 物理备份工具,在同级数据量基础上,都要比逻辑备份性能要好的多。 特别是在数据量比较大的时候,体现的更加明显。 备份方式: 1、拷贝数据文件(myisam存储引擎可以直接cp拷贝,但是innodb的不行) 2、拷贝数据页 备份原理(innodb): 1、对于innodb表,可以实现热备 (1)在数据还有修改操作的时刻,直接将数据文件中的数据页备份 此时,备份走的数据对于当前mysql来讲是不一致。 (2) 将备份过程中的redo和undo一并备走。 (3)为了恢复的时候,只要保证备份出来的数据页LSN能和redo LSN匹配, 将来恢复的就是一致的数据。redo应用和undo的应用。 2、对与myisam表,实现自动锁表拷贝文件。

(二)Xtrabackup软件安装: 1、安装 (1)依赖包解决 wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL

wget http://rpmfind.net/linux/dag/redhat/el6/en/x86_64/dag/RPMS/libev-4.15-1.el6.rf.x86_64.rpm rpm -ivh libev-4.15-1.el6.rf.x86_64.rpm

(2)下载Xtrabackup软件并安装 wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/redhat/6/x86_64/percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm yum -y install percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm

2、命令参数详解和备份举例 创建备份路径 mkdir /server/backup -p

innobackupex参数讲解: --user=
--password= --socket= //配置文件/etc/my.cnf里面指定了,就不需要指定了 --no-timestamp

全备例子: innobackupex --user=root --password=oldboy123 /server/backup/ //备份时,需要指定备份路径,这种会以时间戳为目录,备份出来 innobackupex --no-timestamp /server/backup/full //以full目录来存放数据

(三)全备备份恢复实战: 1、数据备份 innobackupex --user=root --password=oldboy123 --no-timestamp /server/backup/full

2、恢复数据前的准备(合并xtabackup_log_file和备份的物理文件) innobackupex --apply-log --use-memory=32M /server/backup/full/

3、模拟故障 停库: pkill mysqld 破坏数据: cd /application/mysql/data \rm -rf *

4、恢复 (cp -a /server/backup/full/* /application/mysql/data) //一般不建议用这种方式,用第二种方式最佳 或者 innobackupex --copy-back /server/backup/full/ ###注意:恢复时,要确认数据路径是空的,并且数据库是停掉的

chown -R mysql.mysql /application/mysql/data //递归授权太重要了,不然数据库启动不了,切记!!!已经踩过坑了

启动: /etc/init.d/mysqld start

(四)xtrabackup 实现增量备份及故障恢复:

周日全备,周一到周六做增量

1、周日全备: mkdir /backup/full innobackupex --user=root --password=123 --no-timestamp /backup/full/ 2、模拟数据变化(周一数据变化) mysql> insert into t1 values(7,'zhao3'); 。 。 3、第一增量(周一晚上增量): innobackupex --user=root --password=123 --incremental --no-timestamp --incremental-basedir=/backup/full/ /backup/inc1 4、模拟数据变化(周二数据变化) insert into t1 values(8,'tangyong'); 。 。 5、第二次增量(周二晚上增量): innobackupex --user=root --password=123 --incremental --no-timestamp --incremental-basedir=/backup/inc1 /backup/inc2 6、模拟数据损坏 n多的操作。。。。。 周三上午10:00时刻,删除t1表 drop table t1;

7、数据恢复前准备: innobackupex --apply-log --redo-only /backup/full innobackupex --apply-log --redo-only --incremental-dir=/backup/inc1 /backup/full innobackupex --apply-log --incremental-dir=/backup/inc2 /backup/full innobackupex --apply-log /backup/full

8、数据恢复:(切记,恢复前需要关闭数据库) Error: datadir must be specified. (这种情况需要在/etc/my.cnf配置文件里面指定data数据文件目录) innobackupex --copy-back /backup/full/

启动数据库: chown -R mysql.mysql /applicaion/mysql/data/ 注意:更改所属主和组,必须要做,否则启动不了 /etc/init.d/mysql start


作业:生产恢复案例: 背景: 1、xtrabackup备份策略每周日,full全备 2、xtrabackup周一到周六,inc1-inic6 3、总数据量200G 4、周三上午10点误删除表t1,数据量1G左右 5、周二晚上inc2备份完成之后到周三上午10点又做了很多操作

如何将数据库恢复到t1表误删除之前状态?

思路: 1、停业务,挂维护页 2、找备用库 3、合并full+inc1+inc2 4、截取周二晚上inc2备份后到周三上午10点,t1表删除之前的binlog日志 5、将合并后的full+截取的binlog恢复到备用库 6、验证数据可用性和完整性 7、使用备用库替代生产库使用或者将t1表导出并导入回生产库 8、业务恢复

作业实践验证-方法1: (常用方法) innobackupex增量备份实践 1、周末晚上对数据进行全量备份 innobackupex --user=root --password=oldboy123 --no-timestamp /backup/full 2、周一对数据进行输入等操作 insert into t1 values(9,'tang1'); insert into t1 values(10,'tang2'); 3、周一晚上对数据进行增量备份 innobackupex --user=root --password=oldboy123 --incremental --no-timestamp --incremental-basedir=/backup/full/ /backup/inc1 4、周二对数据进行输入操作 insert into t1 values(11,'tao1'); insert into t1 values(12,'tao2'); 5、周二晚上对数据进行增量备份 innobackupex --user=root --password=oldboy123 --incremental --no-timestamp --incremental-basedir=/backup/inc1 /backup/inc2 6、周三对数据进行输入操作 insert into t1 values(13,'shanchu1'); insert into t1 values(14,'shanchu2'); 7、周三备份前对数据进行删除操作 drop table t1; 8、数据恢复前准备 innobackupex --apply-log --redo-only /backup/full innobackupex --apply-log --redo-only --incremental-dir=/backup/inc1 /backup/full innobackupex --apply-log --incremental-dir=/backup/inc2 /backup/full innobackupex --apply-log /backup/full 9、数据进行恢复 innobackupex --copy-back /backup/full/ 启动数据库: chown -R mysql.mysql /applicaion/mysql/data/ 注意:更改所属主和组,必须要做,否则启动不了 /etc/init.d/mysql start 10、二进制日志截取 [root@db02 full]# more xtrabackup_binlog_pos_innodb //查看到最后一次备份的标志位 my-bin.000003 906

show binary logs和show binlog events in 'my-bin.000003'; //查看到删表前的标志位 | my-bin.000003 | 1275 | Xid | 1 | 1306 | COMMIT /* xid=68 */

mysqlbinlog --start-position=906 --stop-position=1306 /data/binlog/my-bin.000003 >/backup/binlog.sql

11、进行binlog日志文件的恢复 //到此,xtrabackup备份的数据和binlog二进制备份的数据已经全部恢复 临时关闭二进制日志 set sql_log_bin=0; 恢复操作 source /backup/binlog.sql;

作业实践验证-方法2: //注:这种表结构只有问开发,必须知道表结构才行,这种方法可以不需要恢复所有数据,针对丢失的1G数据恢复就可以了。 drop table t1; //模拟t1表被误删 create table t1 (id int,name varchar(20)); //注:这种表结构只有问开发,必须知道表结构才行 alter table t1 discard tablespace;

cd /application/mysql/data/oldboy cp /backup/full/oldboy/t1.ibd ./ //将inc2状态下的t1.ibd文件拷贝过来

chown -R mysql.mysql * //修改文件所属,改为mysql alter table t1 import tablespace;