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。



    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企业版。



  • Clone Plugin

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

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

逻辑备份

逻辑备份相关的工具有:

  • mysqldump

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

  • mydumper

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



  • mysqlpump

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

  • MySQL Shell

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

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

  • SELECT ... INTO OUTFILE

    SQL命令,可将表记录直接导出到文件中。

下面说说这几个工具的异同点:

    1. 从实现原理来看,mysqldump、 mydumper、mysqlpump、 MySQL Shell可归为一类,本质上都是通过 SELECT * FROM TABLE的方式备份数据,只不过在此基础上,通过全局读锁 + REPEATABLE READ事务隔离级别,实现了数据库的一致性备份。

    2. SELECT ... INTO OUTFILE 充其量只是一个命令,算不上工具,更不用说数据库的一致性备份。

    3. 从导出的内容来看,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

    4. 在恢复,各个工具对应的恢复工具也不一样。具体来说,

      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工具实现备份。

 

 

 

参考文档:https://zhuanlan.zhihu.com/p/422120352

posted on 2023-11-21 14:58  06  阅读(85)  评论(0编辑  收藏  举报