PostgreSQL数据delete删除恢复

第一部分 文档描述

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

第二部分 操作步骤

2.1 创建测试表

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

shell 复制代码
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 查询表文件位置

查询测试表的文件位置

shell 复制代码
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)

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

shell 复制代码
dbtest=# select pg_relation_filepath(' novels ');
pg_relation_filepath 
----------------------
 base/16571/24783
(1 row)

2.3 模拟删除表数据

拟delete删除测试表的数据

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

2.4 安装pg_filedump

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

shell 复制代码
[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)

shell 复制代码
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并开始解析步骤

shell 复制代码
dbtest=# alter table novels set (autovacuum_enabled = off);

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

shell 复制代码
[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

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

shell 复制代码
[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文件中

shell 复制代码
[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文件中的数据,并验证数据是否恢复

shell 复制代码
dbtest=# copy novels from '/software/pgsql13/data/import.csv';
dbtest=# select * from novels ;
   name   | id 
----------+----
 三国演义 |  1
 水浒传   |  2
 西游记   |  3
 红楼梦   |  4
(4 rows)
相关推荐
落笔画忧愁e44 分钟前
FastGPT快速将消息发送至飞书
服务器·数据库·飞书
Σίσυφος19001 小时前
halcon 条形码、二维码识别、opencv识别
前端·数据库
技术小齐1 小时前
网络运维学习笔记 016网工初级(HCIA-Datacom与CCNA-EI)PPP点对点协议和PPPoE以太网上的点对点协议(此处只讲华为)
运维·网络·学习
小刘|2 小时前
深入理解 SQL 注入漏洞及解决方案
数据库·sql
ITPUB-微风2 小时前
Service Mesh在爱奇艺的落地实践:架构、运维与扩展
运维·架构·service_mesh
落幕2 小时前
C语言-进程
linux·运维·服务器
天上掉下来个程小白2 小时前
案例-14.文件上传-简介
数据库·spring boot·后端·mybatis·状态模式
chenbin5202 小时前
Jenkins 自动构建Job
运维·jenkins
java 凯2 小时前
Jenkins插件管理切换国内源地址
运维·jenkins
哆木3 小时前
排查生产sql查询缓慢
数据库·sql·mysql