我在我的表中进行了错误的更新查询。
我忘了在WHERE子句中创建一个id字段。
这就更新了我所有的行。
如何恢复?
我没有后备...
发布于 2010-02-01 03:48:25
对不起,但是恢复一个被覆盖的MySQL数据库的机会通常接近于零。与删除文件不同,在大多数情况下,覆盖记录实际上和物理上都会覆盖现有数据。
为了准备好这里发生的任何事情,您应该停止MySQL服务器,并创建包含数据库的物理目录的副本,这样就不会再有任何东西被覆盖:将data文件夹复制到不同位置的简单copy+paste就可以了。
但是不要抱太大希望--我认为真的什么都做不了。
您可能希望设置一个频繁的数据库备份,以备将来使用。有很多解决方案;最简单、最可靠、最容易自动化的解决方案之一(在Linux中使用at或cron,在Windows中使用任务调度程序)是MySQL自己的。
发布于 2010-02-01 06:16:53
这里有两个经验教训:
,则可以使用ROLLBACK
了解数据库的事务(自动提交、显式和隐式)处理可以使您不必从备份中恢复数据。
事务控制数据操作语句,以确保它们是原子的。“原子”意味着事务要么发生,要么不发生。向数据库发出事务完成信号的唯一方法是使用COMMIT或ROLLBACK语句(根据ANSI-92,遗憾的是,该语句不包括用于创建/开始事务的语法,因此它是特定于供应商的)。COMMIT应用事务中所做的更改(如果有)。ROLLBACK 会忽略事务中发生的任何操作-当UPDATE/DELETE语句执行一些意外的操作时,这是非常理想的。
通常,单个DML (Insert、Update、Delete)语句在自动提交事务中执行-只要语句成功完成,这些语句就会提交。这意味着在像您这样的情况下,没有机会将数据库回滚到语句运行之前的状态。当出现问题时,唯一可用的恢复选项是从备份重建数据(前提是备份存在)。在MySQL中,autocommit is by default for InnoDB - MyISAM不支持事务。可以使用以下命令禁用它:
SET autocommit = 0显式事务是指语句包装在显式定义的事务代码块for MySQL, that's START TRANSACTION中。它还需要在事务结束时显式创建COMMIT或ROLLBACK语句。嵌套事务不在本主题的讨论范围内。
隐式事务与显式事务略有不同。隐式事务不需要显式地定义事务。但是,与显式事务一样,它们需要提供COMMIT或ROLLBACK语句。
结论
显式事务是最理想的解决方案-它们需要一条语句COMMIT或ROLLBACK来完成事务,并且所发生的事情被清楚地陈述出来,以便其他人在需要时阅读。如果以交互方式使用数据库,则可以使用隐式事务,但是只有在测试结果完全确定为有效之后,才应该指定COMMIT语句。
这意味着你应该使用:
SET autocommit = 0;
START TRANSACTION;
UPDATE ...;仅当结果正确时,...and才使用COMMIT;。
也就是说,UPDATE和DELETE语句通常只返回受影响的行数,而不返回具体的详细信息。将这样的语句转换为SELECT语句&在尝试UPDATE/DELETE语句之前,检查结果以确保正确性。
附录
DDL (数据定义语言)语句是自动提交的-它们不需要COMMIT语句。即:表、索引、存储过程、数据库和视图创建或更改语句。
发布于 2010-02-01 03:46:17
很抱歉这么说,但是没有备份就无法恢复旧的字段值。
不要射杀信使。
https://stackoverflow.com/questions/2173049
复制相似问题