当前位置:网站首页>数据库备份(Mysql)

数据库备份(Mysql)

2022-06-11 16:30:00 peach桃

数据库备份(Mysql):

         衡量数据备份的两个重要的指标:恢复点目标(RPO)和恢复时间目标(RTO)

恢复点目标(RPO):重点关注能恢复到什么程度

恢复时间目标(RTO):重点关注恢复需要多长时间

 

备份方式:文件系统快照(LVM),逻辑备份工具MysqldumpMydumper以及物理备份工具Xtrabackup

 

冷备份:

关闭MySQL服务器,然后将data目录下面的所有文件进行拷贝保存,需要恢复时,则将目录拷贝到需要恢复的机器即可。这种方式确实方便,但是在生产环境中基本没什么作用。因为所有的机器都是要提供服务的,即使是Slave有时候也需要提供只读服务,所以关闭MySQL停服备份是不现实的。与冷备份相对应的一个概念是热备份,所谓热备份是在不影响MySQL对外服务的情况下,进行备份。

 

快照备份

首先要介绍的热备份是快照备份,快照备份是指通过文件系统支持的快照功能对数据库进行备份。备份的原理是将所有的数据库文件放在同一分区中,然后对该分区执行快照工作,对于Linux而言,需要通过LVM(LogicalVolumn Manager)来实现。LVM使用写时复制(copy-on-write)技术来创建快照。例如,对整个卷的某个瞬间的逻辑副本,类似于数据库中的innodb存储引擎的MVCC,只不过LVM的快照在文件系统层面,而MVCC在数据库层面,而且仅支持innodb存储引擎。LVM有一个快照预留区域,如果原始卷数据有变化时,LVM保证在任何变更写入之前,会复制受影响块到快照预留区域。简单来说,快照区域内保留了快照点开始时的一致的所有old数据。对于更新很少的数据库,快照也会非常小。对于MySQL而言,为了使用快照备份,需要将数据文件,日志文件都放在一个逻辑卷中,然后对该卷快照备份即可。由于快照备份,只能本地,因此,如果本地的磁盘损坏,则快照也就损坏了。快照备份更偏向于对误操作防范,可以将数据库迅速恢复到快照产生的时间点,然后结合二进制日志可以恢复到指定的时间点。

 

逻辑备份:

       冷备份和快照备份由于其弊端在生产环境中很少使用,使用更多是MySQL自带的逻辑备份和物理备份工具,这节主要讲逻辑备份,MySQL官方提供了Mysqldump逻辑备份工具,虽然已经足够好,但存在单线程备份慢的问题。在社区提供了更优秀的逻辑备份工具mydumper,它的优势主要体现在多线程备份,备份速度更快。

 

Mysqldump

       理解Mysqldump工作原理,一定要将事务表(innodb)和非事务表(比如myisam)区别对待,因为备份的流程与此息息相关。而且,到目前为止,我们也无法规避myisam表,即使我们的所有业务表都是innodb,因为mysql库中系统表仍然采用的myisam表。备份的基本流程如下:
1.
调用FTWRL(flush tableswith read lock),全局禁止读写
2.
开启快照读,获取此时的快照(仅对innodb表起作用)
3.
备份非innodb表数据(*.frm,*.myi,*.myd)
4.
innodb表备份完毕后,释放FTWRL
5.
逐一备份innodb表数据
6.
备份完成。

 

Mydumper
·······Mydumper
原理与Mysqldump原理类似,最大的区别是引入了多线程备份,每个备份线程备份一部分表,当然并发粒度可以到行级,达到多线程备份的目的。这里要解决最大一个问题是,如何保证备份的一致性,其实关键还是在于FTWRL。对于非innodb表,在释放锁之前,需要将表备份完成。对于innodb表,需要确保多个线程都能拿到一致性位点,这个动作同样要在持有全局锁期间完成,因为此时数据库没有读写,可以保证位点一致。

 

物理备份(Xtrabackup)

       相对于逻辑备份利用查询提取数据中的所有记录,物理备份更直接,拷贝数据库文件和日志来完成备份,因此速度会更快。当然,无论是开源的Mydumper还是官方最新的备份工具(5.7.11mysqlpump)都支持了多线程备份,所以速度差异可能会进一步缩小,至少从目前生产环境来看,物理备份使用还是比较多的。由于Xtrabackup支持备份innodb表,实际生产环境中我们使用的工具是innobackupex,它是对xtrabackup的一层封装。innobackupex 脚本用来备份非 InnoDB 表,同时会调用 xtrabackup 命令来备份 InnoDB 表,innobackupex的基本流程如下:
1.
开启redo日志拷贝线程,从最新的检查点开始顺序拷贝redo日志;
2.
开启idb文件拷贝线程,拷贝innodb表的数据
3.idb
文件拷贝结束,通知调用FTWRL,获取一致性位点
4.
备份非innodb(系统表)frm文件
5.
由于此时没有新事务提交,等待redo日志拷贝完成
6.
最新的redo日志拷贝完成后,相当于此时的innodb表和非innodb表数据都是最新的
7.
获取binlog位点,此时数据库的状态是一致的。
8.
释放锁,备份结束。


原网站

版权声明
本文为[peach桃]所创,转载请带上原文链接,感谢
https://blog.csdn.net/peach_garden/article/details/79991146