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