【问题标题】:How can I undo a mysql statement that I just executed?如何撤消刚刚执行的 mysql 语句?
【发布时间】:2011-02-24 12:27:26
【问题描述】:

如何撤消最近执行的 mysql 查询?

【问题讨论】:

  • 这听起来像是“糟糕,我刚刚删除了数据库”。
  • 也需要帮助。我刚刚清空了由代码错误引起的所有表
  • ... 很容易成为一个糟糕的 WHERE 子句!
  • 那个链接可能对percona.com/blog/2012/02/20/…有帮助

标签: mysql rollback


【解决方案1】:

如果将表类型定义为 InnoDB,则可以使用事务。您需要设置AUTOCOMMIT=0,然后您可以在查询或会话结束时发出COMMITROLLBACK 来提交或取消交易。

ROLLBACK -- will undo the changes that you have made

【讨论】:

    【解决方案2】:

    您只能在交易期间这样做。

    BEGIN;
    INSERT INTO xxx ...;
    DELETE FROM ...;
    

    那么你可以:

    COMMIT; -- will confirm your changes
    

    或者

    ROLLBACK -- will undo your previous changes
    

    【讨论】:

      【解决方案3】:

      基本上:如果您正在执行事务,只需执行回滚即可。否则,您无法“撤消” MySQL 查询。

      【讨论】:

        【解决方案4】:

        对于某些指令,例如 ALTER TABLE,这在 MySQL 中是不可能的,即使是事务(12)。

        【讨论】:

          【解决方案5】:

          您可以停止正在处理的查询

          通过=> show processlist;找到查询进程的Id;

          然后 => 杀死 id;

          【讨论】:

            【解决方案6】:

            如果您不仅需要撤消上一个查询(尽管我知道您的问题实际上只指出了这一点),因此如果交易可能无法帮助您,您需要为此实施解决方法:

            在提交查询之前复制原始数据,并根据两个表中必须相同的唯一 ID 按需将其写回;您的回滚表(带有未更改数据的副本)和您的实际表(包含应该“撤消”的数据)。 对于具有许多表的数据库,一个包含原始数据的结构化转储/副本的单个“回滚表”会比每个实际表使用一个更好。它将包含实际表的名称、行的唯一 ID,以及在第三个字段中以任何所需格式清楚表示数据结构和值的内容(例如 XML)。根据前两个字段,第三个字段将被解析并写回实际表。带有时间戳的第四个字段将有助于清理此回滚表。

            尽管在事务中“回滚”,但 SQL 方言中没有真正的撤消(如果我错了,请纠正我 - 也许现在有一个),我猜这是唯一的方法,你必须自己写代码。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-11-29
              • 2011-02-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多