如何回滚 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 中的最后一个删除命令?的主要内容,如果未能解决你的问题,请参考以下文章