我可以回滚已经提交的事务吗? (数据丢失)

2023-11-30

我犯了错误UPDATE声明并丢失了一些数据。

在我已经提交之后现在可以回滚吗?

有什么帮助吗?

ROLLBACK

says NOTICE: there is no transaction in progress.


不,您无法撤消、回滚或反转提交。

停止数据库!

(注意:如果您从文件系统中删除了数据目录,请不要停止数据库。以下建议适用于意外提交DELETE或类似的,不是rm -rf /data/directory设想)。

如果这个数据很重要的话立即停止您的数据库并且不要重新启动它。使用pg_ctl stop -m immediate以便在关闭时不运行检查点。

事务一旦提交就无法回滚。您将需要从备份中恢复数据,或使用时间点恢复,必须已设置before事故发生了。

如果您没有设置任何 PITR / WAL 归档并且没有备份,那么您就有麻烦了。

紧急缓解措施

一旦数据库停止,您应该制作整个数据目录的文件系统级副本 - 包含以下内容的文件夹base, pg_clog等复制所有的到一个新的地点。不要对新位置中的副本执行任何操作,如果您没有备份,这是恢复数据的唯一希望。如果可以的话,在可移动存储上再制作一份副本,然后从计算机上拔下该存储。请记住,你需要绝对每个部分数据目录,包括pg_xlog等等。没有一部分是不重要的。

具体如何制作副本取决于您运行的操作系统。数据目录的位置取决于您运行的操作系统以及 PostgreSQL 的安装方式。

一些数据可以保存下来的方法

如果您足够快地停止数据库,您可能有希望从表中恢复一些数据。那是因为 PostgreSQL 使用多版本并发控制(MVCC)管理对其存储的并发访问。有时会写新版本您更新到表的行的数量,保留旧行但标记为“已删除”。一段时间后自动真空出现并将行标记为可用空间,以便以后可以覆盖它们INSERT or UPDATE。因此,旧版本的UPDATEd 行可能仍然存在,但无法访问。

此外,Pg 分两个阶段写入。第一个数据被写入预写日志(WAL)。只有当它被写入 WAL 并命中磁盘后,它才会被复制到“堆”(主表),可能会覆盖那里的旧数据。 WAL 内容被复制到主堆bgwriter并通过定期检查站。默认情况下,检查点每 5 分钟发生一次。如果您设法在检查点发生之前停止数据库,并通过硬终止数据库、拔掉机器上的插头或使用pg_ctl in immediate模式下,您可能已经在检查点发生之前捕获了数据,因此您的旧数据更有可能仍在堆中。

现在您已经制作了数据目录的完整文件系统级副本,如果确实需要,您可以启动数据库备份;数据仍然会消失,但您已经尽了一切努力,给自己一些恢复数据的希望。如果可以选择,为了安全起见,我可能会关闭数据库。

Recovery

您现在可能需要聘请 PostgreSQL 内部专家协助您尝试数据恢复。准备好支付专业人士的时间,可能是相当长的时间。

我在 Pg 邮件列表上发布了有关此内容的信息,并且Егоров 链接到 depesz 在 pg_dirtyread 上的帖子,这看起来正是你想要的,尽管它没有恢复TOAST编辑数据,因此其实用性有限。尝试一下,如果幸运的话可能会成功。

See: GitHub 上的 pg_dirtyread.

我删除了我在本节中编写的内容,因为它已被该工具废弃。

也可以看看PostgreSQL 行存储基础知识

预防

请参阅我的博客条目防止 PostgreSQL 数据库损坏.


