广告
返回顶部
首页 > 资讯 > 数据库 >PostgreSQL中删除的数据能否恢复
  • 736
分享到

PostgreSQL中删除的数据能否恢复

2024-04-02 19:04:59 736人浏览 八月长安
摘要

作者:沃趣科技首席数据库架构师 唐成问题的提出有人问postgresql数据库中刚刚删除的数据能否被恢复?或更进一步,如果如要在一个事务中做了一系列的更新、删除、插入的操作后,把这个事务提交之后又后悔了,能

作者:沃趣科技首席数据库架构师 唐成



问题的提出


  • 有人问postgresql数据库中刚刚删除的数据能否被恢复?

  • 或更进一步,如果如要在一个事务中做了一系列的更新、删除、插入的操作后,把这个事务提交之后又后悔了,能否恢复到之前的状态?


当然如果数据库有备份,可以直接从备份的数据中恢复,本文讨论的是没有备份的情况下能否恢复。 


理论分析

从Postgresql多版本实现的原理上,这是有可能的。因为PostgreSQL的多版本原理是旧数据并不删除: 

  • 对于删除数据的操作,只是把行上的xmax改成当前的事务id

  • 对于更新操作,只是把原先行上xmax改成当前的事务id,并插入一个新行,而新行上的xmin置为当前的事务id

  • 事务的状态是记录在commit log中的,如果事务提交,只是把commit log中相应的事务状态改成“已提交状态(TRANSACTioN_STATUS_COMMITTED )”,如果事务回滚,则把commit log中的事务状态改成“事务回滚(TRANSACTION_STATUS_ABORTED )”


所以从理论上说,只要把在commit log中刚提交事务状态从“TRANSACTION_STATUS_COMMITTED”改成“TRANSACTION_STATUS_ABORTED”,原先的事务就会做废,就能回到事务之前的状态。 

但这个恢复有一个前提就是旧版本的数据没有被vacuum垃圾回收进程清理掉,如果旧版本的数据已被vacuum垃圾回收进程给清理掉了,就不能恢复了。所以如果作了删除数据的操作后,马上把数据库停下来,这时autovacuum进程还没有把旧版本的数据给清理掉时,数据是可以恢复的。 

但仅仅是把commit log中的事务状态改一下,就能恢复数据吗?答案也是否定的,事情没有这么简单,原因是多版本的可见性判断不仅仅是由commit log中的事务状态的决定的,行上还有t_infomask状态位中的hint信息来决定。如果hint已表示该行上的事务已被提交,则不需要再到commit log中来查看事务的状态了。这个功能主要是为了提高性能,因为到clog中判断行的可见性,而clog中只有8个块是缓存在共享内存中的,如果判断每个行都去查找clog,效率太低了。具体这一部分的内容可以见我的另一篇blog: PostgreSQL中行的可见性判断中t_infomask字段的作用 

所以要想恢复数据,还需要把相应表文件中各行上的t_infomask状态中的hint标志位给清除掉之后,数据才能恢复回来。 


恢复的工具

因为整个恢复的过程比较复杂,为此我写了一个工具叫pg_fix,放在GitHub上:https://github.com/osdba/pg_fix,供大家研究使用。 

首先使用这个工具可以查询某一个表的数据文件中各行的状态: PostgreSQL中删除的数据能否恢复


使用这个工具可以清理表的数据文件中的t_infomask中的hint信息,在清理hint状态之前,先查看行上的t_maskinfo状态:  PostgreSQL中删除的数据能否恢复


然后执行下面命令清除行上的hint状态:  PostgreSQL中删除的数据能否恢复


清除完后,我们再看行上的t_infomask状态:  PostgreSQL中删除的数据能否恢复


查询和改变事务的状态的方法如下: 

查询事务xid=11的状态的命令如下:  PostgreSQL中删除的数据能否恢复


修改事务xid=11的状态的命令如下:  PostgreSQL中删除的数据能否恢复


其中-s后的值表示要把事务改成什么状态,事务的状态值有四种,为0~3,意思如下: 

  • #define TRANSACTION_STATUS_IN_PROGRESS 0x00

  • #define TRANSACTION_STATUS_COMMITTED 0x01

  • #define TRANSACTION_STATUS_ABORTED 0x02

  • #define TRANSACTION_STATUS_SUB_COMMITTED 0x03


当然上面使用pg_fix工具直接修改表中数据和commit log中事务的状态都必须是数据库停下来的情况。 

另本文的目的主要是为了研究PostgreSQL的一些原理,所以以上这些操作通常不要拿到生产数据库上去试!!!




您可能感兴趣的文档:

--结束END--

本文标题: PostgreSQL中删除的数据能否恢复

