Postgresql删除数据基于死元组旧版本恢复(这个就是个小玩具,企业级数据不适应)

本文深入探讨 PostgreSQL 中的数据恢复机制,特别是通过调整事务号和利用 MVCC(多版本并发控制)进行数据恢复的过程。文章详细解释了如何通过修改配置参数来延缓死元组的清理,以及这种方法在实际应用中的限制和潜在问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


一、Postgres旧版本号是什么?

更加详细链接
Postgres删除一条数据时都会有一个事务号,删除了这条数据,你只是表面查不到了,其实只是在被删掉的这一行数据里做了一个逻辑删除,把这行数据变成了旧版本(就是这条数据变为一个不能用的旧数据了), 另外内部还有一个垃圾回收器(vacuum),如果被垃圾回收器清理掉了这个旧版本号数据那就不能通过这种方式找回数据了。
也可以配置vacuum间隔多久清理,这里就不做多讲解了,博客里有专门的配置文章

二、还原数据

1.开始真实环境测试(注:玩玩还行数据量特大就有点不适合用了)

1.首先啊改一下配置文件

具体作用看配置文件帖子
vacuum_defer_cleanup_age = 800 
track_commit_timestamp=on(需要安装插件)

2.由于这个用的不多我就做个演示给大家看看弊端

首先创建表新增5条数据
create table test(id int);
insert into test values(1);
insert into test values(2);
insert into test values(3);
insert into test values(4);
insert into test values(5);

在这里插入图片描述

3.查找事务号(需要装脏数据查询插件:pg_dirtyread)

pg_dirtyread=下载地址:https://github.com/ChristophBerg/pg_dirtyread

查找事务号:可以通过上面插件查询由于这玩意不怎么常用以及使用还原数据太过于繁琐,本帖子只是做测试,具体想用的可以看如下帖子,个人感觉没什么用,就只是做测试用了

http://mysql.taobao.org/monthly/2018/07/10/

测试开始

首先查询事务版本号根据事务还原:插件可以观察时间,这里就随意一点直接查算了
select xmin,xmax,* from test;

在这里插入图片描述

可以看到目前这5条数据事务号 xmin:事务号 xmax:删除事务号
我还原到533那条数据吧
pg_ctl -D ..\data stop
此处意思是设置下一个事务号为533意味着533以及往下的所有数据不可见:MVCC
pg_resetwal -D ..\data -x 533 

在这里插入图片描述

重置成功,这里呢就是把pg的集簇以及控制文件改动了一下

在这里插入图片描述

启动数据库
pg_ctl -D ..\data start

在这里插入图片描述

目前可以看到533以及一下的数据不可见了注意不是删除

在这里插入图片描述

新增一条数据就把未来的事务执行了
insert into test values(6);
就产生了未来的事务数据id为3,新增事务数据为6
解决方案:在恢复数据后直接备份表或者数据库,重新利用备份还原数据

在这里插入图片描述

分析:弊端
1.如果数据量大重新备份再去还原,先不说还原不还原的成功,比如我库里面用了很多东西你全部都要引到新库,或者你就用目前这个库直接替换数据,数据量大也会出现很多问题,时间慢,序列导入顺序问题等等一大把问题,一般不会这么搞的
2.这个恢复只支持dml语句就算增删改查才有用基于mvcc的,那如果我把表删了呢
3.需要配延迟多少事务才把死元组清除,会导致表过于膨胀,性能好那就没问题
4.如果表中存在很多死元组会影响性能
5.这个还原数据就算再碰运气,运气好的话垃圾清理器就每删除你的死元组,删除了就完了
6.需要配置几个参数,事务号大于多少被清除,?还需要配置参数,那我有这抽风的时间配置你,我还不如去配个连续归档

综合以上记得就第1点就过不了关,当然也有人说我只删除了一张表的数据,那行你就备份那一张表就好了,那下面几点呢,比如我删除表呢,比如这个时候垃圾清理器清掉了呢怎么办,可能还有人说那就把参数vacuum_defer_cleanup_age配置大一点不被清除呗,有这个配置的时间我去配个【连续归档】他不香吗,反正我那上面的也只是几点而已其实还有很多问题的。最好配连续归档。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值