1问题背景
在 MySQL 日常运维中,备份是一个必不可少的环节,最常用的一般则是 Percona XtraBackup 工具。
图片来源:https://www.percona.com/
在使用 Percona XtraBackup 工具对 MySQL 数据库备份恢复时,我们通常会考虑以下因素:
-
备份恢复数据所需要的时间。
-
备份期间对主库服务器负载的影响。
-
备份集文件的大小。
分别对从这三个点进行展开描述:
1. 备份恢复数据所需要的时间
相同数据量情况下,通常我们希望 备份恢复所需要的时长越短越好,为什么这么说呢?
一方面,对于日常备份,一般会选择业务低峰期进行,如果备份占用的时长过长,可能会影响正常业务;另一方面,如果没有历史可用备份集,需要紧急临时备份进行数据恢复时候,这时候肯定是希望能够进行尽快的能够恢复,毕竟如果是重要业务,可能耽搁越久,每分每秒都给企业带来巨大损失;另外,如果 Redo 日志设置不合理,可能好不容易备份成功了,在恢复的时候发现 Redo 日志已经被覆盖,此时内心估计也会很郁闷吧。还有一些《Percona XtraBackup工具备份恢复过程中可能遇到的其他的问题》可参考。
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
2本地测试环境
从官网下载对应的二进制包,对于 Percona XtraBackup 工具,如果缺少部分依赖包可能导致无法正常备份。建议从官网下载地址[1] 进行对应下载。另外,不同版本的 Percona XtraBackup 和 MySQL 可能存在兼容性,以官网信息为准。
3测试流程
在 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/