By
兰春
Updated:
Mysql Backup and Recovery
背景说明
备份和恢复,这是一个非常大的话题,但这不是本章的重点,关于详情,请看之前分享过的一篇PDF Mysql Backup and Recovery 分享 。 备份,主要是用于灾难恢复。 那么,今天我们就来讨论一下再没有备份的前提下,如果从master上恢复一台slave出来?
前提
1 2 3 4 5 6 7 8 9 10
| * Master 1. Myisam 引擎 2. 无全量备份 3. 有最近2天的binlog 4. SQL语句特点: 全是insert 5. 每个表都有主键id,并且auto increment * Master 上的table 1. table1_YYYMM (按月分表) 2. table2_YYYMMDD (按天分表) 3. table3 (整张表)
|
如果是innoDB 引擎,到时可以用mysqldump —single transaction 或者 percona xtrabackup 来恢复。 但是在Myisam中,在这种场景下,如何恢复搭建slave呢?
方案一
1 2 3 4 5
| 1. copy 已经不在写的表,比如table1_YYYMM 今天之前,今月之前的表。 消耗时间A 2. 在master 上flush tables with read lock;show master status;消耗时间B 3. copy 剩下的表; 消耗时间C 4. unlock tables; 5. 在slave上,开启同步
|
1 2 3 4
| *优点 1.无须担心一致性问题。 *缺点 1. 需要锁表,锁住的时间就是copy数据的时间C。 表越大,锁越长,有些业务是不允许这么长时间的。
|
方案二
这里主要抓住一点,只有insert操作。根据这个特性,我们可以针对性的恢复
1 2 3 4 5 6 7 8 9 10 11 12
| * 检查一下表的自增主键 * 第一步:提前先copy好所有不再写的表,比如table1_YYYMM 今天之前,今月之前的表,同上。 消耗时间A * 第二步:然后再copy 当天,当月,当时的表, 并且记下 max(主键),一遍后续补数据用。 消耗时间B * 第三步:在master上 消耗时间C 1. flush tables with read lock; 2. show master status; 3. 记下当天,当月,当时的表的max(主键),由于是myisam引擎,基本是瞬间完成。 4. unlock tables; * 第四步:修补第二步和第三步 max(主键)中的空洞。 * 第五步:repair 部分表,可以用同步机制自动检测且修复,无须人为关心。 * 第六步:在slave上,开启同步
|
1 2 3 4 5 6 7
| * 优点: 1. 基本上无中断业务时间。 2. 不会丢失任何数据。 * 缺点: 1. 需要脚本处理max值,记录position点。 2. 需要repair表。 3. 如果有update,delete语句,有风险。
|
以上,就是这次奇葩的数据恢复。
总结
- 没有备份,等于自掘坟墓。
- 没有测试恢复过的备份,等于没有备份。
- 请看第一点。