XtraBackup是Percona公司开源的一款MySQL InnoDB(包括XtraDB,MyISAM)数据库备份工具,基于InnoDB的崩溃恢复功能,由于支持不锁表的在线物理热备而被广泛应用于生产环境。
XBK备份恢复原理:
XtraBackup备份执行的瞬间,会立即触发checkpoint机制,将已提交事务的脏页数据从内存刷新到磁盘中,并记录此时日志序列号(LSN号),此时触发备份,然后复制磁盘中的数据页以及数据文件到备份路径,在备份过程中可能会有新的数据变化、新的事物提交,XBK还会将备份过程中产生的Redo log和Undo log一并备份,并且提取Redo Log中最后的LSN号,也就是checkpoint机制刷新到磁盘时记录的LSN之后,产生的Redo log和Undo log。
XtraBackup备份时会对非InnoDB引擎的表进行锁表,实现温备,对InnoDB引擎的表不进行锁表,直接复制InnoDB数据页及数据文件到备份路径中。
XBK的恢复过程就是模拟InnoDB的自动故障恢复(CSR)的过程,将Redo Log与Undo log进行应用,对比Redo log中最后的LSN号和备份前记录时的LSN号,既要保证备份数据的恢复,又要保证备份时产生的新数据的恢复,备份时产生的新数据就是从备份时的LSN号到Redo中的LSN之间的数据,这些数据如果是提交的那么就用备份的Redo文件恢复,如果是未提交的数据则使用备份的Undo文件进行恢复,恢复就是将备份的数据文件cp还原到原数据目录下。
XBK热备理念就是将备份触发之前的数据都备份,对于备份过程中的新数据也会备份下来,备份过程中的新数据就是Redo Log和Undo Log了,XBK在备份触发的时候会通过CKPT机制刷新脏页数据到磁盘,此时会记录LSN号,而Redo Log中也有对应的LSN号,当我们要恢复数据时,假如说备份时的LSN号是101,备份完后Redo Log中的LSN号是110,那么102-110之间的LSN号对应的事务就是备份过程中产生的新数据,对于新数据已经提交的数据用备份的Redo文件恢复,未提交的数据用Undo文件进行回滚恢复,保证数据的一致性。
XBK备份需要依赖MySQL的主配置文件/etc/my.cnf,如果配置文件不在这个路径需要单独指定。
1.安装依赖的软件
[root@mysql ~]# yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL
2.安装xbk
[root@mysql ~]# 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
[root@mysql ~]# yum -y install percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm
XBK备份语法格式:innobackupex [--defaults-file=#] [OPTIONS] 备份路径
参数:
--defaults-file
:指定MySQL配置文件的路径。--apply-log
:整理备份,将redo log进行重做,将已提交的事务写到备份的数据文件,对未提交的事务使用undo回滚掉,模拟了CSR的过程,这个参数就是将备份过程中产生的新数据一并写入到备份文件中,保证数据的一致性。--redo-only
:这个参数需要配合--apply-log
这个参数一起使用,表示在整理备份数据时只执行redo前滚操作,不执行undo回滚操作。--copy-back
:恢复数据。-S
:指定MySQL socket文件。--stream=tar
:开启流备份,备份成tar包。--user-memory=256M
:为xbk分配256M的内存进行备份。--parallel=8
:并发处理数,一般都是CPU核数的一半。XBK备份前我们需要进行一些配置,否则备份会失败。
首先要确保MySQL主配置文件在/etc/my.cnf里,如果不在这个路径,备份时需要指定配置文件的路径,如以下所示:通过--defaults-file
参数指定配置文件的路径。
[root@mysql ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 /data/dbbackup/
另外还需要在MySQL的主配置文件中指定客户端使用的MySQL socket文件,否则XBK备份时会报错,提示找不到socket文件。
[root@mysql ~]# vim /etc/my.cnf
[client]
socket=/tmp/mysql.sock
如果不想在主配置文件中指定client的socket文件,那么可以在备份命令中通过-S
参数指定socket文件的路径。
[root@mysql ~]# innobackupex --user=root --password=123456 -S /tmp/mysql.sock /data/dbbackup/
innobackupex --user=数据库账号 --password=数据库密码 --defaults-file=配置文件路径 -S socket文件路径 备份路径
[root@mysql ~]# innobackupex --user=root --password=123456 /data/dbbackup/
当看到 completed OK! 一行就表示备份成功了。
XBK备份结束后,会在指定的备份路径生成一个当前时间命名的目录,在这个目录中存放了备份数据库的数据文件。
XBK备份出来的就是数据库的数据文件,可以和数据库数据路径的文件进行对比,几乎就是完完全全的cp过来的,除了数据库的备份外,还产生了四个XBK生成的文件。
使用XBK备份完成后,会生产四个关于XBK的文件,用于记录一些配置信息。
-rw-r----- 1 root root 63 7月 3 10:58 xtrabackup_binlog_info
-rw-r----- 1 root root 113 7月 3 10:58 xtrabackup_checkpoints
-rw-r----- 1 root root 542 7月 3 10:58 xtrabackup_info
-rw-r----- 1 root root 2560 7月 3 10:58 xtrabackup_logfile
1)xtrabackup_binlog_info
该文件会记录备份时刻Binlog的状态信息,包括备份时最近的GTID号以及事件的Position标识位号,可以用来截取Binlog日志。
[root@mysql 2022-07-03_10-58-17]# cat xtrabackup_binlog_info
mysql-bin.000013 344 e0a2c0cc-f835-11ec-8a3c-005056b791aa:1-79
334就是事件的Position号。
2)xtrabackup_checkpoints
记录XBK备份触发时的checkpoints机制信息。
[root@mysql 2022-07-03_10-58-17]# cat xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0 #上次所到达的LSN号(对于全备就是从0开始,对于增量有别的显示方法)
to_lsn = 6136767 #备份开始时间(ckpt)点数据页的LSN号
last_lsn = 6136776 #备份结束后,redo日志最终的LSN
compact = 0
recover_binlog_info = 0
这个文件非常重要。
(1)备份时刻,立即将已经commit过的,内存中的数据页刷新到磁盘(CKPT).开始备份数据,数据文件的LSN会停留在to_lsn位置。
(2)备份时刻有可能会有其他的数据写入,已备走的数据文件就不会再发生变化了。
(3)在备份过程中,备份软件会一直监控着redo的undo,如果一旦有变化会将日志也一并备走,并记录LSN到last_lsn。
从to_lsn ----> last_lsn 就是备份过程中产生的数据变化.
3)xtrabackup_info
XBK备份时的一些参数信息。
4)xtrabackup_logfile
日志文件。
将db_1、db_2、db_3的数据文件删除,然后从XBK备份中恢复数据。
[root@mysql ~]# rm -rf /data/mysql/db_1/
[root@mysql ~]# rm -rf /data/mysql/db_2/
[root@mysql ~]# rm -rf /data/mysql/db_3/
1)对redo log进行重做
将redo log进行重做,将已提交的事务写到备份的数据文件,对未提交的事务使用undo回滚掉,模拟了CSR的过程,这一步就是将备份过程中产生的新数据一并写入到备份文件中,保证数据的一致性。
[root@mysql ~]# innobackupex --apply-log /data/dbbackup/2022-07-03_10-58-17/
2)恢复数据
恢复数据非常简单,只需要通过cp命令将数据文件拷贝到数据库目录即可。
[root@mysql ~]# \cp -ra /data/dbbackup/2022-07-03_10-58-17/* /data/mysql/
[root@mysql ~]# chown -R mysql. /data/mysql/
[root@mysql ~]# systemctl restart mysqld
在前面看到XBK备份出来的目录是以时间戳定义的,精确到了时分秒,其实也不太友好。
我们可以通过--no-timestamp
参数跳过XBK默认的备份文件名,我们自定义XBK的备份文件名称。
[root@mysql ~]# innobackupex --user=root --password=123456 --no-timestamp /data/dbbackup/all_bak_`date +%F`