MySQL选择合适的备份策略和备份工具


Posted in MySQL onJune 01, 2022

前言:

在确定备份策略和选择备份工具时,应从业务的RTO和RPO出发,结合存储成本综合考虑。数据库备份的重要性毋庸置疑,可以说,它是数据安全的最后一道防线。鉴于此,对于备份,我们通常会做以下要求:

一、多地部署

对于核心数据库,我们通常有两地三中心的部署要求。对于备份来说,也是如此。一个备份应该有多个副本,每个副本存储在不同区域。

多介质部署:

一个备份的多个副本应存储在不同介质上,如磁盘和磁带,防止单一介质失效。

定期检查备份的有效性:

备份只是在做正确的事情,有没有把事情做对,还得依靠备份的有效性检查。前两项,在条件允许的情况下,建议做。第三项必须做。

接下来,我们聊聊备份的相关话题,主要包括以下五方面的内容:

  • 备份的常见分类。
  • MySQL中的备份工具。
  • mysqlbackup与mysqldump的备份恢复速度对比。
  • 如何检测备份的有效性。
  • RTO和RPO 。

二、备份的常见分类

1、物理备份 VS 逻辑备份

1)物理备份

顾名思义,就是备份物理文件。其优缺点如下:

① 优点

  • 备份、恢复速度快。尤其是恢复速度,直接关系着数据库服务的RTO。
  • 无需实例在线。在实例关闭的情况下,可直接拷贝文件,不用担心备份的一致性。关闭实例进行备份,也称之为 “冷备” 。

② 缺点

  • 备份文件大。
  • 恢复时,对平台、操作系统、MySQL版本有要求,必须一致或兼容。
  • 只能在本地发起备份。
  • 因为是拷贝物理文件,即使文件中存在很多“空洞”(大量DELETE导致),也无法通过恢复来收缩 。
  • 对表的存储引擎有要求,无法备份MEMORY表。

2)逻辑备份

备份表的逻辑记录。其优缺点如下:

① 优点

  • 可移植性强。恢复时,对平台、操作系统、MySQL版本无要求。
  • 灵活。尤其是在恢复时,可只恢复一个库或一张表。
  • 对表的存储引擎没有要求,任何类型的表都可备份。
  • 备份文件较小。
  • 可远程发起备份。
  • 恢复后,能有效收缩空间。

② 缺点

  • 备份、恢复速度慢。实际上,单论备份速度,多线程备份其实也不慢。但恢复速度呢,即使是多线程恢复,也很慢。
  • 备份会"污染"Buffer Pool。业务热点数据会被备份数据驱逐出Buffer Pool。

2、离线备份 VS 在线备份

离线备份,又可称之为 "冷备",即实例关闭的情况下进行的备份。此时,只能进行物理备份,即全量拷贝物理文件。在线备份,又可称之为 "热备",即实例运行过程中进行的备份。此时,既可进行物理备份,又可进行逻辑备份。因对业务侵入较小,线上一般使用在线备份。

3、全量备份 VS 增量备份

  • 全量备份,即备份整个实例的全量数据。
  • 增量备份,即只备份上次备份以来,那些发生了"变化"的数据。

通常来说,基于物理备份来实现增量备份较为简单,以MySQL为例,只需判断数据页的LSN是否发生了变化。而对于逻辑备份,就很难实现,如常见的基于某个时间字段来进行增量备份,但其实,很难保证某个时间段之前的数据不被修改或删除。

三、MySQL中的备份工具

1、物理备份

物理备份相关的工具有:

1)XtraBackup

Percona公司开源的备份工具,适用于MySQL、MariaDB、Percona Server。

XtraBackup目前维护的大版本有两个:

  • XtraBackup 2.4,适用于MySQL 5.6和5.7。
  • XtraBackup 8.0。适用于 MySQL 8.0。

之所以要维护两个版本,是因为MySQL 8.0中的redo log和数据字典的格式发生了变化。

2)mysqlbackup

MySQL企业级备份工具( MySQL Enterprise Backup ),适用于MySQL企业版。

3)Clone Plugin

MySQL 8.0.17引入的克隆插件。初衷是为了方便Group Replication添加新的节点。有了Clone Plugin,我们也能很方便的搭建一个从库,无需借助其它备份工具。

三者的实现原理基本相同,都是在备份的过程中,拷贝物理文件和redo log ,最后,再利用InnoDB Crash Recovery,将物理文件恢复到备份结束时的一致性状态。

2、逻辑备份

逻辑备份相关的工具有:

1)mysqldump

MySQL安装包自带的备份工具,单线程备份。

2)mydumper

由Facebook、SkySQL、Oracle和Percona开发人员维护的一个多线程备份工具,可实现行级别的并行备份。

