这两天在调研MySQL数据库的备份和恢复方案,备份对象是对大量Innodb表,或者加上少量的MyISAM表。
InnoDB备份常见问题:
文件一致性:数据文件、缓存、日志文件必须保持严格一致。加锁的方法没法保证一致性,因为InnoDB后台刷新数据是异步进行的。
数据一致性:不能一次锁住一张表,这个备份的是不同时刻的表数据;如果一次锁住所有表,innodb的mvcc机制会增加undo日志,同时DDL操作的话也会有风险。
复制:如果支持主备结构,还要缓存主备同步的信息。
所以,要在不停止mysql的情况下对innodb表进行热备份,文件一致性和数据一致性很难保证。
本人尝试了以下备份和恢复方法:
1. 使用mysqldump工具,类似的有mypump(5.7.11之后有用,多线程导出,能实现数据一致性). 这种方法适合在数据量比较少的情况下使用(个人认为数据量<100G可行),在一台30G的数据库上进行备份,备份出来的数据文件8G(因为没有导出来索引等其他数据库信息,因此文件通常比数据库小的多),使用时间8分钟,恢复时间用了差不多办个小时。顺便说一句,导出时使用order-by-primary参数应该可以提高几倍的导入性能(和mysql的聚集索引有关)
2. Mylvnbackup文件系统快照:要求所有的数据文件都在LVM卷上,由于我的测试系统不满足该条件,没有测试成功。
3.SAN\DRBD\RAID:硬件层次的拷贝,不是真正的备份,