上周,我们的一名开发人员在生产 mysql master 上运行了一个更新查询update xxx set yyy=zzz
,没有在哪里。我们每天 00:01 备份 mysql,他在 17:xx 做了这个备份,有没有办法将数据库恢复到过去的任何特定时间?显然我们不能每秒都拍摄快照。
恢复程序:
- 将 mysql 恢复到备份,比如 2017-06-11 00:01:00
- mysqlbinlog binglog* 到文本文件 queries.sql
- 删除 2017-06-11 00:01:00 之前的查询
- 删除以下查询
update xxx set yyy=zzz
- mysql < 查询.sql
答案1
您需要从之前的备份中恢复。您只能ROLLBACK
在事务期间进行恢复,即,如果您以 开始,BEGIN;
您可以进行更改,然后使用 确认更改,或使用COMMIT;
撤消更改ROLLBACK;
。除此之外,没有其他撤消历史记录。
不需要每秒都进行备份,但如果存在再次发生这种情况的风险,您可以考虑更频繁地使用 sqldump - 或者不让开发人员使用生产数据库。
如果你有二进制日志启用后,你可以重做而不是撤消备份后所做的所有修改。由于二进制日志仅存储查询,而不是数据,因此必须从备份开始执行此操作,而不是从当前状态开始。如果错误发生在上周,那么现在可能不是一种选择,但至少对未来来说是个好选择。
错误在于update xxx set yyy=zzz;
您只得到了一列包含错误数据。根据该列以及其他表对该数据的依赖程度,您可以防止将整个数据库恢复到上次备份的先前状态。如果幸运的话,您可以只从转储中取出这个特定的表并将查询修改为INSERT
针对UPDATE
单个列的查询。