北京网站设计公司jq成都柚米科技15,如何把网站让百度录用,网战,建设美食网站备份是数据安全的最后一道防线#xff0c;对于任何数据丢失的场景#xff0c;备份虽然不一定能恢复百分之百的数据(取决于备份周期)#xff0c;但至少能将损失降到最低。衡量备份恢复有两个重要的指标#xff1a;恢复点目标(RPO)和恢复时间目标(RTO)#xff0c;前者重点关… 备份是数据安全的最后一道防线对于任何数据丢失的场景备份虽然不一定能恢复百分之百的数据(取决于备份周期)但至少能将损失降到最低。衡量备份恢复有两个重要的指标恢复点目标(RPO)和恢复时间目标(RTO)前者重点关注能恢复到什么程度而后者则重点关注恢复需要多长时间。这篇文章主要讨论MySQL的备份方案重点介绍几种备份方式的原理包括文件系统快照(LVM)逻辑备份工具MysqldumpMydumper以及物理备份工具Xtrabackup同时会详细讲解几种方案的优缺点以及可能遇到的问题下载地址 。冷备份最简单的备份方式就是关闭MySQL服务器然后将data目录下面的所有文件进行拷贝保存需要恢复时则将目录拷贝到需要恢复的机器即可。这种方式确实方便但是在生产环境中基本没什么作用。因为所有的机器都是要提供服务的即使是Slave有时候也需要提供只读服务所以关闭MySQL停服备份是不现实的。与冷备份相对应的一个概念是热备份所谓热备份是在不影响MySQL对外服务的情况下进行备份热备份是这篇文章讨论的重点。快照备份首先要介绍的热备份是快照备份快照备份是指通过文件系统支持的快照功能对数据库进行备份。备份的原理是将所有的数据库文件放在同一分区中然后对该分区执行快照工作对于Linux而言需要通过LVM(Logical Volumn Manager)来实现。LVM使用写时复制(copy-on-write)技术来创建快照例如对整个卷的某个瞬间的逻辑副本类似于数据库中的innodb存储引擎的MVCC只不过LVM的快照在文件系统层面而MVCC在数据库层面而且仅支持innodb存储引擎。LVM有一个快照预留区域如果原始卷数据有变化时LVM保证在任何变更写入之前会复制受影响块到快照预留区域。简单来说快照区域内保留了快照点开始时的一致的所有old数据。对于更新很少的数据库快照也会非常小。对于MySQL而言为了使用快照备份需要将数据文件日志文件都放在一个逻辑卷中然后对该卷快照备份即可。由于快照备份只能本地因此如果本地的磁盘损坏则快照也就损坏了。快照备份更偏向于对误操作防范可以将数据库迅速恢复到快照产生的时间点然后结合二进制日志可以恢复到指定的时间点。基本原理如下图逻辑备份冷备份和快照备份由于其弊端在生产环境中很少使用使用更多是MySQL自带的逻辑备份和物理备份工具这节主要讲逻辑备份MySQL官方提供了Mysqldump逻辑备份工具虽然已经足够好但存在单线程备份慢的问题。在社区提供了更优秀的逻辑备份工具mydumper它的优势主要体现在多线程备份备份速度更快。MysqldumpMysqldump用于备份不得不提两个关键的参数--single-transaction在开始备份前执行start transaction命令以此来获取一致性备份该参数仅对innodb存储引擎有效。--master-data2主要用于记录一致性备份的位点。理解Mysqldump工作原理一定要将事务表(innodb)和非事务表(比如myisam)区别对待因为备份的流程与此息息相关。而且到目前为止我们也无法规避myisam表即使我们的所有业务表都是innodb因为mysql库中系统表仍然采用的myisam表。备份的基本流程如下1.调用FTWRL(flush tables with read lock)全局禁止读写2.开启快照读获取此时的快照(仅对innodb表起作用)3.备份非innodb表数据(*.frm,*.myi,*.myd等)4.非innodb表备份完毕后释放FTWRL锁5.逐一备份innodb表数据6.备份完成。整个过程可以参考我同事的一张图但他的这张图只考虑innodb表的备份情况实际上在unlock tables执行完毕之前非innodb表已经备份完毕后面的t1,t2和t3实质都是innodb表而且5.6的mysqldump利用保存点机制每备份完一个表就将一个表上的MDL锁释放避免对一张表锁更长的时间。这里可以参考我之前的blogFLUSH TABLE WITH READ LOCK大家可能有一个疑问为啥备份innodb表之前就已经将锁释放掉了这实际上是利用了innodb引擎的MVCC机制开启快照读后就能获取那个时间的一致的数据无论需要备份多长时间直到整个事务结束(commit)为止。MydumperMydumper原理与Mysqldump原理类似最大的区别是引入了多线程备份每个备份线程备份一部分表当然并发粒度可以到行级达到多线程备份的目的。这里要解决最大一个问题是如何保证备份的一致性其实关键还是在于FTWRL。对于非innodb表在释放锁之前需要将表备份完成。对于innodb表需要确保多个线程都能拿到一致性位点这个动作同样要在持有全局锁期间完成因为此时数据库没有读写可以保证位点一致。所以基本流程如下物理备份(Xtrabackup)相对于逻辑备份利用查询提取数据中的所有记录物理备份更直接拷贝数据库文件和日志来完成备份因此速度会更快。当然无论是开源的Mydumper还是官方最新的备份工具(5.7.11的mysqlpump)都支持了多线程备份所以速度差异可能会进一步缩小至少从目前生产环境来看物理备份使用还是比较多的。由于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.释放锁备份结束。Xtrabackup的改进从前面介绍的逻辑备份和物理备份来看无论是哪种备份工具为了获取一致性位点都强依赖于FTWRL。这个锁杀伤力非常大因为持有锁的这段时间整个数据库实质上不能对外提供写服务的。此外由于FTWRL需要关闭表如有大查询会导致FTWRL等待进而导致DML堵塞的时间变长。即使是备库也有SQL线程在复制来源于主库的更新上全局锁时会导致主备库延迟。从前面的分析来看FTWRL这把锁持有的时间主要与非innodb表的数据量有关如果非innodb表数据量很大备份很慢那么持有锁的时间就会很长。即使全部是innodb表也会因为有mysql库系统表存在导致会锁一定的时间。为了解决这个问题Percona公司对Mysql的Server层做了改进引入了BACKUP LOCK具体而言通过LOCK TABLES FOR BACKUP命令来备份非innodb表数据通过LOCK BINLOG FOR BACKUP来获取一致性位点尽量减少因为数据库备份带来的服务受损。我们看看采用这两个锁与FTWRL的区别LOCK TABLES FOR BACKUP作用备份数据1.禁止非innodb表更新2.禁止所有表的ddl优化点1.不会被大查询堵塞(关闭表)2.不会堵塞innodb表的读取和更新这点非常重要对于业务表全部是innodb的情况则备份过程中DML完全不受损UNLOCK TABLESLOCK BINLOG FOR BACKUP作用获取一致性位点。1.禁止对位点更新的操作优化点1.允许DDl和更新直到写binlog为止。UNLOCK BINLOG本文出自http://www.2cto.com/database/201605/506246.html 转载于:https://blog.51cto.com/lookingdream/1881659