第87讲:XtraBackup备份工具的核心技术要点及全库备份、恢复案例

文章目录

1.XtraBackup备份工具的简介

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,如果配置文件不在这个路径需要单独指定。

2.XBK备份工具的安装

sh 复制代码
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	

3.XBK备份工具的使用语法

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核数的一半。

4.XBK备份前的准备

XBK备份前我们需要进行一些配置,否则备份会失败。

首先要确保MySQL主配置文件在/etc/my.cnf里,如果不在这个路径,备份时需要指定配置文件的路径,如以下所示:通过--defaults-file参数指定配置文件的路径。

sh 复制代码
[root@mysql ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456  /data/dbbackup/

另外还需要在MySQL的主配置文件中指定客户端使用的MySQL socket文件,否则XBK备份时会报错,提示找不到socket文件。

sh 复制代码
[root@mysql ~]# vim /etc/my.cnf
[client]
socket=/tmp/mysql.sock

如果不想在主配置文件中指定client的socket文件,那么可以在备份命令中通过-S参数指定socket文件的路径。

sh 复制代码
[root@mysql ~]# innobackupex --user=root --password=123456 -S /tmp/mysql.sock /data/dbbackup/

5.使用XBK对全库进行备份

5.1.XBK备份全库数据的语法格式

sh 复制代码
innobackupex --user=数据库账号 --password=数据库密码 --defaults-file=配置文件路径 -S socket文件路径 备份路径

5.2.使用XBK进行全库备份

sh 复制代码
[root@mysql ~]# innobackupex --user=root --password=123456 /data/dbbackup/

当看到 completed OK! 一行就表示备份成功了。

5.3.查看XBK备份的数据文件

XBK备份结束后,会在指定的备份路径生成一个当前时间命名的目录,在这个目录中存放了备份数据库的数据文件。

XBK备份出来的就是数据库的数据文件,可以和数据库数据路径的文件进行对比,几乎就是完完全全的cp过来的,除了数据库的备份外,还产生了四个XBK生成的文件。

5.4.备份过程中生产的XBK文件

使用XBK备份完成后,会生产四个关于XBK的文件,用于记录一些配置信息。

sh 复制代码
-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日志。

sh 复制代码
[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机制信息。

sh 复制代码
[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

日志文件。

6.模拟故障案例并使用XBK恢复备份的数据

6.1.模拟故障导致数据库损坏

将db_1、db_2、db_3的数据文件删除,然后从XBK备份中恢复数据。

sh 复制代码
[root@mysql ~]# rm -rf /data/mysql/db_1/
[root@mysql ~]# rm -rf /data/mysql/db_2/
[root@mysql ~]# rm -rf /data/mysql/db_3/

6.2.从XBK备份中恢复数据

1)对redo log进行重做

将redo log进行重做,将已提交的事务写到备份的数据文件,对未提交的事务使用undo回滚掉,模拟了CSR的过程,这一步就是将备份过程中产生的新数据一并写入到备份文件中,保证数据的一致性。

sh 复制代码
[root@mysql ~]# innobackupex --apply-log /data/dbbackup/2022-07-03_10-58-17/

2)恢复数据

恢复数据非常简单,只需要通过cp命令将数据文件拷贝到数据库目录即可。

sh 复制代码
[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

7.自主定义XBK备份文件的名称

在前面看到XBK备份出来的目录是以时间戳定义的,精确到了时分秒,其实也不太友好。

我们可以通过--no-timestamp参数跳过XBK默认的备份文件名,我们自定义XBK的备份文件名称。

sh 复制代码
[root@mysql ~]# innobackupex --user=root --password=123456  --no-timestamp /data/dbbackup/all_bak_`date +%F`
相关推荐
sun00770037 分钟前
ubuntu dpkg 删除安装包
运维·服务器·ubuntu
mqiqe1 小时前
Python MySQL通过Binlog 获取变更记录 恢复数据
开发语言·python·mysql
工业甲酰苯胺1 小时前
MySQL 主从复制之多线程复制
android·mysql·adb
BestandW1shEs1 小时前
谈谈Mysql的常见基础问题
数据库·mysql
重生之Java开发工程师1 小时前
MySQL中的CAST类型转换函数
数据库·sql·mysql
教练、我想打篮球1 小时前
66 mysql 的 表自增长锁
数据库·mysql
Ljw...1 小时前
表的操作(MySQL)
数据库·mysql·表的操作
哥谭居民00011 小时前
MySQL的权限管理机制--授权表
数据库