1. 冷备份

原理: 关闭MySQL服务器,然后将data目录下面的所有文件进行拷贝保存,需要恢复时,则将目录拷贝到需要恢复的机器即可

2. 快照备份

原理: 将所有的数据库文件放在同一分区中,然后对该分区执行快照工作,对于Linux而言,需要通过LVM(Logical Volumn Manager)来实现。LVM使用写时复制(copy-on-write)技术来创建快照,例如,对整个卷的某个瞬间的逻辑副本。

涉及到的文件有逻辑副本文件与日志文件。

仅支持innodb存储引擎。LVM有一个快照预留区域,如果原始卷数据有变化时,LVM保证在任何变更写入之前,会复制受影响块到快照预留区域。

image.png

日志文件记录了LVM备份期间的操作,LVM备份的时候会加入flush table with read lock锁,保证某个时间点上的数据的一致性。

3. 逻辑备份-Mysqldump(热备份)

原理: 一定要将事务表(innodb)和非事务表(比如myisam)区别对待,因为备份的流程与此息息相关。而且,到目前为止,我们也无法规避myisam表,即使我们的所有业务表都是innodb,因为mysql库中系统表仍然采用的myisam表。备份的基本流程如下:

1.调用FTWRL(flush tables with read lock),全局禁止读写(就是不commit)

2.开启快照读,获取此时的快照(仅对innodb表起作用)

3.备份非innodb表数据(.frm,.myi,*.myd等)

4.非innodb表备份完毕后,释放FTWRL锁

5.逐一备份innodb表数据

6.备份完成。

4. Xtrabackup

原理: 由于Xtrabackup支持备份innodb表,实际生产环境中我们使用的工具是innobackupex,它是对xtrabackup的一层封装。innobackupex 脚本用来备份非 InnoDB 表,同时会调用 xtrabackup 命令来备份 InnoDB 表,innobackupex的基本流程如下:

1.开启redo日志拷贝的线程,从最新的检查点开始顺序拷贝redo日志;

2.开启innodb文件拷贝的线程,拷贝innodb表的数据

3.innodb文件拷贝结束,通知调用FTWRL,获取一致性位点

4.备份非innodb表(系统表)和frm文件

5.由于此时没有新事务提交,等待redo日志拷贝完成

6.最新的redo日志拷贝完成后,相当于此时的innodb表和非innodb表数据都是最新的

7.获取binlog位点,此时数据库的状态是一致的。

8.释放锁,备份结束。