云贝教育【技术分享】PostgreSQL中误删除数据怎么办?(一)

注:本文为云贝教育-刘峰 原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。

在我们学习完PG的MVCC机制之后,对于DML操作,被操作的行其实并未被删除,只能手工
vacuum或自动vacuum触发才会清理掉这些无效数据,也就是死元组。
基于这种机制,在发生死元组清理动作之前,只需要将其中不可见的行中的数据解析出来,或者
发生脏读,就可以获取到误删除的数据。虽然PG不支持脏读,但今天介绍的pg_dirtyread插
件,可以实现脏读。

一、安装pg_dirtyread

下载地址
1 https://github.com/df7cb/pg_dirtyread
这个网页上有详细的安装说明
编译安装 
1 unzip pg_dirtyread-master.zip
2 cd pg_dirtyread-master/
3 make
4 make install

二、使用示例

2.1、在对应库创建EXTENSION
1 create extension pg_dirtyread ;
2.2、创建表并禁用autovacuum
1 testdb=# CREATE TABLE t1 (id int, name text);
2 CREATE TABLE
3
2.3、插入并通过heap_page_items查看数据
1 testdb=# INSERT INTO t1 VALUES (1, 'aaa'), (2, 'bbb'),(3,'ccc');
2 INSERT 0 3
3 testdb=#
4 testdb=# SELECT lp as tuple, t_xmin, t_xmax, t_field3 as t_cid, t_ctid,t_data F
ROM heap_page_items(get_raw_page('t1', 0));
5 tuple | t_xmin | t_xmax | t_cid | t_ctid | t_data
6 -------+--------+--------+-------+--------+----------------------------
7 1 | 1104 | 0 | 0 | (0,1) | \x010000000000000009616161
8 2 | 1104 | 0 | 0 | (0,2) | \x020000000000000009626262
9 3 | 1104 | 0 | 0 | (0,3) | \x030000000000000009636363
10 (3 rows)
11

2.4、删除数据
1 testdb=# DELETE FROM t1 WHERE id &#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值