自学内容网 自学内容网

PostgreSQL数据delete删除恢复

第一部分 文档描述

本文档适用数据表数据被delete类型的删除语句情况下恢复,需要满足数据库或数据表未被vacuum或者vacuum full

第二部分 操作步骤

2.1 创建测试表
创建测试表novels,并插入测试数据

dbtest=# create table novels (name varchar(200), id int);
CREATE TABLE
dbtest=# insert into novels values('三国演义',1);
INSERT 0 1
dbtest=# insert into novels values('水浒传',2);
INSERT 0 1
dbtest=# insert into novels values('西游记',3);
INSERT 0 1
dbtest=# insert into novels values('红楼梦',4);

2.2 查询表文件位置

查询测试表的文件位置

dbtest=# select oid from pg_database where datname='dbtest';
  oid  
-------
 16571
(1 row)

dbtest=# select oid,relfilenode from pg_class where relname='novels';
  oid  | relfilenode 
-------+-------------
 24783 |       24783
(1 row)

也可以通过函数获取表文件位置

dbtest=# select pg_relation_filepath(' novels ');
pg_relation_filepath 
----------------------
 base/16571/24783
(1 row)

2.3 模拟删除表数据

拟delete删除测试表的数据

dbtest=# delete from novels;
DELETE 4
dbtest=# select * from novels;
 name | id 
------+----
(0 rows)

2.4 安装pg_filedump

本操作文档通过pg_filedump插件解析表文件来获取数据,我们通过git下载并安装

[root@VM-4-13-centos ~]# yum install git -y
[postgres@VM-4-13-centos ~]$ cd pg_filedump/
[postgres@VM-4-13-centos pg_filedump]$ make
[postgres@VM-4-13-centos pg_filedump]$ make install
/usr/bin/mkdir -p '/software/pgsql13/bin'
/usr/bin/install -c  pg_filedump '/software/pgsql13/bin'

2.5 解析删除的数据

解析被删除的数据之前首先查询表在删除时间点之后是否被vacuum(包括手动vacuum和autovacuum)

dbtest=# \x
Expanded display is on.
dbtest=# select * from pg_stat_all_tables where relname = 'novels';
-[ RECORD 1 ]-------+------------------------------
relid               | 24783
schemaname          | public
relname             | novels
seq_scan            | 13
seq_tup_read        | 44
idx_scan            | 
idx_tup_fetch       | 
n_tup_ins           | 28
n_tup_upd           | 0
n_tup_del           | 22
n_tup_hot_upd       | 0
n_live_tup          | 6
n_dead_tup          | 18
n_mod_since_analyze | 50
n_ins_since_vacuum  | 24
last_vacuum         | 2022-02-09 11:27:30.501748+08
last_autovacuum     | 
last_analyze        | 
last_autoanalyze    | 
vacuum_count        | 1
autovacuum_count    | 0
analyze_count       | 0
autoanalyze_count   | 0

如果没有被vacuum,则关闭表级别的autovacuum并开始解析步骤

dbtest=# alter table novels set (autovacuum_enabled = off);

通过上述步骤查询到的表数据文件来解析被删除的数据

[postgres@VM-4-13-centos data]$ pg_filedump -D charn,int base/16571/24783

*******************************************************************
* PostgreSQL File/Block Formatted Dump Utility
*
* File: base/16571/24783
* Options used: -D charn,int
*******************************************************************

Block    0 ********************************************************
<Header> -----
 Block Offset: 0x00000000         Offsets: Lower      40 (0x0028)
 Block: Size 8192  Version    4            Upper    8024 (0x1f58)
 LSN:  logid      0 recoff 0x070351c0      Special  8192 (0x2000)
 Items:    4                      Free Space: 7984
 Checksum: 0x0000  Prune XID: 0x00000242  Flags: 0x0000 ()
 Length (including item array): 40

<Data> -----
 Item   1 -- Length:   44  Offset: 8144 (0x1fd0)  Flags: NORMAL
COPY: 三国演义        1
 Item   2 -- Length:   40  Offset: 8104 (0x1fa8)  Flags: NORMAL
COPY: 水浒传        2
 Item   3 -- Length:   40  Offset: 8064 (0x1f80)  Flags: NORMAL
COPY: 西游记        3
 Item   4 -- Length:   40  Offset: 8024 (0x1f58)  Flags: NORMAL
COPY: 红楼梦        4

可以使用以下命令来过滤需要的数据

[postgres@VM-4-13-centos data]$ pg_filedump -D charn,int base/16571/24783|grep COPY
COPY: 三国演义        1
COPY: 水浒传        2
COPY: 西游记        3
COPY: 红楼梦        4

我们将COPY字段过滤并写入需要的数据到csv文件中

[postgres@VM-4-13-centos data]$ pg_filedump -D varchar,int base/16571/24783|grep COPY|sed 's/\COPY: //g' > import.csv
[postgres@VM-4-13-centos data]$ more import.csv 
三国演义        1
水浒传        2
西游记        3
红楼梦        4

2.6 恢复数据到原表中

使用copy命令导入csv文件中的数据,并验证数据是否恢复

dbtest=# copy novels from '/software/pgsql13/data/import.csv';
dbtest=# select * from novels ;
   name   | id 
----------+----
 三国演义 |  1
 水浒传   |  2
 西游记   |  3
 红楼梦   |  4
(4 rows)

hhh6.jpg


原文地址:https://blog.csdn.net/weixin_42329915/article/details/144286274

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!