在半相关的旁注中,如果您使用两阶段提交你可以ROLLBACK PREPARED对于准备提交但未完全提交的事务。这大约是您最接近回滚已提交事务的方法,并且不适用于您的情况。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以回滚已经提交的事务吗? (数据丢失) 的相关文章

  • 从 Django 调用 Postgres SQL 存储过程

    我正在开发一个带有 Postgresql 数据库的 Django 项目 我编写了一个可以在 Postgres 上完美运行的存储过程 现在我想从 Django 1 5 调用该存储过程 我已经编写了代码 但它提示错误 CREATE FUNCTI
  • Android中不同线程的数据库访问

    我有一个在 AsyncTasks 中从互联网下载数据的服务 它解析数据并将其存储在数据库中 该服务持续运行 当服务写入数据库时 活动会尝试从数据库中读取更改 我有一个数据库助手 有多种写入和读取方法 这会导致问题吗 可能尝试从两个不同的线程
  • 如何更新 pl/sql 中嵌套表的列? [复制]

    这个问题在这里已经有答案了 我正在尝试在表中创建一个可以存储多个值的列 如下所示 我有一个学生id std和一个名为marks可以采用几个值 例如2 3 4 我想更新此列表以添加另一个标记2 3 4 5但我不知道怎么做 我如何更新专栏mar
  • Postgres JSON 数据类型 Rails 查询

    我正在使用 Postgres 的 json 数据类型 但想要使用嵌套在 json 中的数据进行查询 排序 我想在 json 数据类型上使用 where 进行订购或查询 例如 我想查询关注者数量 gt 500 的用户 或者我想按关注者或关注数
  • 自动删除主键序列中的间隙

    我正在创建一个网页 该网页根据用户操作将数据存储到 MySQL 数据库中 数据库有很多行 行的主键是列 rowID 它只是按顺序对行进行编号 例如 1 2 3 4 用户可以选择删除行 问题是当用户删除最后一行以外的行时 rowID 中有一个
  • 本地 Postgres 实例和 Azure Cloud Postgres 实例之间的实时同步

    我需要在本地 postgresql 实例与云 postgresql 实例之间设置实时同步过程 请让我知道我可以通过哪些选项来实现它 我是否必须使用任何特定工具或者可以通过复制进行管理 请指教 使用 PgPool http www pgpoo
  • postgreSQL 在 WAMP 上的集成

    我刚刚在 Windows 7 上安装了 postgreSQL 我正在尝试将 postgreSQL 与 WAMP 服务器集成 为此 我在 httpd conf 和 php ini 文件中进行了以下更改 1个加载模块c path to libp
  • 部分唯一索引不适用于冲突子句 PostgreSQL

    表结构 create table example a id integer b id integer c id integer flag integer 部分索引 create unique index u idx on example a
  • 什么是“数据库实体”以及哪些类型的 DBMS 项目被视为实体? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • SSDT SQL Server 数据库项目中用于架构比较的命令行/API?

    在 Visual Studio 2012 中 我们有Schema Compare http msdn microsoft com en us library hh272690 28v vs 103 29 aspx in SSDT http
  • 如何加速spark df.write jdbc到postgres数据库?

    我是 Spark 新手 正在尝试使用 df write 加速将数据帧的内容 可以有 200k 到 2M 行 附加到 postgres 数据库 df write format jdbc options url psql url spark d
  • AWS RDS MySql - 如何在设置“公开可用”后允许访问

    刚刚使用默认设置和用户 密码创建了新的 AWS RDS MySql 实例 我也将其设置为publicly available并在此过程中创建新的 VPC 目前无法从我的笔记本电脑连接到此 RDS mysql h endpoint u myu
  • postgresql 不同的不工作

    我使用以下代码从数据库获取值 但是当我编写这段代码时 测试看看问题出在哪里 我注意到查询没有从数据库中获取不同的值 这是查询 select distinct ca id as id acc name as accName pIsu name
  • 在laravel中组合两个不同的无关系数据库表查询进行分页

    我的数据库中有两个不相关的表 我需要将它们合并 以便我可以将其放在我的搜索视图中 但我不知道是否可能 这是我的代码 这news and season表不相关 但它们具有相似的列 我试图将其放入一个对象中以便于分页 是否可以 search r
  • 巩固 Django 南迁移

    在我的项目的初始阶段 我对模型进行了很多更改 因此我最终为我的应用程序生成了很多向南迁移 在转到我的生产服务器执行迁移之前 是否可以以任何方式整合它们 这样我就不会为每个应用程序进行一百万次迁移 如果是这样 我该怎么做呢 您始终可以删除现有
  • 如何在 PostgreSQL 中返回不同时区的当前日期

    我正在开发一个使用东部时间并将数据库设置为太平洋时间的应用程序 这已经引起了一些问题 但我们被告知不可能有其他方式 所以我们只能解决它 不管怎样 我遇到的麻烦之一就是获取今天的约会 由于数据库位于太平洋 如果我使用以下命令询问今天的日期cu
  • 将自动增量列添加到按日期排序的现有表中

    我在数据库中有一个名为 tickets 的现有表 其中包含以下列 id string Primary Key contains UUID like e6c49164 545a 43a1 845f 73c5163962f2 date bigi
  • PostgreSQL:删除数据库但数据库仍然存在[重复]

    这个问题在这里已经有答案了 我是 PostgreSQL 的新手 我尝试着理解它 我熟悉数据库和MySQL 我正在尝试删除我创建的数据库 因为 psql 似乎忽略了我尝试通过 Django 推送的更改 当我执行时 l我得到以下回复 List
  • 研究MySQL、SQLite源码了解RDBMS实现[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我知道实现数据库是一个很大的话题 但我想通过研究数据库系统的源代码来基本了解数据库系统的工作原理 例如
  • 如何在 phalcon 框架中同时连接多个数据库在模型类中同时使用两个而不仅仅是一个

    在我的代码中我有两个数据库ABC and XYZ 我想在同一模型中使用两个数据库 而不是 phalcon 中的解决方案是什么 如何为此实现多个数据库连接 one

随机推荐