Xtrabackup备份原理:
物理备份,不锁表,那么怎么保证现有的数据(备份过程中有尚未提交或已经提交但未同步事务)与复制出来的数据一致呢?
我们知道MySQL修改操作都会先记录在ib_logfile日志文件,再同步到磁盘,这个文件并重复使用。在复制期间会开启一个线程用来监控ib_logfile日志文件,如果有修改就从上次记录的日志序列号(checkpoins)开始复制新增内容到Logfile文件。复制结束后,把logfile事务日志进行回滚,把未完成的事务同步到ibdata1和ibd里面,来保证数据一致性。这与Mysql崩溃后恢复基本操作一样。
测试前准备:
1 、CentOS6.8安装mysql
[root@Paul ~]# yum install -y mysql-server mysql-client
2、在percona官网下载percona-xtrabackup,并安装
[root@Paul ~]# rpm -ivh percona-xtrabackup-2.0.0-417.rhel6.x86_64.rpm
3、用RPM包安装mysql默认sql_log_bin是关闭,我们需要开启二进制日志
4、在mysql中创建好数据库和表,并插入好数据以及备份目录。
测试用xtrabackup做完全备份和还原
1、完全备份
[root@Paul backup]# innobackupex --user=root --password=123456 /root/backup
[root@Paul backup]# ls /root/backup/2018-04-23_13-45-50/
backup-my.cnf ibdata1 jiaowu mysql test xtrabackup_binary xtrabackup_binlog_info xtrabackup_checkpoints xtrabackup_logfile
备份后生成文件解释:
backup-my.cnf --------------备份命令用到的配置选项信息
xtrabackup_binary ------备份中用到的xtrabackup的可执行文件
xtrabackup_binlog_info ---- mysql服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置
xtrabackup_checkpoints -----备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息
2、准备(prepare)一个完全备份
一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可会
含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍
处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事
务至数据文件也使得数据文件处于一致性状态。
[root@Paul ~]# innobackupex --apply-log /root/backup/2018-04-23_13-45-50/
3、使用完全备份恢复数据
[root@Paul backup]# rm -rf /var/lib/mysql/* 删掉数据库所有文件,模拟数据库宕机
[root@Paul backup]# innobackupex --copy-back /root/backup/2018-04-23_13-45-50/
[root@Paul backup]# chown -R mysql.mysql /var/lib/mysql
测试用xtrabackup做一次完全备份,一次差异备份,一次增量备份,然后mysql服务宕
机,通过事务日志做及时点还原。
做完全备份
[root@Paul backup]# innobackupex --user=root --password=123456 /root/backup
[root@Paul backup]# innobackupex --apply-log /root/backup/2018-04-23_14-22-11/
在tutors表中插入数据做增量:
mysql> update tutors set Tname='apple' where TID=1;
做差异备份,以/root/backup/2018-04-23_14-22-11/为基表
[root@Paul backup]# innobackupex --user=root --password=123456 --incremental /root/backup --incremental-basedir=/root/backup/2018-04-23_14-22-11/
再往tutors表中插入数据:
mysql> update tutors set Tname='banana' where TID=2;
做增量备份,以/root/backup/2018-04-23_14-41-15/
[root@Paul backup]# innobackupex --user=root --password=123456 --incremental /root/backup/ --incremental-basedir=/root/backup/2018-04-23_14-41-15/
增量备份的恢复
增量备份的恢复需要有3个步骤
- 恢复完全备份
- 恢复增量备份到完全备份(开始恢复的增量备份要添加--redo-only参数,到最后一次增量备份要去掉--redo-only)
- 最整理完全备份做恢复,回滚未提交数据
#准备一个全备#
root@Paul backup]# innobackupex --apply-log --redo-only /root/backup/2018-04-23_14-22-11/
#将差异备份应用到全备#
[root@Paul backup]# innobackupex --apply-log --redo-only /root/backup/2018-04-23_14-22-11/ --incremental-dir=/root/backup/2018-04-23_14-41-15/
#将增量备份应用到全备#
[root@Paul backup]# innobackupex --apply-log --redo-only /root/backup/2018-04-23_14-22-11 --incremental-dir=/root/backup/2018-04-23_14-48-22/
#把所有合在一起的完全备份整体进行一次apply操作,回滚未提交的数据#
[root@Paul backup]# innobackupex --apply-log /root/backup/2018-04-23_14-22-11
#最后做一次增量更新#
mysql> update tutors set Tname='orange' where TID=3;
模拟测试:
记录最后一次增量更新二进制日志位置
[root@Paul 2018-04-23_14-48-22]# more xtrabackup_binlog_info
mysql-bin.000001 517
备份二进制文件
[root@Paul ~]# mysqlbinlog -j 517 /var/lib/mysql/mysql-bin.000001 > /root/backup/mysql-bin.sql
[root@Paul ~]# cp /root/backup/mysql-bin.sql /tmp/
#删掉/var/lib/mysql/中所有文件#
[root@Paul ~]# rm -rf /var/lib/mysql/*
全备恢复
[root@Paul ~]# innobackupex --copy-back /root/backup/2018-04-23_14-22-11
root@Paul ~]# chown -R mysql.mysql /var/lib/mysql
[root@Paul ~]# service mysqld stop
[root@Paul ~]# service mysqld start
二进制及时点还原
mysql> set sql_log_bin=0;
mysql> SOURCE /tmp/mysql-bin.sql
mysql> set sql_log_bin=1