PostgreSQL中删除的数据能否恢复

本文介绍了在PostgreSQL中删除的数据如何在无备份情况下尝试恢复。通过理解其多版本并发控制原理,分析了数据恢复的可能性和条件,强调了事务状态和行的t_infomask状态位的重要性。作者提供了一个名为pg_fix的工具,用于展示和清理表数据文件中的hint信息,以及查询和更改事务状态,但警告这些操作应在数据库停止时并在生产环境中谨慎使用。
摘要由CSDN通过智能技术生成

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垃圾回收进程给清理掉了,就不能恢复了。所以如果作了删除数据的操作后,马上把数据库停下来,这时

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值