Xtrabackup工具介绍
Mysql备份的两种方式:
XtraBackup是Percona公司CTO Vadim参与开发的一款基于InnoDB的在线热备工具,具有开源、免费、支持在线热备、备份恢复速度快、占用磁盘空间小等特点,并且支持不同情况下的多种备份形式。
注意:
Percona XtraBackup 8.0不支持对 MySQL 8.0之前的版本、 Percona Server for MySQL 或 Percona XtraDB Cluster 中创建的数据库进行备份。由于 MySQL 8.0在数据字典、重做日志和撤销日志中引入的更改与以前的版本不兼容,Percona XtraBackup 8.0目前不可能同时支持8.0之前的版本。
备份出来的文件中,除了数据文件,还有以下额外的文件:
- backup-my.cnf:该文件不是 MySQL 参数文件的备份,只是记录了一些 Innodb 引擎的参数,会在 Prepare 阶段用到。
- xtrabackup_logfile:该文件用来保存拷贝的 redo log。
- xtrabackup_binlog_info:binlog 位点信息和 GTID 信息。使用该备份恢复后,需要从该 binlog 位点进行增量恢复。
- xtrabackup_checkpoints:该文件记录了备份类型和 LSN 信息。
- xtrabackup_info:该文件中,记录备份的详细信息。
- xtrabackup_tablespaces:记录备份集中表空间的信息
测试环境
Centos 7.9 连接外部网络
Mysql8.0.20
Xtrabackup 安装(源码安装)
- 下载xtarbackup压缩包
选择对应安装压缩包
- 解压,并自定义安装目录
Xftp 工具上传至mysql数据库服务器
tar -zxvf 解压安装包
自定义安装目录,并重命名
设置环境变量--编辑环境变量文件 /etc/profile
在最后一行添加
export PATH=$PATH:/usr/local/xtrabackup/bin
使环境变量生效
[root@xxx soft]# source /etc/profile
检查是否安装成功
- 下载解压缩工具并安装(用到压缩功能使用)
xtrabackup使用场景
Xtrabackup 备份恢复有三个阶段:
第一阶段 备份阶段,将物理文件拷贝到备份目录。
第二阶段 Prepare 阶段,应用 redo log 将数据文件恢复到备份结束时的一致性状态。
第三阶段 恢复阶段 就是将备份文件拷贝到 MySQL 数据目录下面。
备份
完全备份
测试数据准备,新建数据库full,创建表数据
普通备份
xtrabackup --backup -u root -H 127.0.0.1 -P3306 -p123456 --parallel=5 --target-dir=/tmp/backup/full/
显示Completed ok 备份成功
关键参数介绍:
–backup:发起全量备份。
-u, -H, -P, -p:连接 mysql 实例,用户名、主机 IP、端口、密码。
–target-dir:备份文件的存放路径。
–parallel:并发拷贝的线程数。
备份集:
流式备份
Percona XtraBackup 支持的流式传输模式,将备份以 xbstream 格式发送到 STDOUT,而不是将文件复制到备份目录
STDOUT: 是指将程序的 输出 结果显示到屏幕或其他设备上的过程。 当程序执行完成后,它会将结果 输出 到 标准输出 流中,然后显示在屏幕上供用户观察。
xtrabackup --backup -u root -H 127.0.0.1 -P3306 -p123456 --stream=xbstream --target-dir=/bak/full > /bak/full/backup.xbstream
显示Completed ok 备份成功
关键参数介绍:
--stream=xbstream 使用流式备份,采用xbstream流格式。
在 xtrabackup 2.4 版中支持 tar 和 xbstream 流格式,但 tar 格式不支持并行备份。
在 xtrabackup 8.0 中,仅支持 xbstream 流格式,不再支持 tar 格式。
备份集(大小与普通备份大小一致)
压缩备份
xtrabackup --backup -u root -H 127.0.0.1 -P3306 -p123456 --compress --parallel=5 --target-dir=/bak/full/backupyasuo_`date +"%F_%H_%M_%S"`
显示Completed ok 备份成功
关键参数介绍:
--compress 开启压缩
备份集
增量备份简介
xtrabackup 支持增量备份,这意味着它们只能复制自上次备份以来发生变化的数据(差异增量)。
增量备份实际上不会将数据文件与先前备份的数据文件进行比较。 因此,在部分备份后运行增量备份可能会导致数据不一致。
增量备份只需读取页面并将其 LSN 与上次备份的 LSN 进行比较。 但是,您仍然需要完整备份来恢复增量更改; 如果没有完整备份作为基础,增量备份就毫无用处。
增量背后开始和全量备份一样。xtrabackup 在备份目标目录中写入一个被称为xtrabackup_checkpoints的文件。这个文件包含一行显示to_lsn,在备份的最后是数据库的LSN
普通备份增量
第一次增量备份添加数据
第一次增量备份需要使用普通完全备份集(包含xtrabackup_checkpoints)
xtrabackup --backup -u root -H 127.0.0.1 -P3306 -p123456 --parallel=5 --target-dir=/tmp/backup/inc1 --incremental-basedir=/tmp/backup/full
主要参数:
–incremental-basedir:全量备份或上一次增量备份 xtrabackup_checkpoints 文件所在目录。
查看增量备份集
第二次增量备份添加数据
命令:
xtrabackup --backup -u root -H 127.0.0.1 -P3306 -p123456 --parallel=5 --target-dir=/tmp/backup/inc2 --incremental-basedir=/tmp/backup/inc1
查看增量备份集
差异备份(以第二次增量跳过第一次增量为例)
命令:
xtrabackup --backup -u root -H 127.0.0.1 -P3306 -p123456 --parallel=5 --target-dir=/tmp/backup/inc3 --incremental-basedir=/tmp/backup/full
查看增量备份集
备份集大小对比
流式备份增量
第一次增量备份添加数据
第一次增量备份需要使用普通完全备份集(包含xtrabackup_checkpoints)
流格式 à 普通备份集
[root@xxx ~]# mkdir -p /bak/full/xbstreambackup
[root@xxx ~]# xbstream -x --parallel=10 -C /bak/full/xbstreambackup < /bak/full/backup.xbstream
xbstream 命令重要参数
-x 表示解压,
–parallel 表示并行度,
-C 指定解压的目录,最后一级目录必须存在(先创建目录)
xtrabackup --backup -u root -H 127.0.0.1 -P3306 -p123456 --stream=xbstream --incremental-basedir=/bak/full/xbstreambackup --target-dir=./ > /bak/zengliang/inc1.xbstream
主要参数:
–incremental-basedir:全量备份或上一次增量备份 xtrabackup_checkpoints 文件所在目录。
查看增量备份集
第二次增量备份添加数据
第二次增量备份,需要第一次增量备份集(流式备份集à普通备份集)
[root@xxx zengliang]# xbstream -x -C inc1 < inc1.xbstream
参考转换备份集类型 。
命令:
xtrabackup --backup -u root -H 127.0.0.1 -P3306 -p123456 --stream=xbstream --incremental-basedir=/bak/zengliang/inc1 --target-dir=./ > /bak/zengliang/inc2.xbstream
查看增量备份集
恢复
完全恢复
恢复准备阶段
阶段简介
首先要进行 Prepare 阶段,在该阶段 Xtrabackup 会启动一个嵌入的 InnoDB 实例来进行 Crash Recovery。
数据文件在准备好之前不是时间点一致的,因为它们在程序运行时在不同的时间被复制,并且在发生这种情况时它们可能已被更改。
在准备操作期间,xtrabackup 会启动一种经过修改的嵌入式 InnoDB(链接 xtrabackup 的库)。这些修改对于禁用 InnoDB 标准安全检查是必要的
注意:
建议不要在准备备份时中断xtrabackup进程,因为它可能会导致数据文件损坏,并且备份将变得不可用。 如果准备过程中断,则不保证备份有效性
转换备份集类型
恢复前需要将所有类型备份集都转为普通备份集
流格式 à 普通备份集
[root@xxx ~]# mkdir -p /bak/full/xbstreambackup
[root@xxx ~]# xbstream -x --parallel=10 -C /bak/full/xbstreambackup < /bak/full/backup.xbstream
xbstream 命令重要参数
-x 表示解压,
–parallel 表示并行度,
-C 指定解压的目录,最后一级目录必须存在(先创建目录)
压缩备份 à 普通备份集
Xtrabackup 8.0 支持两种压缩算法 zstd(默认) 和 lz4 算法,Xtrabackup 5.7 仅支持 quicklz 算法。
其中 zstd 在解压缩时依赖 zstd 需要安装才能进行解压。quicklz 算法依赖 qpress 也需要安装后才能进行解压。
[root@xxx ~]# xtrabackup --decompress --parallel=5 --target-dir=/bak/full/backupyasuo_2024-01-31_14_48_26/
2024-01-31T15:59:46.984995+08:00 0 [Note] [MY-011825] [Xtrabackup] completed OK!
表示解压缩成功
需要注意:
解压过程中,同样可以指定 --parallel 参数,进行并行解压。
解压后,默认不会删除压缩文件。如果需要删除,可以指定 --remove-original 参数。
即便压缩文件没有被删除,当使用 --copy-back 将备份拷贝到数据目录时,默认也不会拷贝这些压缩文件。
--remove-original 执行后备份集
备份集准备命令
执行注意:
如果您打算将该备份作为进一步增量备份的基础,则应在准备备份时使用 --apply-log-only 选项,否则您将无法对其应用增量备份。
命令:
xtrabackup --prepare --use-memory=2G --target-dir=/bak/full/backup(备份集)
重要参数:
该实例的缓冲池的大小由 --use-memory 参数指定,默认为 100MB。如果有充足的内存,通过设置较大的 memory 可以减少 Prepare 阶段花费的时间。
准备工作执行后备份集
数据库准备操作
删除full 数据库验证恢复
- 1、关闭数据库
[root@xxx ~]# mysql -uroot -p123456
mysql> shutdown;
- 2、更改数据库数据目录名称(恢复成功后删除)
[root@xxx ~]# mv /data/mysql8_data/mysql/ /data/mysql8_data/mysqlbak
执行恢复命令
- 1、执行恢复操作
[root@xxx]# xtrabackup --defaults-file=/usr/local/etc/my.cnf --copy-back --parallel=10 --target-dir=/bak/full/backupyasuo
重要参数说明:
--parallel=10 表示并行数(根据实际情况设置)
--defaults-file 数据库配置文件
--copy-back 表示将备份数据文件拷贝到 MySQL 数据目录下。如果在存储空间不足的情况下,可以使用 --move-back 表示移动备份文件。
压缩文件没有被删除,当使用 --copy-back 将备份拷贝到数据目录时,默认也不会拷贝这些压缩文件。
- 2、授权数据库数据库目录
[root@xxx mysql8_data]# chown -R mysql:mysql /data/mysql8_data/mysql
- 3、启动数据库
[root@xxx ~]# mysqld_safe --defaults-file=/usr/local/etc/my.cnf &
数据验证:
增量恢复
恢复准备阶段(Prepare 阶段)
增量备份的 --prepare 步骤与完整备份不同。 在完整备份中,执行两种类型的操作来使数据库保持一致:针对数据文件从日志文件重放已提交的事务,以及回滚未提交的事务。 在准备增量备份时,您必须跳过未提交事务的回滚,因为备份时未提交的事务可能正在进行中,并且很可能会在下一次增量备份中提交。。你需要指定xtrabackup --apply-log-only 选项来阻止回滚阶段。
完全备份集执行准备:
[root@xxx ~]# xtrabackup --prepare --apply-log-only --target-dir=/bak/full/xbstreambackup/
第一次增量执行准备:
[root@xxx ~]# xtrabackup --prepare --apply-log-only --target-dir=/bak/full/xbstreambackup/ --incremental-dir=/bak/zengliang/inc1/
第二次增量执行准备:
[root@xxx ~]# xtrabackup --prepare --apply-log-only --target-dir=/bak/full/xbstreambackup/ --incremental-dir=/bak/zengliang/inc2/
数据库准备操作
删除full 和zengliang数据库验证恢复
- 关闭数据库
[root@xxx ~]# mysql -uroot -p123456
mysql> shutdown;
- 更改数据库数据目录名称(恢复成功后删除)
[root@xxx ~]# mv /data/mysql8_data/mysql/ /data/mysql8_data/mysqlbak
执行恢复命令
- 执行增量准备后恢复操作
需要再执行准备prepare 命令(不带--apply-log-only参数)。否则报错如下
[root@xxx ~]# xtrabackup --prepare --target-dir=/bak/full/xbstreambackup/
进入到备份目录执行。
[root@xxx ~]# cd /bak/full/xbstreambackup/
[root@xxx xbstreambackup]# xtrabackup --defaults-file=/usr/local/etc/my.cnf --copy-back --parallel=10 --target-dir=./
重要参数说明
--parallel=10 表示并行数(根据实际情况设置)
--defaults-file 数据库配置文件
--copy-back 表示将备份数据文件拷贝到 MySQL 数据目录下。如果在存储空间不足的情况下,可以使用 --move-back 表示移动备份文件。
- 2、授权数据库数据库目录
[root@xxx mysql8_data]# chown -R mysql:mysql /data/mysql8_data/mysql
- 3、启动数据库
[root@xxx ~]# mysqld_safe --defaults-file=/usr/local/etc/my.cnf &
第一次增量恢复验证数据恢复成功
第二次增量恢复验证数据恢复成功