如何回滚 MySQL 中的最后一个删除命令?

Posted

技术标签:

【中文标题】如何回滚 MySQL 中的最后一个删除命令?【英文标题】:How can I roll back my last delete command in MySQL? 【发布时间】:2011-01-22 07:54:54 【问题描述】:

我不小心从表中删除了大量行...

如何回滚?

我使用PuTTY 执行了查询。

如果你们中的任何人能指导我安全地离开这里,我将不胜感激......

【问题讨论】:

虽然可能已经晚了,但也请查看 Phil 关于二进制日志记录的答案。 【参考方案1】:

如果你还没有进行备份,那你就被蒙骗了。

【讨论】:

所以没有办法撤消它......糟糕,我做错了......我应该在实际执行查询之前使用选择查询来列出我应该删除的内容......一个不错教训倾向于更加谨慎 很遗憾就是这样。是的,在使用 delete 或 update 之前使用 select 进行验证总是一个好主意。 这是标准数据库的缺陷之一:它们没有历史,只有“现在”的巨大记忆。 我认为这是设计使然。保存历史非常昂贵。你希望你的数据库是快速的,而不是宽容的。 @OmryYadan 但这就是您撤消自上次commit 以来的所有查询的方式,对吧? rollback?【参考方案2】:

如果您尚未提交事务,请尝试rollback。如果您已经提交了交易(通过手动执行commit或通过退出命令行客户端或autocommit 987654325 1这是默认),则必须从上次备份中恢复数据。

为防止将来发生此类事情,请在任何危险工作之前使用SET autocommit=0。任何更改都将保留在您当前的事务中,直到您提交它们。详情见https://dev.mysql.com/doc/refman/8.0/en/innodb-autocommit-commit-rollback.html

【讨论】:

默认情况下,命令行客户端在每个命令后使用自动提交。 @Vijay:只需输入“rollback;” + ENTER 这确实可行.. 但当且仅当他在执行删除查询时明确使用事务,否则他不能“回滚”。 这应该是接受的答案,而不是当前接受的答案。当前基本上是在说“你搞砸了”。 @AaronDigulla 您的答案需要更新。如果启用自动提交并且启用自动提交是默认选项,则回滚将不起作用。如果在事故发生之前禁用自动提交('SET autocommit=0'),则“回滚将起作用”。请更新您的答案,因为您的答案是公认的答案,人们可​​能会感到困惑。【参考方案3】:

“回滚”仅在您使用 transactions 时有效。这样,您可以将查询组合在一起,并在只有一个查询失败时撤消所有查询。

但是,如果您已经提交了事务(或使用了常规的 DELETE 查询),那么取回数据的唯一方法就是从之前的备份中恢复它。

【讨论】:

【参考方案4】:

在开始查询之前使用BEGIN TRANSACTION 命令。这样您就可以随时ROLLBACK 事物。

例如:

    开始交易 从学生中选择 * 从 Id=2 的学生中删除 从学生中选择 * 回滚 从学生中选择 *

【讨论】:

在我的 MySQL Shell 中,它是 START TRANSACTION 而不是 BEGIN TRANSACTION【参考方案5】:

接受的答案并不总是正确的。如果您在 MySQL 上配置二进制日志,您可以将数据库回滚到您仍然拥有快照和二进制日志的任何先前点。

7.5 Point-in-Time (Incremental) Recovery Using the Binary Log 是了解该设施的良好起点。

【讨论】:

我有一个疑问。如果启用了二进制日志记录,我认为它将覆盖 mysql 服务器下的数据库。所以我们必须考虑的事情,1.如果我们使用这个选项来恢复一个 db,我们最终会恢复所有 2。我是对的,即使我们使用二进制日志进行时间点恢复,它当我们有服务器/数据库的备份以开始恢复过程时会有所帮助..【参考方案6】:

在 MySQL 中:

start transaction;

savepoint sp1;

delete from customer where ID=1;

savepoint sp2;

delete from customer where ID=2;

rollback to sp2;

rollback to sp1;

【讨论】:

【参考方案7】:

如果要回滚数据,首先需要执行autocommit =0,然后执行查询删除、插入或更新。

执行完查询再执行回滚……

【讨论】:

【参考方案8】:

我还从我的开发数据库中删除了一些值,但我在 QA 数据库中有相同的副本,所以我做了一个生成脚本并将选项“脚本的数据类型”选择为“仅数据”并选择了我的表。

然后我得到具有相同数据的插入语句,然后在我的开发数据库上运行脚本。

【讨论】:

【参考方案9】:

在 Oracle 中,这不是问题:

SQL> delete from Employee where id = '01';

1 row deleted.

SQL> select id, last_name from Employee where id = '01';

no rows selected

SQL> rollback;

Rollback complete.

SQL> select * from Employee  where id = '01';

ID   FIRST_NAME LAST_NAME  START_DAT END_DATE      SALARY CITY       DESCRIPTION
---- ---------- ---------- --------- --------- ---------- ---------- ---------------
01   Jason      Martin     25-JUL-96 25-JUL-06    1234.56 Toronto    Programmer

【讨论】:

您可以在任何支持事务的 SQL 数据库中执行相同的操作。 OP 的问题尚不清楚,但我认为他们已经提交了事务,现在回滚为时已晚。【参考方案10】:

回滚通常不适用于这些删除功能,当然只有备份才能救你。

如果没有备份,则无法恢复它,因为删除查询在 PuTTY 上运行,使用 .sql 文件的 Derby 会在您触发删除查询后自动提交。

【讨论】:

以上是关于如何回滚 MySQL 中的最后一个删除命令?的主要内容,如果未能解决你的问题,请参考以下文章

如何回滚到以前的迁移并删除架构中的表和列?

Schema::dropIfExists() 在迁移时删除数据库中的所有表:回滚

如何使用git回滚版本到分支中的某一个commit时间点

mysql命令行下怎样实现数据的回滚操作

关于MySQL回滚机制

mysql 数据被清空了怎么恢复