3)mysqlpump

MySQL 5.7引入的备份工具,可实现表级别的并行备份。

4)MySQL Shell

MySQL Shell 8.0.21引入了一个工具-util.dumpInstance(),可实现行级别的并行备份。

这个工具对备份实例和恢复实例的版本有要求:备份实例 >= 5.6,恢复实例 >= 5.7。

5)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。

四、mysqlbackup VS mysqldump

下面是MySQL官方提供的一组数据,对比了mysqlbackup和mysqldump备份恢复时间。

MySQL选择合适的备份策略和备份工具

MySQL选择合适的备份策略和备份工具

第一张图比较的是备份时间,mysqldump是mysqlbackup的49倍。

第二张图比较的是恢复时间,mysqldump是mysqlbackup的80倍。

借此,我们也能看到逻辑备份工具相对于物理备份工具在备份、还原速度上的差距。不过可惜的是,这里没有测试mydumper。毕竟,针对数据量较大的实例,如果一定要使用逻辑备份,大家一般倾向于使用mydumper,而不是mysqldump。

五、如何检测备份的有效性

为什么要检测备份的有效性,原因主要有两个:

  • 验证整个备份环节的可靠性。包括备份参数是否完备,备份集是否有效,备份介质是否损坏等。
  • 通过检查备份的有效性,搭建一套完整的自动化恢复体系。

很多时候,影响数据库恢复时间的并不是备份集太老,而是手动恢复过程中,因为命令、环境、流程的不熟悉,所带来的额外耗时。

如何检测备份的有效性,常用的方法有三个:

  • (1)基于备份恢复实例,看实例能否起来。并在此基础上,进行随机查询。

这种检测方法最简单。一般来说,实例能起来,且随机查询也没问题,就意味着这个备份集是可用的。但备份集可用,并不意味着这个备份集能满足我们的需求,譬如常见的,搭建从库。而且一些常见的问题,如备份中断、参数没指定准确,也无法通过这种方式检测出来。

  • (2)在1的基础上,建立复制。

如果从库在追主库的过程中,没有报错,大概率意味着主从数据是一致的。当然,也只是大概率,并不是100%。

  • (3)在2的基础上,利用pt-table-checksum检查主从数据的一致性。

如果检查结果没问题,则意味着主从数据是一致的,也就间接证明了备份的有效性。但因为pt-table-checksum在运行的过程中,会在chunk级别对表加S锁,对更新频繁的业务,还是有一定的影响。一般来说,线上使用方法2足矣。方法3,因为要检查主从数据的一致性,耗时相对较久,如果要检测的备份集很多,反而会影响检测的效率。

六、RTO 和 RPO

衡量一个数据中心的容灾能力时,有两个常用的指标:

  • RTO:Recovery Time Objective,恢复时间目标。

指的是灾难发生后,必须在这个时间内恢复数据。在恢复数据的这段时间内,服务是不可用的,所以RTO也是服务可允许的最大不可用时间。如果我们要求服务的最大不可用时间是30分钟,那么RTO就是30分钟。RTO 越小,代表容灾系统的恢复能力越强。

  • RPO:Recovery Point Objective,数据恢复点目标。

指的是灾难发生后,数据可以恢复到的时间点。

譬如,我有一个系统,每天0点进行一次全备。当系统出现故障后,会基于上一次的备份来恢复。如果系统在凌晨3点出现故障,我们会丢失3个小时的数据。极端情况下,系统在23:59出现故障,我们会丢失24个小时的数据。这里的24小时就是这个系统的RPO 。

RPO越小,代表系统越能保证数据的完整性。

RTO、RPO与灾难在时间轴上的关系如下图所示:

MySQL选择合适的备份策略和备份工具

可以看到,RPO针对的是数据丢失,RTO针对的是服务宕机时间,两者之间没有必然的联系。

最理想的情况是RTO和RPO都为0,这就意味着当灾难发生时,系统会立即恢复,而且数据不会丢失。当然,RTO、RPO越小,需要投入的成本也越高。

具体到MySQL中,为了降低RTO和RPO,我们可以从以下几个方面着手:

1、RTO

  • 增加备份频率,缩短备份周期。
  • 选择物理备份,而不是逻辑备份。
  • 添加延迟从库。
  • 恢复流程的自动化。

2、RPO

  • 增加备份频率,缩短备份周期。
  • 搭建Binlog Server备份Binlog。当出现故障时,我们可以基于备份和Binlog做基于时间点的恢复。
  • 添加延迟从库。

七、总结

从RTO的角度出发,应尽量选择物理备份,而不是逻辑备份。如果要使用逻辑备份,应尽量选择多线程备份工具和多线程恢复工具。

