线上数据错删,错更,如何快速回滚和恢复?

作为一名 coder 难免会操作线上 DB, 即使细致,小心如我,职业生涯中还是存在一次错更数据库的操作,当时是批量更新一批订单的状态,由于少加了一个条件,导致很多正常订单的状态发生了改变。。

话说回来,我们一方面需要小心谨慎的同时,另一方面,一旦发生这种事故,我们要怎么做,有什么好的方案?

1 个解决方案

AllenJiang
中间件研发,关注微信公众号 : 小哈学Java, 回复"666", 即可免费领取10G学习&面试资料

常在河边走哪能不湿鞋。。

  • update 错数据

  • delete 错数据

  • drop 错数据

咋办?找 dba 恢复数据,恢复不了咋办,重要数据的丢失,会导致难以估量的损失,这个锅你背定了。

有人会说,从 从库 恢复不就行了,一般数据库集群的主从架构如下:

如果说有人执行了 删库操作,命令会同步给其他从库,导致线上所有库的数据都会被删除,无法恢复,所以说这种方案行不通。

这就需要 DBA 指定一套应对这种场景的恢复方案,下面说一说我所知道的常见方案:

方案一:全量备份 + 增量备份

这是 DBA 最常用的技能:

上面是全量备份,dba 定期(如一个月)将库文件全量备份一份。

上面是增量备份,dba 定期(如每天)将 binlog 增量备份。

倘若不小心删库了,恢复方案如下:

  • 1.将最近一次全量备份的全库找到,解压,应用;

  • 2.将最近一次全量备份的数据应用后,再将这个全量备份后的每一天的增量数据 binlog 找到,依次重放,直到删库操作之前的 binlog;

至此,恢复完毕 (DBA 需要对这种方案做定期演练,而不是理论上的方案,直到真出了问题,才做)!

Note: 全量备份 + 增量备份的恢复周期也非常长,可能是天级别的。

方案二:一小时延时从库

什么是一小时延时从库?

如上图所示,增加一个延时从库,这个从库不需要实时与主库保持同步,而是每隔一个小时同步一次主库,这个从库会与主库保持一个小时的数据差。

这样,当删库操作发生时,我们可以利用这一个小时的时间差来快速回复数据:

将一个小时延时从库最近一次同步时间到,执行删库之前的 binlog 找到,重放。快速恢复数据!

这个方案的优点是,能够快速找回数据,潜在的风险是,万一延时从库正在连上主库进行数据同步的这段时间内,发生了删库操作,也是无法恢复。

方案三:双份一小时延时从库

什么是双份一小时延时从库?

如图所示,两个一小时延时从库,他们连主库同步的时间差开半个小时。这样,如果说执行删库操作时,有一个延时从库在执行同步数据的操作,也能保证另一个延时从库数据的安全性,从而保证另一个延时从库保有半个小时前的数据,从而实施快速恢复。

这个方案的有点是没有意外的情况发生,但是缺点是资源利用率较低。

如何提高从库的资源利用率?

为了提高资源利用率,我们对某些业务场景下,对数据实时性没有那么太高要求的,走延时从库,例如:

  • 1.运营后台,产品后台

  • 2.BI 进行数据统计,同步

  • 3.研发进行数据抽样,调研等

总结:

保证数据的安全性是 DBA 第一要务:

1.全量备份 + 增量备份 + 定期演练;

2.一小时延时从库;

3.双份一小时延时从库 + 提高资源利用率