将 mysql 恢复到过去的任意特定时间?

将 mysql 恢复到过去的任意特定时间?

上周,我们的一名开发人员在生产 mysql master 上运行了一个更新查询update xxx set yyy=zzz,没有在哪里。我们每天 00:01 备份 mysql,他在 17:xx 做了这个备份,有没有办法将数据库恢复到过去的任何特定时间?显然我们不能每秒都拍摄快照。

恢复程序:

  1. 将 mysql 恢复到备份,比如 2017-06-11 00:01:00
  2. mysqlbinlog binglog* 到文本文件 queries.sql
  3. 删除 2017-06-11 00:01:00 之前的查询
  4. 删除以下查询update xxx set yyy=zzz
  5. mysql < 查询.sql

答案1

您需要从之前的备份中恢复。您只能ROLLBACK在事务期间进行恢复,即,如果您以 开始,BEGIN;您可以进行更改,然后使用 确认更改,或使用COMMIT;撤消更改ROLLBACK;。除此之外,没有其他撤消历史记录。

不需要每秒都进行备份,但如果存在再次发生这种情况的风险,您可以考虑更频繁地使用 sqldump - 或者不让开发人员使用生产数据库。

如果你有二进制日志启用后,你可以重做而不是撤消备份后所做的所有修改。由于二进制日志仅存储查询,而不是数据,因此必须从备份开始执行此操作,而不是从当前状态开始。如果错误发生在上周,那么现在可能不是一种选择,但至少对未来来说是个好选择。

错误在于update xxx set yyy=zzz;您只得到了一列包含错误数据。根据该列以及其他表对该数据的依赖程度,您可以防止将整个数据库恢复到上次备份的先前状态。如果幸运的话,您可以只从转储中取出这个特定的表并将查询修改为INSERT针对UPDATE单个列的查询。

相关内容