本文链接: https://www.lsjlt.com/news/50967.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • PostgreSQL中删除的数据能否恢复
    作者:沃趣科技首席数据库架构师 唐成问题的提出有人问PostgreSQL数据库中刚刚删除的数据能否被恢复?或更进一步,如果如要在一个事务中做了一系列的更新、删除、插入的操作后,把这个事务提交之后又后悔了,能...
    99+
    2022-10-18
  • 云服务器数据删除能恢复吗
    云服务器数据删除是指已经不再使用或者丢失的数据被删除或者被格式化了。如果云服务器发生数据删除,它可能无法恢复。 如果云服务器已经删除或丢失数据,您可能需要使用其他数据恢复工具,如数据恢复软件,来恢复数据。在选择恢复工具时,需要仔细考虑数据...
    99+
    2023-10-26
    服务器 数据
  • plsql删除的数据如何恢复
    在PL/SQL中删除的数据无法直接恢复。一旦数据从数据库中删除,它们将无法恢复。然而,你可以通过以下方法尝试恢复数据:1.备份恢复:...
    99+
    2023-09-09
    plsql
  • mysql删除的数据如何恢复
    在MySQL中,一旦数据被删除,它将无法直接恢复。因此,为了能够恢复删除的数据,你需要依赖备份和恢复机制。以下是一些可行的方法:1....
    99+
    2023-09-22
    mysql
  • Oracle恢复删除数据的方法
    Oracle数据库提供了以下几种方法来恢复删除的数据:1. 通过闪回技术(Flashback Technology):Oracle提...
    99+
    2023-09-01
    Oracle
  • oracle删除的数据如何恢复
    如果使用DELETE语句删除了数据,Oracle数据库是没有内置的恢复机制来撤销删除操作的。因此,一旦数据被删除,恢复数据的唯一方法...
    99+
    2023-08-31
    oracle
  • ubuntu怎么恢复删除的数据
    如果你删除的文件没有被彻底清空,可以尝试以下方法恢复删除的数据:1. 使用恢复软件:可以使用一些专门的数据恢复软件来恢复删除的文件,...
    99+
    2023-08-28
    ubuntu
  • postgresql 删除重复数据案例详解
    1.建表 -- ---------------------------- -- Table structure for test -- ------------------...
    99+
    2022-11-12
  • MySQL数据库中怎么恢复误删除数据
    本篇文章为大家展示了MySQL数据库中怎么恢复误删除数据,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1. 找到binlog恢复数据的前提是必须开启Mysql的bi...
    99+
    2022-10-18
  • mysql数据库数据删除如何恢复
    这篇文章将为大家详细讲解有关mysql数据库数据删除如何恢复,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在mysql有时执行了错误的update或者delete时导致大...
    99+
    2022-10-18
  • sql数据库删除数据怎么恢复
    小编给大家分享一下sql数据库删除数据怎么恢复,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!SQL Server中误删除数据的恢复本来不是件难事,从事务日志恢复即可。但是,这个恢复需要有两个前...
    99+
    2022-10-18
  • 数据库数据误删除怎么恢复
    小编给大家分享一下数据库数据误删除怎么恢复,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!恢复数据库数据误删除的方法:首先运行Recovery for SQL Server,并在recover中...
    99+
    2022-10-18
  • mysql数据误删除如何恢复
    如果MySQL数据误删除,可以尝试以下方法恢复:1. 使用备份:如果你有定期备份数据库,可以通过将备份文件还原到误删除之前的状态来恢...
    99+
    2023-10-09
    mysql
  • navicat误删除数据怎么恢复
    如果你在 Navicat 中误删除了数据,你可以尝试通过以下方法恢复数据: 使用 Navicat 的“撤销”功能:在误删除数据后...
    99+
    2023-10-27
    navicat
  • mysql误删除数据怎么恢复
    这篇文章主要介绍“mysql误删除数据怎么恢复”,在日常操作中,相信很多人在mysql误删除数据怎么恢复问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysql误删除数据怎么...
    99+
    2022-10-18
  • mysql删除表数据如何恢复
    目录实验模拟恢复实战常用参数选项解释不常用选项 实验模拟 该实验必须是mysql开启了binlog的情况。 binlog日志,即binary log,是二进制日志文件。它有两个作用, 一是增量备份,即只备份新增...
    99+
    2022-11-09
  • 数据库中表和表数据如何删除恢复
    这篇文章主要介绍了数据库中表和表数据如何删除恢复,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 flashback table TABLE...
    99+
    2022-10-18
  • navicat删除的数据库表如何恢复
    要恢复在Navicat中删除的数据库表,您可以尝试以下方法:1. 使用Navicat的“还原数据库对象”的功能。打开Navicat,...
    99+
    2023-09-22
    navicat 数据库
  • Oracle使用fy_recover_data恢复truncate删除的数据
    目录前言1.创建测试表2.truncate table pak_tab3 编译fy_recover_data包4.执行fy_recover_data包5.把数据插回原表6.校验数据总结前言 TRUNCATE不会逐个清除用...
    99+
    2022-07-20
    Oracle恢复truncate删除数据 Oraclefy_recover_data
  • Mysql误删除数据库怎么恢复
    这篇文章主要讲解了“Mysql误删除数据库怎么恢复”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Mysql误删除数据库怎么恢复”吧! ...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作