XtraBackup备份恢复模拟实践

XtraBackup是Percona公司开发的一款很好用的数据备份工具,支持对InnoDB引擎数据的热备份,对MyISAM引擎的数据作备份时须要锁表,详细信息参见官网或其余资源。【XtracBackup官网】mysql

1. 实验环境

1.1 系统环境:

操做系统:CentOS 6.5 64位
主机地址:10.0.0.26
主机名:mysql01
mysql版本:mysql-5.6.36
XtraBackup版本:2.4.12

2. 软件安装

2.1 安装mysql服务

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

2.2 安装XtraBackup工具

一、安装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)

3. 生产案例描述

3.1 备份策略

某公司使用mysql数据库做为生产环境,对数据库的备份策略为全量+增量,具体以下:
一、每周六00:00经过XtraBackup进行一次数据全量备份socket

0 0 * *  6   full.sh

二、周日-周五天天01:00经过XtraBackup进行数据增备ide

0 1 * * 0-5  inc.sh

三、开启binlog日志功能工具

3.2 故障描述

在星期二的下午2点,某开发人员不当心误删了一张表,大概10GB左右,须要对该表进行恢复操做。在删表到开始恢复的这段时间内,可能还在继续对其余表进行写入操做。测试

3.3 恢复思路

一、断开数据库的链接,以防止二次破坏
二、准备上周六全备,并--apply-log  redo-only
三、合并增量,周日、周1、--apply-log --redoonly 周二--apply-log
四、在测试库恢复以上数据,数据的目前状态应该周二凌晨1:00
五、须要恢复的数据状态是下午2点钟左右,从1点开始的binlog恢复到删除以前那个events的position。
六、导出删除的表,恢复到生产库,验证数据可用性、完整性。
七、启动应用链接数据库。

4. 实践过程

4.1 环境模拟

一、建立备份相关目录: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;

4.2 模拟数据写入过程

时间规划为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);

XtraBackup备份恢复模拟实践
二、周六数据全备及以后数据写入:

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;

XtraBackup备份恢复模拟实践
三、周日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;

XtraBackup备份恢复模拟实践
四、周一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;

XtraBackup备份恢复模拟实践
五、周二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;

XtraBackup备份恢复模拟实践

4.3 模拟删除test表

在下午两点的时候删除表test,在此以后还继续对其余表进行操做。

date -s 14:00:00
drop table test;
INSERT INTO SC(Sno,Cno,Grade) values(0006,1006,6);

XtraBackup备份恢复模拟实践

5. 数据恢复

5.1 数据恢复准备

想要恢复数据,须要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的文件及起始位置。
XtraBackup备份恢复模拟实践

三、确认DROP语句以前的binlog位置:

mysqlbinlog --start-position=3295 /opt/mysql/log/mysql-bin.000006 >> /tmp/tmp.sql
cat /tmp/tmp.sql

XtraBackup备份恢复模拟实践
四、恢复成sql文件:
经过上面两步,能够发现binlog的起始位置,以及DROP以前一个的结束位置。经过这两个position能够生成从01:00开始到14:00这一段时间内的数据库增量文件。

mysqlbinlog --start-position=3295 --stop-position=3782 /opt/mysql/log/mysql-bin.000006 > /tmp/recover.sql

5.2 数据恢复方案一

经过另一台测试库恢复。将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

XtraBackup备份恢复模拟实践
三、测试库恢复binlog数据:

source /tmp/recover.sql

XtraBackup备份恢复模拟实践
到此,已恢复到了删表前一个时间点的数据,这时咱们将test表导出并恢复到正式库便可。

mysqldump -uroot -p123456 test test > /tmp/test_test.sql
mysql -uroot -p123456 < /tmp/test_test.sql
删除表恢复到删除时间点过程结束!

5.3 数据恢复方案二

从XtraBackup抽取表文件恢复。相对于方案一来讲,不须要恢复所有数据库,也不须要再其余库上进行恢复,可是此种方式须要清楚建表的结构。
一、导出表:
导出表是在备份的prepare阶段进行的,所以,一旦彻底备份完成,就能够在prepare过程当中经过--export选项将某表导出了。
导出前:
XtraBackup备份恢复模拟实践
导出表命令:

innobackupex --apply-log --export /backup/xbackup/full/
此命令会为每一个innodb表的表空间建立一个以.exp结尾的文件,这些以.exp结尾的文件则能够用于导入至其它服务器。

导出后:能够看出多了表结构等两个文件
XtraBackup备份恢复模拟实践
二、建立相同结构的表并删除此表的表空间:

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;

XtraBackup备份恢复模拟实践
五、经过binlog恢复tests表01:00-14:00的增量数据
单表恢复只涉及到了test表,所以不须要其余表的数据,须要从recover.sql中过滤出test表

grep test /tmp/recover.sql > /tmp/test.sql
source /tmp/test.sql

XtraBackup备份恢复模拟实践

5.4 两种方案的比较

方案1

不须要知道原来的表结构,主库也只须要source sql文件,可是须要恢复所有数据库,而且须要在两台主机上传输数据,在数据量大的时候比较慢。

方案2

须要知晓表结构,相对来讲更简单快捷。

至此,XtraBackup备份及恢复实践完毕!!!

相关文章
相关标签/搜索