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


一、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配置大一点不被清除呗,有这个配置的时间我去配个【连续归档】他不香吗,反正我那上面的也只是几点而已其实还有很多问题的。最好配连续归档。

Guess you like

Origin juejin.im/post/7075277227998314526