如何在PostgreSQL中回滚更新

22

在Ubuntu Lucid下,我使用终端中的SQL编辑PostgreSQL数据库记录时,不小心进行了错误的更新。

我原本想进行的应该是-

update mytable set start_time='13:06:00' where id=123;

我键入了 -

update mytable set start_time='13:06:00';

现在,所有的记录都具有相同的start_time值。

是否有办法撤销此更改?该表中有500多条记录,我不知道每条记录的start_time值是什么。

它永远丢失了吗?


6
未来应禁用自动提交功能以避免问题。 - user330315
学到的经验教训!在进行更新之前,一定要备份!如果您启用了时点恢复(PITR),这是可能的。 - jerjer
2个回答

18

我假定这是一个已经提交的事务? 如果是,那就是"commit"(提交)的意思,你无法撤回。

如果你很幸运,有些数据可能是可以恢复的。现在停止数据库操作。

这是我之前写的关于同一主题的答案,希望对你有所帮助。

这个也许会有用:恢复删除的postgresql行

除非数据绝对重要,否则只需从备份中还原即可,这将更容易且不会造成伤害。如果你没有备份,那么你就太惨了。


谢谢。我停止了Postgres服务。现在有什么办法可以恢复数据吗? - damon
1
@damon 请对整个数据库进行文件系统级别的备份,并将其放置在安全的位置。 - Craig Ringer

3
如果您发现错误并立即关闭使用数据库的任何应用程序并将其下线,则可以潜在地使用时间点恢复(PITR)来重放您的写前日志(WAL)文件,直到发生有误事务之前,但不包括该时刻。这将使数据库返回到先前的状态,从而有效地“撤消”该事务。
作为生产应用程序数据库的方法,它具有明显的限制,但在发生关键数据丢失的情况下,可能是可用的最佳选项之一。但是,如果在损坏事件之前没有配置归档,则其价值为零。
其他关系型数据库引擎也具有类似的功能。 https://www.postgresql.org/docs/current/static/continuous-archiving.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接