首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在错误的MySQL更新查询后恢复?

问在错误的MySQL更新查询后恢复?
EN

Stack Overflow用户
提问于 2010-02-01 03:43:35
回答 4查看 34K关注 0票数 14

我在我的表中进行了错误的更新查询。

我忘了在WHERE子句中创建一个id字段。

这就更新了我所有的行。

如何恢复?

我没有后备...

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-02-01 03:48:25

对不起,但是恢复一个被覆盖的MySQL数据库的机会通常接近于零。与删除文件不同,在大多数情况下,覆盖记录实际上和物理上都会覆盖现有数据。

为了准备好这里发生的任何事情,您应该停止MySQL服务器,并创建包含数据库的物理目录的副本,这样就不会再有任何东西被覆盖:将data文件夹复制到不同位置的简单copy+paste就可以了。

但是不要抱太大希望--我认为真的什么都做不了。

您可能希望设置一个频繁的数据库备份,以备将来使用。有很多解决方案;最简单、最可靠、最容易自动化的解决方案之一(在Linux中使用at或cron,在Windows中使用任务调度程序)是MySQL自己的。

票数 13
EN

Stack Overflow用户

发布于 2010-02-01 06:16:53

这里有两个经验教训:

  1. Backup data
  2. 在事务内执行UPDATE/DELETE语句,因此,如果事情没有按计划进行

,则可以使用ROLLBACK

了解数据库的事务(自动提交、显式和隐式)处理可以使您不必从备份中恢复数据。

事务控制数据操作语句,以确保它们是原子的。“原子”意味着事务要么发生,要么不发生。向数据库发出事务完成信号的唯一方法是使用COMMIT或ROLLBACK语句(根据ANSI-92,遗憾的是,该语句不包括用于创建/开始事务的语法,因此它是特定于供应商的)。COMMIT应用事务中所做的更改(如果有)。ROLLBACK 会忽略事务中发生的任何操作-当UPDATE/DELETE语句执行一些意外的操作时,这是非常理想的。

通常,单个DML (Insert、Update、Delete)语句在自动提交事务中执行-只要语句成功完成,这些语句就会提交。这意味着在像您这样的情况下,没有机会将数据库回滚到语句运行之前的状态。当出现问题时,唯一可用的恢复选项是从备份重建数据(前提是备份存在)。在MySQL中,autocommit is by default for InnoDB - MyISAM不支持事务。可以使用以下命令禁用它:

代码语言:javascript
复制
SET autocommit = 0

显式事务是指语句包装在显式定义的事务代码块for MySQL, that's START TRANSACTION中。它还需要在事务结束时显式创建COMMIT或ROLLBACK语句。嵌套事务不在本主题的讨论范围内。

隐式事务与显式事务略有不同。隐式事务不需要显式地定义事务。但是,与显式事务一样,它们需要提供COMMIT或ROLLBACK语句。

结论

显式事务是最理想的解决方案-它们需要一条语句COMMIT或ROLLBACK来完成事务,并且所发生的事情被清楚地陈述出来,以便其他人在需要时阅读。如果以交互方式使用数据库,则可以使用隐式事务,但是只有在测试结果完全确定为有效之后,才应该指定COMMIT语句。

这意味着你应该使用:

代码语言:javascript
复制
SET autocommit = 0;

START TRANSACTION;
  UPDATE ...;

仅当结果正确时,...and才使用COMMIT;。

也就是说,UPDATE和DELETE语句通常只返回受影响的行数,而不返回具体的详细信息。将这样的语句转换为SELECT语句&在尝试UPDATE/DELETE语句之前,检查结果以确保正确性。

附录

DDL (数据定义语言)语句是自动提交的-它们不需要COMMIT语句。即:表、索引、存储过程、数据库和视图创建或更改语句。

票数 15
EN

Stack Overflow用户

发布于 2010-02-01 03:46:17

很抱歉这么说,但是没有备份就无法恢复旧的字段值。

不要射杀信使。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2173049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档