三十一、XBK备份
XBK备份简介
一款针对MySQL开发的开源免费物理备份工具,全称叫xtrabackup
适用于备份数据大于30G的情况(不绝对,适用于数据较大的情况)
原理相当于cp data目录下的数据文件
备份恢复过程
1、当执行xbk备份时会触发checkpoint(将内存脏页刷写到磁盘上),并记录当前LSN号。
2、不锁表copy所有InnoDB数据页及文件到备份路径下。
3、锁表copy MyISAM等非事务引擎的数据页及文件, 复制完成后解锁。
4、对比刚备份时记录的LSN跟备份完成后redo记录的LSN,模拟CSR过程使其保持一致完成恢复。
(假如10点备份,此时会将内存中的脏页刷写到磁盘并记录一个LSN,当10点30分完成备份后,XBK会通过备份过程中这段时间产生的redo日志,对比redo的LSN,模拟CSR过程使其两者的LSN保持一致完成恢复)
安装XBK
1、安装依赖包
$ wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
$ yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL libev
2、下载软件并安装
#这里有两个版本,我安装的是24-2.4.12版本
$ wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.12/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm
$ 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.12-1.el7.x86_64.rpm
使用XBK全备
1、使用XBK进行全备
#授权备份路径
$ mkdir -p /backup/xbk/full
$ chown -R mysql.mysql /backup
#这里注意要写--socket路径,innobackupex会默认在/var/lib/mysql/mysql.sock找sock文件
$ innobackupex --defaults-file=/etc/my.cnf --user=root --password=123 \
--no-timestamp --socket=/tmp/mysql.sock /backup/xbk/full
不加--no-timestamp会自动生成年月日时分秒的目录,对以后写备份脚本不是很方便,建议不加。
可以不加--user=root --password=123防止密码外泄,但是需要在配置文件中写入mysql的账号密码。
参考资料:mysql账号密码写入配置文件
2、利用全备进行恢复
#清空备份路径(谨慎,或者重新选择空的备份目录)
$ \rm -rf /backup/full/
#--apply-log参数模拟CSR过程
$ innobackupex --apply-log /backup/full/
#将备份的文件复制到/data目录
$ cp -a /backup/full/* /data/mysql/data/
$ chown -R mysql.mysql /data/mysql/data/*
$ /etc/init.d/mysqld start
使用XBK增量备份
1、模拟数据
create database full charset utf8mb4;
use full;
create table t1 (id int);
insert into t1 values(1),(2),(3);
commit;
2、假设周日进行全备
$ innobackupex --defaults-file=/etc/my.cnf --user=root --password=123 \
--no-timestamp --socket=/tmp/mysql.sock /backup/xbk/full
3、模拟周一的数据变化
create database inc1 charset utf8mb4;
use inc1;
create table t1 (id int);
insert into t1 values(1),(2),(3);
commit;
4、进行周一的增量备份
$ innobackupex --user=root --password=123 \
--no-timestamp --incremental \
--socket=/tmp/mysql.sock \
--incremental-basedir=/backup/xbk/full /backup/xbk/inc1
说明
--incremental:开启增量备份功能
--incremental-basedir=/backup/xbk/full:基于哪个备份进行增量,这里是基于全备的增量备份
/backup/xbk/inc1:增量备份的文件路径
5、检查全备的跟增量的LSN
#全备的LSN
$ cat /backup/xbk/full/xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 217478672
last_lsn = 217478681
compact = 0
recover_binlog_info = 0
#增量的LSN
$ cat /backup/xbk/inc1/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 217478672 #为全备的last_lsn-9
to_lsn = 217484653
last_lsn = 217484662
compact = 0
recover_binlog_info = 0
6、模拟周二数据变化
create database inc2 charset utf8mb4;
use inc2;
create table t1 (id int);
insert into t1 values(1),(2),(3);
commit;
7、周二的增量
$ innobackupex --user=root --password=123 \
--no-timestamp --incremental \
--socket=/tmp/mysql.sock \
--incremental-basedir=/backup/xbk/inc1 /backup/xbk/inc2
8、检查全备、周一、周二的lsn
#全备的LSN
$ cat /backup/xbk/full/xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 217478672
last_lsn = 217478681
compact = 0
recover_binlog_info = 0
#周一增量LSN
$ cat /backup/xbk/inc1/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 217478672 #为全备的last_lsn-9
to_lsn = 217484653
last_lsn = 217484662
compact = 0
recover_binlog_info = 0
#周二增量LSN
$ cat /backup/xbk/inc2/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 217484653 #是上一次的增备last_lsn-9
to_lsn = 217491320
last_lsn = 217491329 #217491329-9=217491320 表示备份过程中没有数据写入
compact = 0
recover_binlog_info = 0
9、周三的数据变化
create database inc3 charset utf8mb4;
use inc3;
create table t1 (id int);
insert into t1 values(1),(2),(3);
commit;
10、模拟上午10点数据库崩溃
$ pkill mysqld
$ \rm -rf /data/mysql/data/*
恢复思路
- 停业务,挂维护页
- 查看计划任务crontab找到备份脚本
- 通过备份脚本找到备份路径
- 案例恢复为第一次全备加两次增量(full+inc1+inc2)
- 通过binlog找到inc2到故障时间点之间日志
- 恢复全备+增量+binlog
- 验证数据
- 起业务,撤维护页
恢复备份
1、需要将增量合并到全备,再使用全备进行恢复数据。
#整理全备
$ innobackupex --apply-log --redo-only /backup/xbk/full
#合并inc1到全备
$ innobackupex --apply-log --redo-only --incremental-dir=/backup/xbk/inc1 /backup/xbk/full
#合并inc2到全备,注意这是最后一次增量合并不加--redo-only参数
$ innobackupex --apply-log --incremental-dir=/backup/xbk/inc2 /backup/xbk/full
#最后一次整理全备
$ innobackupex --apply-log /backup/xbk/full
说明
--apply-log
表示做redo前滚跟undo回滚操作
--redo-only
表示只做redo前滚操作跳过回滚操作,整理全备跟增量合并时用,注意最后一次增量合并时不加该参数。
2、截取binlog恢复周三的数据
#查看inc2的binlog起点,表示增量备份到1-9
$ cat /backup/xbk/inc2/xtrabackup_binlog_info
mysql-bin.000011 1557 65c12fe4-613e-11eb-9271-000c29a2912e:1-9
#查看binlog日志,这里模拟的是rm删库,所以直接恢复到最后,最后的GTID是12
$ mysqlbinlog /data/binlog/mysql-bin.000011 | grep 'SET'
...
SET @@SESSION.GTID_NEXT= '65c12fe4-613e-11eb-9271-000c29a2912e:12'/*!*/;
#截取binlog日志
$ mysqlbinlog --skip-gtids --include-gtids='65c12fe4-613e-11eb-9271-000c29a2912e:10-12' /data/binlog/mysql-bin.000011 >/backup/binlog.sql
3、恢复备份数据
#复制数据文件到MySQL的data目录
$ cp -a /backup/xbk/full/* /usr/local/mysql5.7/data/
$ chown -R mysql.mysql /usr/local/mysql5.7/data/
#登录mysql,恢复binlog周三数据
mysql> set sql_log_bin=0;
mysql> source /backup/binlog.sql
mysql> set sql_log_bin=1;
备份文件介绍
xtrabackup_binlog_info文件(重要)
xbk也需要使用binlog进行恢复。
记录备份时刻的二进制日志信息. 可以作为binlog截取的起点。
记录的是当时备份时刻的position号,以及GTID号。
$ cat xtrabackup_binlog_info
mysql-bin.000011 356 65c12fe4-613e-11eb-9271-000c29a2912e:1-3
xtrabackup_checkpoints文件(重要)
$ cat xtrabackup_checkpoints
#备份的类型为全备,full-prepared表示做完了redo前滚跟undo回滚,即做完CSR了
backup_type = full-backuped
#备份中包含的LSN号的起点,从0开始表示全备,从上次备份的结束位置开始表示为增备
from_lsn = 0
#checkpoint时的LSN号
to_lsn = 217470033
#备份结束时的LSN,last_lsn-9为真实last_lsn位置
last_lsn = 217470042
compact = 0
recover_binlog_info = 0
注意下次增量备份的起始位置为这次备份结束位置减9,相当于xbk会预留9个位置,当last_lsn-9=to_lsn时,表示备份过程中没有新数据录入;
如上述所示,last_lsn = 217470042,那么下次增量备份起始位置to_lsn = 217470033。
xtrabackup_info
所有的备份信息
xtrabackup_logfile
备份过程中产生的redo日志
学习来自:老男孩深标DBA课程 第七章 备份恢复-2,《MySQL入门与提高实践》第九章