作者:Digital Observer(施嘉伟)
Oracle ACE Pro: Database
PostgreSQL ACE Partner
11年数据库行业经验,现主要从事数据库服务工作
拥有Oracle OCM、DB2 10.1 Fundamentals、MySQL 8.0 OCP、WebLogic 12c OCA、KCP、PCTP、PCSD、PGCM、OCI、PolarDB技术专家、达梦师资认证、数据安全咨询高级等认证
ITPUB认证专家、PolarDB开源社区技术顾问、HaloDB技术顾问、TiDB社区技术布道师、青学会MOP技术社区专家顾问、国内某高校企业实践指导教师
第一部分 文档描述
本文档适用数据表数据被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)

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




