在 MySQL 日常运维中,备份是一个必不可少的环节,最常用的一般则是 Percona XtraBackup 工具。
作者:徐文梁,爱可生 DBA 成员,公众号[DBA修行之路]主理人。一个执着于技术的数据库工程师,主要负责数据库日常运维工作。擅长 MySQL,Redis 等数据库。喜欢垂钓,看风景,结交新朋友,看书,技术总结。
爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
本文约 3000 字,预计阅读需要 8 分钟。
问题背景
在 MySQL 日常运维中,备份是一个必不可少的环节,最常用的一般则是 Percona XtraBackup 工具。
在使用 Percona XtraBackup 工具对 MySQL 数据库备份恢复时,我们通常会考虑以下因素:
- 备份恢复数据所需要的时间。
- 备份期间对主库服务器负载的影响
- 备份集文件的大小。
分别对从这三个点进行展开描述:
1. 备份恢复数据所需要的时间
相同数据量情况下,通常我们希望 备份恢复所需要的时长越短越好,为什么这么说呢?
一方面,对于日常备份,一般会选择业务低峰期进行,如果备份占用的时长过长,可能会影响正常业务;另一方面,如果没有历史可用备份集,需要紧急临时备份进行数据恢复时候,这时候肯定是希望能够进行尽快的能够恢复,毕竟如果是重要业务,可能耽搁越久,每分每秒都给企业带来巨大损失;另外,如果 Redo 日志设置不合理,可能好不容易备份成功了,在恢复的时候发现 Redo 日志已经被覆盖,此时内心估计也会很郁闷吧。
2. 备份期间对主库服务器负载的影响
备份的本质是为了应对数据库数据误操作或者数据损坏等突发情况。
如果因为备份导致主服务器负载高,进而诱发数据库服务出现异常,那就得不偿失了。因为数据库备份期间会涉及加锁操作和写文件操作,因此是有可能阻塞业务的,并占用一部分磁盘 IO。
3. 备份集文件的大小
在金融行业,对备份集保留时间有严格的要求。
对于数据量越大的实例,其备份集自然也会越大。长期以往积累的备份集文件会需要很多额外的空间进行存储,例如:保留一个月的备份集,每份备份集大小为 200G,仅仅一个实例来说已经会占用不小的硬盘空间,而大企业往往会有成千上万个实例。如果单份备份集能从 200G 降到 150G 或者更小,总体上那也会节省很多空间,也能为企业节省成本支出。
对于第 2 点,可以通过设置
--kill-long-queries-timeout
,--ftwrl-wait-timeout
,--ftwrl-wait-threshold
,--use-memory
,--throttle
等参数设置对长查询,内存,IO 方面进行合理的限制,或者选择对从实例进行备份(如果主从不同步,则备份为无效备份,可以对主从同步进行监控,同步正常情况下在从库进行备份)。
本篇仅考虑备份时间和备份集文件大小方面。 结合实践,从以下三个维度前后的备份工具区别进行展开:
- 本地备份
- 跨机器远程备份
- Percona XtraBackup 8.0
本地测试环境
从官网下载对应的二进制包,对于 Percona XtraBackup 工具,如果缺少部分依赖包可能导致无法正常备份。建议从官网下载地址 进行对应下载。另外,不同版本的 Percona XtraBackup 和 MySQL 可能存在兼容性,以官网信息为准。
测试流程
在 Percona XtraBackup 8.0 之前,Percona XtraBackup 工具中,xtrabackup
是备份的主程序,在 Percona XtraBackup 8.0 之前,除了 xtrabackup
文件,还有 innobackupex
文件,不过它只是 xtrabackup
的一个软链。
[root@localhost bin]# cd /root/backup/percona-xtrabackup-2.4.26-Linux-x86_64.glibc2.12/bin/
[root@localhost bin]# ll
lrwxrwxrwx 1 root root 10 May 3 2022 innobackupex -> xtrabackup
-rwxr-xr-x 1 root root 9963231 May 3 2022 xbcloud
-rwxr-xr-x 1 root root 3020 May 3 2022 xbcloud_osenv
-rwxr-xr-x 1 root root 5158940 May 3 2022 xbcrypt
-rwxr-xr-x 1 root root 5229968 May 3 2022 xbstream
-rwxr-xr-x 1 root root 200906741 May 3 2022 xtrabackup
Percona XtraBackup 工具支持支持流备份,将备份数据以数据流的方式输出,使用 --stream
选项可以实现流备份;xtrabackup
支持 tar 格式的流备份和 xbstream 格式的流备份两种流备份。以下详细展开测试。
–stream=tar 场景
备份备份集到本地,备份时不压缩文件,详细操作如下:
#备份命令
[root@localhost backup]# time /root/backup/percona-xtrabackup-2.4.26-Linux-x86_64.glibc2.12/bin/innobackupex --defaults-file=/opt/mysql/etc/3310/my.cnf --host=localhost --port=3310 --user=root --password='xxx' --socket=/opt/mysql/data/3310/mysqld.sock --stream=tar /data >/data/backup/data20240714.tar
......................
240714 16:55:47 [00] ...done
xtrabackup: Transaction log of lsn (105748687622) to (105748687631) was copied.
240714 16:55:47 completed OK!
real 0m22.780s
user 0m6.936s
sys 0m5.545s
[root@localhost backup]# ll
-rw------- 1 root root 11731265024 Jul 14 16:55 data20240714.tar
[root@localhost backup]# du -sh *
11G data20240714.tar
#解压备份集文件
[root@localhost backup]# time tar -ixvf /data/backup/data20240714.tar -C /data/restore/
ibdata1
..............
xtrabackup_logfile
xtrabackup_checkpoints
real 0m11.703s
user 0m0.728s
sys 0m8.579s
[root@localhost data]# du -sh /data/restore/
11G /data/restore/
[root@localhost data]# du -s *
11456324 backup
11456820 restore
#传输文件时间
[root@localhost backup]# time scp data20240714.tar root@xxx:/data/backup/
..............
data20240714.tar 100% 11GB 109.7MB/s 01:41
real 1m43.597s
user 1m27.345s
sys 0m18.828s
备份备份集到本地,备份时压缩文件,详细操作如下:
#备份命令
[root@localhost data]# time /root/backup/percona-xtrabackup-2.4.26-Linux-x86_64.glibc2.12/bin/innobackupex --defaults-file=/opt/mysql/etc/3310/my.cnf --host=localhost --port=3310 --user=root --password='xxx' --socket=/opt/mysql/data/3310/mysqld.sock --stream=tar /data |gzip>/data/backup/data20240714.tar
................
xtrabackup: Transaction log of lsn (105748687622) to (105748687631) was copied.
240714 17:14:19 completed OK!
real 6m26.829s
user 6m16.903s
sys 0m10.083s
[root@localhost backup]# ll
total 2912896
-rw------- 1 root root 2982803091 Jul 14 17:14 data20240714.tar
[root@localhost backup]# du -sh *
2.8G data20240714.tar
[root@localhost backup]#
#传输文件时间
[root@localhost backup]# time scp data20240714.tar root@xxx:/data/backup/
..........
data20240714.tar 100% 2845MB 114.5MB/s 00:24
real 0m27.221s
user 0m22.030s
sys 0m4.618s
#解压备份集文件
[root@localhost backup]# time tar -ixvf /data/backup/data20240714.tar -C /data/restore/
ibdata1
..............
xtrabackup_checkpoints
real 1m4.640s
user 1m1.330s
sys 0m12.229s
[root@localhost data]# du -s *
2912896 backup
11456820 restore
[root@localhost data]# du -sh /data/restore/
11G /data/restore/
跨机备份,备份时不压缩文件,详细操作如下:
#备份命令
[root@localhost restore]# time /root/backup/percona-xtrabackup-2.4.26-Linux-x86_64.glibc2.12/bin/innobackupex --defaults-file=/opt/mysql/etc/3310/my.cnf --host=localhost --port=3310 --user=root --password='xxx' --socket=/opt/mysql/data/3310/mysqld.sock --stream=tar /data |sshpass -p 'xxx' ssh root@xxx "cat - > /data/backup/data20240714.tar"
....................
xtrabackup: Transaction log of lsn (105748687622) to (105748687631) was copied.
240714 17:54:17 completed OK!
real 1m49.795s
user 1m33.670s
sys 0m15.401s
跨机备份,备份时压缩文件,详细操作如下:
#备份命令
[root@localhost restore]# time /root/backup/percona-xtrabackup-2.4.26-Linux-x86_64.glibc2.12/bin/innobackupex --defaults-file=/opt/mysql/etc/3310/my.cnf --host=localhost --port=3310 --user=root --password='xxx' --socket=/opt/mysql/data/3310/mysqld.sock --stream=tar /data |sshpass -p 'xxx' ssh root@xxx "gzip > /data/backup/data20240714.tar"
......................................
xtrabackup: Transaction log of lsn (105748687622) to (105748687631) was copied.
240714 17:45:33 completed OK!
real 6m30.774s
user 1m38.102s
sys 0m20.994s
使用
--stream=tar
模式时,需要注意如下:
不支持 --compress 选项,会报错如下:
xtrabackup: error: compressed and encrypted backups are incompatible with the
'tar' streaming format. Use --stream=xbstream instead.
设置 --parallel 参数不生效,警告如下:
xtrabackup: warning: the --parallel option does not have any effect when streaming in the 'tar' format. You can use the 'xbstream' format instead.
–stream=xbstream 场景
本地备份,备份时压缩文件,详细操作如下:
#备份命令:
[root@localhost backup]# time /root/backup/percona-xtrabackup-2.4.26-Linux-x86_64.glibc2.12/bin/innobackupex --defaults-file=/opt/mysql/etc/3310/my.cnf --host=localhost --port=3310 --user=root --password='xxx' --socket=/opt/mysql/data/3310/mysqld.sock --stream=xbstream --parallel=8 --compress --compress-threads=8 /data/ >/data/backup/data20240714.xbstream
............
xtrabackup: Transaction log of lsn (105748687622) to (105748687631) was copied.
240714 18:04:13 completed OK!
real 0m22.789s
user 0m39.050s
sys 0m3.600s
[root@localhost backup]# ll
-rw------- 1 root root 4033892821 Jul 14 18:04 data20240714.xbstream
[root@localhost backup]# du -sh *
3.8G data20240714.xbstream
[root@localhost backup]# time scp data20240714.xbstream root@xxx:/data/backup/
.................
data20240714.xbstream 100% 3847MB 110.4MB/s 00:34
real 0m37.006s
user 0m30.011s
sys 0m6.624s
#释放流文件
[root@localhost backup]# time /data/urman-agent/bin/xbstream -x -C /data/restore/ < /data/backup/data20240714.xbstream
real 0m9.532s
user 0m2.971s
sys 0m2.779s
#解压备份集文件
[root@localhost backup]# time /root/backup/percona-xtrabackup-2.4.26-Linux-x86_64.glibc2.12/bin/innobackupex --decompress --remove-original /data/restore
...............
240714 18:08:03 [01] removing ./xtrabackup_info.qp
240714 18:08:03 completed OK!
real 0m21.597s
user 0m21.734s
sys 0m9.274s
跨机备份,备份时压缩文件,不释放流文件:详细操作如下:
#备份命令:
[root@localhost restore]# time /root/backup/percona-xtrabackup-2.4.26-Linux-x86_64.glibc2.12/bin/innobackupex --defaults-file=/opt/mysql/etc/3310/my.cnf --host=localhost --port=3310 --user=root --password='xxx' --socket=/opt/mysql/data/3310/mysqld.sock --stream=xbstream --parallel=8 --compress --compress-threads=8 /data/ | sshpass -p 'xxx' ssh root@xxx "cat - >/data/backup/data20240714.xbstream"
................
xtrabackup: Transaction log of lsn (105748687622) to (105748687631) was copied.
240714 18:33:07 completed OK!
real 0m54.797s
user 1m8.910s
sys 0m7.087s
跨机备份,备份时压缩文件,同时释放流文件:详细操作如下:
#备份命令
[root@localhost restore]# time /root/backup/percona-xtrabackup-2.4.26-Linux-x86_64.glibc2.12/bin/innobackupex --defaults-file=/opt/mysql/etc/3310/my.cnf --host=localhost --port=3310 --user=root --password='xxx' --socket=/opt/mysql/data/3310/mysqld.sock --stream=xbstream --parallel=8 --compress --compress-threads=8 /data/ | sshpass -p 'xxx' ssh root@xxx "/root/backup/percona-xtrabackup-2.4.26-Linux-x86_64.glibc2.12/bin/xbstream -x -C /data/restore/"
.................
xtrabackup: Transaction log of lsn (105748687622) to (105748687631) was copied.
240714 18:19:07 completed OK!
real 0m54.846s
user 1m9.282s
sys 0m6.563s
Percona XtraBackup 8.0 场景
在 Percona XtraBackup8.0 及其以后版本,移除了 innobackupex
文件,如果希望能够跨机备份,可以参考详细操作如下:
#备份命令:
[root@localhost restore]# time /root/backup/percona-xtrabackup-8.0.35-31-Linux-x86_64.glibc2.17/bin/xtrabackup --defaults-file=/opt/mysql/my3310.cnf --host=localhost --port=3310 --user=root --password='xxx' --socket=/opt/mysql/data3310/mysqld.sock --stream=xbstream --parallel=8 --compress --compress-threads=8 --backup --target-dir=/data/backup | sshpass -p 'xxx' ssh root@xxx "/root/backup/percona-xtrabackup-2.4.26-Linux-x86_64.glibc2.12/bin/xbstream -x -C /data/restore/"
.....................
2024-07-14T18:47:46.602874+08:00 0 [Note] [MY-011825] [Xtrabackup] Transaction log of lsn (21513339136) to (21513345362) was copied.
2024-07-14T18:47:46.813338+08:00 0 [Note] [MY-011825] [Xtrabackup] completed OK!
real 0m39.986s
user 1m4.766s
sys 0m5.188s
[root@localhost restore]# ll
-rw------- 1 root root 307 Jul 14 18:47 backup-my.cnf.zst
-rw------- 1 root root 620 Jul 14 18:47 ib_buffer_pool.zst
-rw------- 1 root root 9373510 Jul 14 18:46 ibdata1.zst
drwx------ 2 root root 167 Jul 14 18:47 mysql
...............
-rw------- 1 root root 1371 Jul 14 18:47 xtrabackup_logfile.zst
-rw------- 1 root root 52 Jul 14 18:47 xtrabackup_tablespaces.zst
[root@localhost data]# du -s *
3435668 restore
[root@localhost data]# du -sh *
3.3G restore
#解压备份集文件
[root@localhost data]# time /root/backup/percona-xtrabackup-8.0.35-31-Linux-x86_64.glibc2.17/bin/xtrabackup --parallel=8 --decompress --remove-original --target-dir=/data/restore/
.....................
2024-07-14T18:50:09.224037+08:00 0 [Note] [MY-011825] [Xtrabackup] removing ./test/t_test.ibd.zst
2024-07-14T18:50:10.763930+08:00 0 [Note] [MY-011825] [Xtrabackup] completed OK!
real 0m18.226s
user 0m10.560s
sys 0m9.784s
Ps:从 Percona XtraBackup 8.0.34 版本 开始,ZSTD 压缩算法 成为
--compress
选项的默认压缩算法;QuickLZ 压缩算法 已被删除,不用于--backup
。--decompress
选项仍然使用 qpress 实现向后兼容性,以解压缩旧版本的 Percona XtraBackup 所做的备份。
测试结果汇总
注:测试可能存在部分误差,对最终结果基本无影响。
总结
通过如上测试,可以得到下列清晰的结论:
- 在现场允许配置机器远程免密访问或者对端机器操作系统用户密码的场景下,推荐使用跨机备份,总体耗费时间会更少。
- 进行备份时
–stream=xbstream
模式下备份文件大小和备份耗费时长两者都用得到较好的兼顾,较为推荐。 - 如果磁盘空间极为紧张且能容忍备份耗费时间较长,可选择
–stream=tar
+gzip
命令组合的压缩备份方式。
更多技术文章,请访问:https://opensource.actionsky.com/
关于 SQLE
SQLE 是一款全方位的 SQL 质量管理平台,覆盖开发至生产环境的 SQL 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。
✨ Github:https://github.com/actiontech/sqle
📚 文档:https://actiontech.github.io/sqle-docs/
💻 官网:https://opensource.actionsky.com/sqle/
👥 微信群:请添加小助手加入 ActionOpenSource
🔗 商业支持:https://www.actionsky.com/sqle