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

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

如何回滚?

我使用PuTTY 执行了查询。

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

【问题讨论】:

  • 虽然可能已经晚了,但也请查看 Phil 关于二进制日志记录的答案。

标签: mysql sql sql-delete rollback


【解决方案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 事物。

    例如:

    1. 开始交易
    2. 从学生中选择 *
    3. 从 Id=2 的学生中删除
    4. 从学生中选择 *
    5. 回滚
    6. 从学生中选择 *

    【讨论】:

    • 在我的 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 会在您触发删除查询后自动提交。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-06-17
            • 1970-01-01
            • 1970-01-01
            • 2022-10-15
            • 1970-01-01
            • 2018-12-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多