XtraBackup是Percona公司开发的一款很好用的数据备份工具,支持对InnoDB引擎数据的热备份,对MyISAM引擎的数据作备份时须要锁表,详细信息参见官网或其余资源。【XtracBackup官网】mysql
操做系统:CentOS 6.5 64位 主机地址:10.0.0.26 主机名:mysql01 mysql版本:mysql-5.6.36 XtraBackup版本:2.4.12
MySQL服务详细安装过程请参考上一篇文章【慢查询可视化介绍】
这里须要注意的是,必需要开启log-bin功能,并且日志文件最好不要和数据文件放在同一个目录,以避免对实验形成影响。下面是mysql的基本配置,若是缺乏其中某一项则可能会出现报错。sql
[mysqld] basedir=/opt/mysql-5.6.36/ datadir=/opt/mysql/data log-bin=/opt/mysql/log/mysql-bin slow_query_log_file = /opt/mysql/log/slow.log [client] socket=/opt/mysql/tmp/mysql.sock
一、安装XtraBackup的依赖:数据库
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
二、下载安装XtraBackup:服务器
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.12/binary/redhat/6/x86_64/percona-xtrabackup-24-2.4.12-1.el6.x86_64.rpm --no-check-certificate yum -y localinstall percona-xtrabackup-24-2.4.12-1.el6.x86_64.rpm
三、检查是否安装成功:app
[root@mysql01 data]# xtrabackup -v xtrabackup: recognized server arguments: --datadir=/opt/mysql/data --log_bin=/opt/mysql/log/mysql-bin xtrabackup version 2.4.12 based on MySQL server 5.7.19 Linux (x86_64) (revision id: 170eb8c)
某公司使用mysql数据库做为生产环境,对数据库的备份策略为全量+增量,具体以下:
一、每周六00:00经过XtraBackup进行一次数据全量备份socket
0 0 * * 6 full.sh
二、周日-周五天天01:00经过XtraBackup进行数据增备ide
0 1 * * 0-5 inc.sh
三、开启binlog日志功能工具
在星期二的下午2点,某开发人员不当心误删了一张表,大概10GB左右,须要对该表进行恢复操做。在删表到开始恢复的这段时间内,可能还在继续对其余表进行写入操做。测试
一、断开数据库的链接,以防止二次破坏 二、准备上周六全备,并--apply-log redo-only 三、合并增量,周日、周1、--apply-log --redoonly 周二--apply-log 四、在测试库恢复以上数据,数据的目前状态应该周二凌晨1:00 五、须要恢复的数据状态是下午2点钟左右,从1点开始的binlog恢复到删除以前那个events的position。 六、导出删除的表,恢复到生产库,验证数据可用性、完整性。 七、启动应用链接数据库。
一、建立备份相关目录:spa
mkdir /backup/xbackup/full #<==全备目录 mkdir /backup/xbackup/inc1 #<==增备目录1 mkdir /backup/xbackup/inc2 #<==增备目录2 mkdir /backup/xbackup/inc3 #<==增备目录3
二、建立数据库和表:
建立数据库test,在test下建立表test和SC。其中test是须要删除的表,而SC是一直有数据写入的表
create database test character set utf8 collate utf8_general_ci; use test; create table test(id int,name char(20),age int); drop table SC; create table SC( SCid int(12) NOT NULL auto_increment COMMENT '主键', Cno int(10) NOT NULL COMMENT '课程号', Sno int(10) NOT NULL COMMENT '学号', Grade tinyint(2) NOT NULL COMMENT '学生成绩', PRIMARY KEY (SCid) )ENGINE=InnoDB DEFAULT CHARSET=utf8;
时间规划为2018-07-20(周五)----2018-07-24(周二)![]
一、模拟全备前数据写入:
date -s 2018-07-20 insert into test values(1,'小红',11); insert into test values(2,'小黄',12); INSERT INTO SC(Sno,Cno,Grade) values(0001,1001,1);
二、周六数据全备及以后数据写入:
date -s 2018-07-21 innobackupex --user=root --password=123456 --no-timestamp /backup/xbackup/full/ date -s 08:00:00 insert into test values(3,'小蓝',13); INSERT INTO SC(Sno,Cno,Grade) values(0002,1002,2); commit;
三、周日1点进行增备(20180722)和增量数据模拟:
date -s 2018-07-22 date -s 01:00:00 innobackupex --user=root --password=123456 --incremental --no-timestamp --incremental-basedir=/backup/xbackup/full/ /backup/xbackup/inc1 date -s 14:00:00 insert into test values(4,'小白',14); INSERT INTO SC(Sno,Cno,Grade) values(0003,1003,3); commit;
四、周一1点进行增备(20180723)和增量数据模拟:
date -s 2018-07-23 date -s 01:00:00 innobackupex --user=root --password=123456 --incremental --no-timestamp --incremental-basedir=/backup/xbackup/inc1/ /backup/xbackup/inc2 date -s 17:00:00 insert into test values(5,'小黑',15); INSERT INTO SC(Sno,Cno,Grade) values(0004,1004,4); commit;
五、周二1点进行增备(20180724)和增量数据模拟:
date -s 2018-07-24 date -s 01:00:00 innobackupex --user=root --password=123456 --incremental --no-timestamp --incremental-basedir=/backup/xbackup/inc2/ /backup/xbackup/inc3 date -s 04:00:00 insert into test values(6,'小黄',16); INSERT INTO SC(Sno,Cno,Grade) values(0005,1005,5); commit;
在下午两点的时候删除表test,在此以后还继续对其余表进行操做。
date -s 14:00:00 drop table test; INSERT INTO SC(Sno,Cno,Grade) values(0006,1006,6);
想要恢复数据,须要XtraBackup备份到星期二01:00点的数据,以及binlog在星期二01:00点以后到14:00这一段时间之类的数据。根据这两部分的数据,便可恢复表删除以前时间点的数据。
一、获取XtraBackup到星期二01:00的完整数据:
innobackupex --apply-log --redo-only /backup/xbackup/full/ innobackupex --apply-log --redo-only --incremental-dir=/backup/xbackup/inc1 /backup/xbackup/full/ innobackupex --apply-log --redo-only --incremental-dir=/backup/xbackup/inc2 /backup/xbackup/full/ innobackupex --apply-log --incremental-dir=/backup/xbackup/inc3 /backup/xbackup/full/ innobackupex --apply-log /backup/xbackup/full/ 详细备份参数请参考官方文档或其余资料。
二、确认binlog的起点:
在XtraBackup的备份文件xtrabackup_binlog_info中会记录binlog的文件及起始位置。
三、确认DROP语句以前的binlog位置:
mysqlbinlog --start-position=3295 /opt/mysql/log/mysql-bin.000006 >> /tmp/tmp.sql cat /tmp/tmp.sql
四、恢复成sql文件:
经过上面两步,能够发现binlog的起始位置,以及DROP以前一个的结束位置。经过这两个position能够生成从01:00开始到14:00这一段时间内的数据库增量文件。
mysqlbinlog --start-position=3295 --stop-position=3782 /opt/mysql/log/mysql-bin.000006 > /tmp/recover.sql
经过另一台测试库恢复。将XtraBackup和binlog的恢复文件发送到另一台测试数据库(10.0.0.27,mysql02),经过这台测试数据库将数据恢复到14:00的状态,再经过mysqldump备份出test表,最终传输到mysql01将数据恢复。
一、传输备份文件到mysql02:
scp -rp /backup/xbackup/full/ root@10.0.0.27:/tmp/ scp -rp /tmp/recover.sql root@10.0.0.27:/tmp/
二、测试库恢复XtraBackup数据:
再数据恢复以前,须要将测试库的data目录清空
innobackupex --copy-back /tmp/full/ chown -R mysql.mysql /opt/mysql/data/ /etc/init.d/mysqld start
三、测试库恢复binlog数据:
source /tmp/recover.sql
到此,已恢复到了删表前一个时间点的数据,这时咱们将test表导出并恢复到正式库便可。
mysqldump -uroot -p123456 test test > /tmp/test_test.sql mysql -uroot -p123456 < /tmp/test_test.sql 删除表恢复到删除时间点过程结束!
从XtraBackup抽取表文件恢复。相对于方案一来讲,不须要恢复所有数据库,也不须要再其余库上进行恢复,可是此种方式须要清楚建表的结构。
一、导出表:
导出表是在备份的prepare阶段进行的,所以,一旦彻底备份完成,就能够在prepare过程当中经过--export选项将某表导出了。
导出前:
导出表命令:
innobackupex --apply-log --export /backup/xbackup/full/ 此命令会为每一个innodb表的表空间建立一个以.exp结尾的文件,这些以.exp结尾的文件则能够用于导入至其它服务器。
导出后:能够看出多了表结构等两个文件
二、建立相同结构的表并删除此表的表空间:
create table test(id int,name char(20),age int); alter table test.test discard tablespace; #<==必须经过命令删除,不能手动删除文件
三、复制test.ibd和test.exp文件到数据目录:
[root@mysql01 test]# pwd /backup/xbackup/full/test [root@mysql01 test]# cp test.ibd /opt/mysql/data/test/ [root@mysql01 test]# cp test.exp /opt/mysql/data/test/ [root@mysql01 test]# chown -R mysql.mysql /opt/mysql/data/test/*
四、使用命令导入表
alter table test import tablespace;
五、经过binlog恢复tests表01:00-14:00的增量数据
单表恢复只涉及到了test表,所以不须要其余表的数据,须要从recover.sql中过滤出test表
grep test /tmp/recover.sql > /tmp/test.sql source /tmp/test.sql
方案1
不须要知道原来的表结构,主库也只须要source sql文件,可是须要恢复所有数据库,而且须要在两台主机上传输数据,在数据量大的时候比较慢。
方案2
须要知晓表结构,相对来讲更简单快捷。
至此,XtraBackup备份及恢复实践完毕!!!