在 MySQL 中提交后有啥方法可以回滚吗?

Posted

技术标签:

【中文标题】在 MySQL 中提交后有啥方法可以回滚吗?【英文标题】:Is there any way to rollback after commit in MySQL?在 MySQL 中提交后有什么方法可以回滚吗? 【发布时间】:2012-12-10 13:50:26 【问题描述】:

我犯了一个大错误,我在 mysql 中更新了一个没有 'where' 子句的表:'(

它是自动提交的。

有什么办法可以回滚吗?

【问题讨论】:

没有。你有备份,我猜? 很遗憾我没有备份:'( 糟糕!嗯,这是一个值得学习的好课 :) 如果这是一个手动查询,听起来像是,尝试使用 MySQL Workbench 之类的工具,它具有安全开关功能,可以防止在没有“where”子句的情况下进行更新等错误。跨度> 我在做同样的事情后感到你的痛苦。我猜你是从错误中学习的。 听起来很简单......在 UPDATE 部分之前编写 WHERE 部分始终是避免此类情况的好主意。另一个技巧是首先编写一个 SELECT 以查看哪些行将要更新,然后在确认查询将更新正确的行后将 SELECT 更改为 UPDATE。 【参考方案1】:

不,没有任何查询可以“撤消”已提交的数据修改查询。

如果您有数据库的备份,您可以恢复备份并使用 DBA 工具(在 MySQL 的情况下,它是 mysqlbinlog)从备份回数据库后的日志中“重放”所有数据修改查询,但跳过问题查询。

如果您没有备份以及自该备份以来的所有日志,则您无法恢复数据。

【讨论】:

您能推荐任何可以做到这一点的 DBA 工具吗? 我得到了同样的答案,“不。”来自我公司的 DBA。但我怀疑你的第二个语句没有备份和二进制日志是可能的。 @JohnnyLim 回复有点晚我知道,但用于 mysql 的工具是 mysqlbinlog(答案已更新)【参考方案2】:

查找事务日志。我会更新更多信息,但日志可能只会保留有限的时间,所以时间至关重要!

见:http://dev.mysql.com/doc/refman/5.0/en/point-in-time-recovery.html

【讨论】:

事务日志的名称是什么? ib_logfile0, ib_logfile1? 不幸的是我也不使用二进制日志:'(从二进制日志恢复需要二进制日志没有的基础备份,对吧? 是的,这就是为什么我说这就像手术一样。从那时起,您需要完整的备份和所有日志。它非常复杂,需要很长时间。只有当任务关键数据被意外删除时,您才会这样做。这就是为什么应该进行定期(至少每周)完整备份的原因。 DBA 应该练习这种场景,以便在需要时快速自信地完成。【参考方案3】:

如果您启用了 mysql binlog 并且它是基于 ROW 的格式,那么您可以获取更新前后每一行的值。使用它可以恢复表的状态。

【讨论】:

以上是关于在 MySQL 中提交后有啥方法可以回滚吗?的主要内容,如果未能解决你的问题,请参考以下文章

PLSQL事务提交了,要怎么回滚

什么是事务事务中的提交和回滚是什么意思

java 事务方法调用非事务函数会回滚吗

请问oracle commit以后还能再回滚吗,rollback必须写在commit之前吗

如果在提交时抛出异常,C# TransactionScope 会回滚吗?

mysqli_commit 失败会自动回滚吗?