从RPO的角度出发,应尽量增加备份频率,缩短备份周期。但 every coin has two sides,使用物理备份或者增加备份频率,无疑会增加存储成本。所以,在确定备份策略和选择备份工具时,应从业务的RTO和RPO出发,结合存储成本综合考虑。大多数公司会采取一个统一的备份策略,如一天一个全备。虽然灾难情况很少出现,开发和DBA童鞋也应充分理解到这里面的风险,并制定相应的预案及业务兜底方案。另外,对于线上核心业务,如果只有备份,还是很难有效降低数据库服务的RTO和RPO,建议部署延迟从库。

到此这篇关于MySQL选择合适的备份策略和备份工具的文章就介绍到这了!


Tags in this post...

MySQL 相关文章推荐
如何使用Maxwell实时同步mysql数据
Apr 08 MySQL
MySQL安装后默认自带数据库的作用详解
Apr 27 MySQL
mysql对于模糊查询like的一些汇总
May 09 MySQL
MySQL中你可能忽略的COLLATION实例详解
May 12 MySQL
MySQL中使用or、in与union all在查询命令下的效率对比
May 26 MySQL
SQL注入的实现以及防范示例详解
Jun 02 MySQL
MySQL里面的子查询的基本使用
Aug 02 MySQL
MySQL中几种插入和批量语句实例详解
Sep 14 MySQL
Linux7.6二进制安装Mysql8.0.27详细操作步骤
Nov 27 MySQL
MySQL派生表联表查询实战过程
Mar 20 MySQL
为什么MySQL不建议使用SELECT *
Apr 03 MySQL
一文解答什么是MySQL的回表
Aug 05 MySQL
MySQL普通表如何转换成分区表
May 30 #MySQL
Mysql将字符串按照指定字符分割的正确方法
May 30 #MySQL
MySQL数据库安装方法与图形化管理工具介绍
MySQL数据库简介与基本操作
May 30 #MySQL
Mysql数据库事务的脏读幻读及不可重复读详解
May 30 #MySQL
mysql字段为NULL索引是否会失效实例详解
May 30 #MySQL
MYSQL如何查看操作日志详解
You might like
PHP的历史和优缺点
2006/10/09 PHP
基于mysql的论坛(2)
2006/10/09 PHP
php生成zip压缩文件的方法详解
2013/06/09 PHP
彪哥1.1(智能表格)提供下载
2006/09/07 Javascript
textarea中的手动换行处理的jquery代码
2011/02/26 Javascript
7个jQuery最佳实践
2016/01/12 Javascript
JavaScript 函数的执行过程
2016/05/09 Javascript
Bootstrap精简教程中秋大放送
2016/09/15 Javascript
jQuery插件扩展操作入门示例
2017/01/16 Javascript
Avalonjs 实现简单购物车功能(实例代码)
2017/02/07 Javascript
JavaScript引用类型Object常见用法实例分析
2018/08/08 Javascript
vue-cli webpack 引入swiper的操作方法
2018/09/15 Javascript
vue 2.1.3 实时显示当前时间,每秒更新的方法
2018/09/16 Javascript
浅谈Angular单元测试总结
2019/03/22 Javascript
JavaScript剩余操作符Rest Operator详解
2019/07/20 Javascript
layer 关闭指定弹出层的例子
2019/09/25 Javascript
利用python获取当前日期前后N天或N月日期的方法示例
2017/07/30 Python
Python中py文件引用另一个py文件变量的方法
2018/04/29 Python
Python 查看list中是否含有某元素的方法
2018/06/27 Python
Python3随机漫步生成数据并绘制
2018/08/27 Python
python爬取微信公众号文章的方法
2019/02/26 Python
python实现图片压缩代码实例
2019/08/12 Python
Python 多线程其他属性以及继承Thread类详解
2019/08/28 Python
python实现飞行棋游戏
2020/02/05 Python
Python接口测试get请求过程详解
2020/02/28 Python
萨克斯第五大道的折扣店:Saks Fifth Avenue OFF 5TH
2016/08/25 全球购物
Rowdy Gentleman服装和配饰:美好时光
2019/09/24 全球购物
Jowissa官方网站:瑞士制造的手表,优雅简约的设计
2020/07/29 全球购物
自荐信范文
2013/12/10 职场文书
英语一分钟演讲稿
2014/04/29 职场文书
杭州黄龙洞导游词
2015/02/10 职场文书
2015年干部教育培训工作总结
2015/05/15 职场文书
实践论读书笔记
2015/06/29 职场文书
《童年》读后感(三篇)
2019/08/27 职场文书
关于@OnetoMany关系映射的排序问题,使用注解@OrderBy
2021/12/06 Java/Android
js中Map和Set的用法及区别实例详解
2022/02/15 Javascript