三十一、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/*

恢复思路

  1. 停业务,挂维护页
  2. 查看计划任务crontab找到备份脚本
  3. 通过备份脚本找到备份路径
  4. 案例恢复为第一次全备加两次增量(full+inc1+inc2)
  5. 通过binlog找到inc2到故障时间点之间日志
  6. 恢复全备+增量+binlog
  7. 验证数据
  8. 起业务,撤维护页

恢复备份

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入门与提高实践》第九章

posted @ 2021-04-01 21:35  努力吧阿团  阅读(867)  评论(0编辑  收藏  举报