快上网建站品牌

13518219792
  • 首页
  • 关于我们
    • 如何选择
    • 选择理由
  • 案例作品
    • 网站建设
    • 优化推广
    • 微信开发
    • 电商托管
  • 服务项目
    • 网站建设
    • 移动端/APP
    • 微信/小程序
    • 技术支持
    • 其它服务
  • 建站知识
    • 成都网站建设
    • 成都做网站
    • 成都网站设计
  • 网站售后
    • 成都网站运营
    • 成都网站维护
    • 成都网站推广
  • 客服中心
  • 全国分站

PostgreSQL中删除的数据能否恢复

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

创新互联主要从事成都网站设计、做网站、成都外贸网站建设公司、网页设计、企业做网站、公司建网站等业务。立足成都服务章贡,十多年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18980820575



问题的提出


  • 有人问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的一些原理,所以以上这些操作通常不要拿到生产数据库上去试!!!




文章标题:PostgreSQL中删除的数据能否恢复
转载来于:http://gydahua.com/article/jhehic.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流

其他资讯

  • 微服务-Skywalking监控应用性能-创新互联
  • iOS音乐播放器DOUAudioStreamer的示例分析-创新互联
  • 微信小程序API调用wx.request实现数据请求的示例分析-创新互联
  • kali扫描工具--vega-创新互联
  • c#如何实现雪花分形-创新互联

行业动态

企业网站建设的重要性!

现在虽然是移动互联网时代,但企业网站依然重要,包含PC站点,移动站。可以说企业网站关系企业的未来发展和前途,尤其对中小企业更是如此,一些中小企业老板,对自己的名片很在乎,因为这是个门面。...

服务项目

  • 网站建设

    查看详情
  • 移动端/APP

    查看详情
  • 微信/小程序

    查看详情
  • 技术支持

    查看详情
  • 其它服务

    查看详情
  • 更多服务项目

    用我们的专业和诚信赢得您的信赖,从PC到移动互联网均有您想要的服务!

    获取更多

联系吧 在百度地图上找到我们

电话:13518219792

如遇占线或暂未接听请拨:136xxx98888

业务咨询 技术咨询 售后服务
网站设计
专业网站设计
成都网站设计
成都网站设计
广安网站设计
网站制作
移动手机网站制作
成都网站制作
成都网站制作
成都网站制作
联系我们
电话:13518219792
邮箱:631063699@qq.com
地址:成都青羊区锦天国际1002号
网址:www.gydahua.com
网站建设
简阳网站建设
成都h5网站建设
重庆企业网站建设
成都网站建设

微信二维码

  • 友情链接
  • 成都网站推广
  • 乐山网站建设
  • 无纺布包装袋
  • 企业网站建设公司
  • 成都景区标识标牌
  • scjbgc.com
  • 响应式网站设计
  • 钢筋机械设备
  • 成都温江机房
  • 快照排名

Copyright © 2002-2023 www.gydahua.com 快上网建站品牌 QQ:244261566 版权所有 备案号:蜀ICP备19037934号

  • 在线咨询
  • 13518219792
  • 微信二维码

  • 移动版官网