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)
相关推荐
DLYSB_36 分钟前
存储运维实战:基于 Ceph Event 监听与 Python 适配器的分布式存储健康度物理声光响应架构
运维·ceph·python·报警灯
阿里云云原生2 小时前
可用性从 99.9% 跃升至 99.995%:畅捷通如何用 AI 重塑运维底座?
运维·网络·人工智能
阿童木写作2 小时前
Python实现Temu图片批量翻译自动化教程
运维·人工智能·python·自动化
iori97king4 小时前
库存不足自动通知:第一次使用自动化
运维·自动化
@insist1234 小时前
信息系统管理工程师-信息系统运维资源、技术与智能运维核心考点解析
运维·软考·信管·软件水平考试·信息系统管理工程师
木子欢儿4 小时前
Intel 架构的 MacBook Pro 运行 Linux 发热量高解决
linux·运维·服务器
凌虚4 小时前
面向 MySQL 用户的 PostgreSQL 快速上手指南
数据库·后端·架构
五阿哥永琪4 小时前
MySQL中操作json的函数!
数据库·mysql·json
来者皆善4 小时前
了解Mysql优化吗?如何优化索引?
数据库·mysql
KKKlucifer6 小时前
运营商全域安全运维支撑体系落地实践
运维·安全