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)
相关推荐
我是小超人-雨石花24 分钟前
Jenkins&Robot Framework持续集成
运维·jenkins·ci
有一个好名字2 小时前
MyBatis-Plus 三种数据库操作方式详解 + 常用方法大全
数据库·mybatis
-Xie-2 小时前
Redis(八)——多线程与单线程
java·数据库·redis
wanhengidc2 小时前
云手机的软件核心是什么
运维·服务器·web安全·游戏·智能手机
G探险者2 小时前
为什么 VARCHAR(1000) 存不了 1000 个汉字? —— 详解主流数据库“字段长度”的底层差异
数据库·后端·mysql
芬加达3 小时前
jvm八股
运维·服务器·jvm
小兔薯了3 小时前
11. Linux firewall 防火墙管理
linux·运维·服务器
Albert Tan4 小时前
Oracle EBS R12.2.14 清理FND_LOBS并释放磁盘空间
数据库·oracle
L.EscaRC4 小时前
图数据库Neo4j原理与运用
数据库·oracle·neo4j
知己80804 小时前
docker搭建图数据库neo4j
数据库·docker·neo4j