mysql数据库的备份是运维的重中之重,是保障服务灾难恢复的最后一道屏障
在我的构想里,一个完备的 mysql 容灾体系应该包括高可用架构和一套基础的数据库备份方案
高可用架构:MM+ Keepalived,PXC(Percona XtraDB Cluster)或者GR(Group Replication),来保证故障恢复,并附带一个延迟备库(延迟1小时同步数据)来防止误删等问题
基础的数据库备份方案:根据这段时间的调研,得出结论,可以按数据库大小分两种备份方案:20G以内,推荐使用mysql自带的mysqldump工具实现备份,超过20G使用xtrabackup工具实现备份。当然如果对于灾难恢复时间容忍度低的系统,推荐全部使用xtrabackup工具实现备份。
下面为备份方案的调研过程:
首先了解下物理备份和逻辑备份
物理备份 VS 逻辑备份
物理备份,顾名思义,就是备份物理文件。其优缺点如下:
优点:
- 备份、恢复速度快。
尤其是恢复速度,直接关系着数据库服务的RTO( Recovery time objective )。 - 无需实例在线。
在实例关闭的情况下,可直接拷贝文件,不用担心备份的一致性。
关闭实例进行备份,也称之为 “冷备” 。
缺点:
- 备份文件大。
- 恢复时,对平台、操作系统、MySQL版本有要求,必须一致或兼容。
- 只能在本地发起备份。
- 因为是拷贝物理文件,即使文件中存在很多“空洞”(大量DELETE导致),也无法通过恢复来收缩 。
- 对表的存储引擎有要求,无法备份MEMORY表。
逻辑备份,备份表的逻辑记录。其优缺点如下:
优点:
- 可移植性强。恢复时,对平台、操作系统、MySQL版本无要求。
- 灵活。尤其是在恢复时,可只恢复一个库或一张表。
- 对表的存储引擎没有要求,任何类型的表都可备份。
- 备份文件较小。
- 可远程发起备份。
- 恢复后,能有效收缩空间。
缺点:
- 备份、恢复速度慢。
实际上,单论备份速度,多线程备份其实也不慢。但恢复速度呢,即使是多线程恢复,也很慢。 - 备份会"污染"Buffer Pool。
业务热点数据会被备份数据驱逐出Buffer Pool 。
其次了解下备份工具
MySQL中的备份工具
物理备份
物理备份相关的工具有:
- XtraBackup
Percona公司开源的备份工具,适用于MySQL、MariaDB、Percona Server。
https://www.percona.com/software/mysql-database/percona-xtrabackup
XtraBackup目前维护的大版本有两个:
1. XtraBackup 2.4,适用于MySQL 5.6和5.7。
2. XtraBackup 8.0。适用于 MySQL 8.0。
之所以要维护两个版本,是因为MySQL 8.0中的redo log和数据字典的格式发生了变化。 - mysqlbackup
MySQL企业级备份工具( MySQL Enterprise Backup ),适用于MySQL企业版。
https://dev.mysql.com/doc/mysql-enterprise-backup/4.1/en/mysqlbackup.html - Clone Plugin
MySQL 8.0.17引入的克隆插件。初衷是为了方便Group Replication添加新的节点。有了Clone Plugin,我们也能很方便的搭建一个从库,无需借助其它备份工具。
三者的实现原理基本相同,都是在备份的过程中,拷贝物理文件和redo log ,最后,再利用InnoDB Crash Recovery,将物理文件恢复到备份结束时的一致性状态。
逻辑备份
逻辑备份相关的工具有:
- mysqldump
MySQL安装包自带的备份工具,单线程备份。 - mydumper
由Facebook、SkySQL、Oracle和Percona开发人员维护的一个多线程备份工具,可实现行级别的并行备份。
https://github.com/maxbube/mydumper - mysqlpump
MySQL 5.7引入的备份工具,可实现表级别的并行备份。 - MySQL Shell
MySQL Shell 8.0.21引入了一个工具-util.dumpInstance(),可实现行级别的并行备份。
这个工具对备份实例和恢复实例的版本有要求:备份实例 >= 5.6,恢复实例 >= 5.7。 - SELECT ... INTO OUTFILE
SQL命令,可将表记录直接导出到文件中。
下面说说这几个工具的异同点:
- 从实现原理来看,mysqldump、 mydumper、mysqlpump、 MySQL Shell可归为一类,本质上都是通过 SELECT * FROM TABLE的方式备份数据,只不过在此基础上,通过全局读锁 + REPEATABLE READ事务隔离级别,实现了数据库的一致性备份。
- SELECT ... INTO OUTFILE 充其量只是一个命令,算不上工具,更不用说数据库的一致性备份。
- 从导出的内容来看,mysqldump、mydumper、mysqlpump 会以INSERT语句的形式保存备份结果,如,
INSERT INTO `t1` VALUES (1,'aaa'),(2,'bbb'),(3,'ccc');
而 MySQL Shell和SELECT ... INTO OUTFILE 是以CSV格式的形式保存备份结果,如,
1 aaa
2 bbb
3 ccc - 在恢复,各个工具对应的恢复工具也不一样。具体来说,
mysqldump、mysqlpump对应的恢复工具是mysql客户端,所以是单线程恢复。
mydumper对应的恢复工具是myloader,支持多线程恢复。
util.dumpInstance()对应的恢复工具是util.loadDump(),底层调用的是LOAD DATA LOCAL INFILE命令,支持多线程恢复。
SELECT ... INTO OUTFILE对应的恢复命令是LOAD DATA。
最后对比下总结下工具的优劣
myqldump:
优点:
1.mysql自带,不用额外搭建环境,mydumper需要额外搭建环境。
2.备份脚本兼容性好,从低版本到高版本myql都兼容,不像mysqlpump只适用于mysql 5.7以上,而且mysqlpump只能基于表级多线程备份,遇见大表,由于木桶效应,备份一样很慢。而且她俩对应的恢复工具是mysql客户端,所以是单线程恢复,恢复速度也是一样的慢
3.备份文件为sql语句,可移植性强。恢复时,对平台、操作系统、MySQL版本无要求
4.备份文件压缩后体积很小,方便传输储存
缺点:
1.不支持多线程备份,备份比较慢
2.恢复为对sql语句的重放,速度比备份还慢
XtraBackup
优点:
1.开源免费,程序成熟稳定
2.由于物理备份的特性,直接打包文件的方式,备份和恢复速度都非常快
缺点:
1.需要额外搭建环境,对于数据量小的数据库相比msyqldump优势不明显,实现过程却略显繁琐
2.备份文件占用空间较大
3.恢复时,对平台、操作系统、MySQL版本有要求
4.只能在本地发起备份
综合考虑,对于灾难恢复,最大的容忍值大概为一个小时,而mysqldump 1个小时内最大的恢复量大概为20G,再考虑到搭建XtraBackup的成本,顾得出结论:
数据库大小20G以内,推荐使用mysql自带的mysqldump工具实现备份,超过20G使用xtrabackup工具实现备份。
当然如果对于灾难恢复时间容忍度低的系统,推荐全部使用xtrabackup工具实现备份。