技术分享 | 满足多场景需求的 MySQL 物理备份实践

2024年 7月 23日 85.3k 0

1问题背景

在 MySQL 日常运维中,备份是一个必不可少的环节,最常用的一般则是 Percona XtraBackup 工具。

技术分享 | 满足多场景需求的 MySQL 物理备份实践-1图片来源:https://www.percona.com/

在使用 Percona XtraBackup 工具对 MySQL 数据库备份恢复时,我们通常会考虑以下因素:

  1. 备份恢复数据所需要的时间。

  2. 备份期间对主库服务器负载的影响。

  3. 备份集文件的大小。

分别对从这三个点进行展开描述:

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 方面进行合理的限制,或者选择对从实例进行备份(如果主从不同步,则备份为无效备份,可以对主从同步进行监控,同步正常情况下在从库进行备份)。

本篇仅考虑备份时间和备份集文件大小方面。 结合实践,从以下三个维度前后的备份工具区别进行展开:

  1. 本地备份

  2. 跨机器远程备份

  3. Percona XtraBackup 8.0

2本地测试环境

技术分享 | 满足多场景需求的 MySQL 物理备份实践-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/ 

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论