PostgreSQL码农集散地

PG库彻底打不开了数据怎么救? PDU工具最全使用指南来了

在公众号菜单中点击“PDU下载”或关注公众号回复“下载”,均可获取PDU的下载链接

PDU(Postgresql Data Unloader),是一款针对PG数据库的灾难拯救工具,适用于Postgresql数据库的10-17版本,核心功能主要有两点:
1、从归档WAL文件中恢复出delete数据
2、在数据库无法开启的状态下恢复出数据,导入新库。
本文将会详细介绍PDU2.0版本的所有功能用法,现有语法在今后的版本中不再做大的变动。在PDU中输入以分号结尾的任意字符都可以获取完整使用指南。
网盘链接中的PDU压缩包解压后为pdu10-pdu17可执行文件,对应PG10-17版本;还有一个pdu.ini文件,用于配置归档目录和数据目录。除此之外无需进行任何配置,可直接选择对应版本的pdu文件执行后即可进入PDU。
初始化
在安装包中自带的配置文件pdu.ini里填入数据目录+归档目录。进入对应PG数据库版本的pdu,执行<b;>完成数据字典的初始化。
该步骤会读取pg_database、pg_class、pg_attribute、pg_type四张系统表的oid文件。
数据库的启停状态并不会影响初始化的执行,在数据库无法开启的状态下同样可以完成初始化。
**基础操作**b;                                      │ 初始化数据库元信息<exit;>|<\q;>                           │ 退出工具
初始化完成后。可以执行以下操作
查看库表结构
use <库名>;
选择当前要执行操作的数据库
set <模式名>; 
选择当前要执行操作的模式,set完毕后会输出当前模式下表大小排名前20的表名。
**数据库切换**use <db>;                               │ 指定目标数据库 (例: use logs;)set <schema>;                           │ 指定操作模式 (例: set recovery;)
   \l; 
查看当前可操作的数据库。
\dt; 
查看当前模式下的所有表和表大小。
\d <表名>; 
查看某张表的列类型,类型之间以逗号间隔。
\d+ <表名>; 
查看某张表的ddl,其中不包含非空约束、注释、索引等元素的创建语句,只有基础的 列名+列类型
**元数据展示**\l;                                     │ 列出所有数据库\dn;                                    │ 显示当前数据库模式\dt;                                    │ 列出当前模式下的表\d+ <table>;                            │ 查看表结构详情 (例: \d+ users;)\d <table>;                             │ 查看表列类型 (例: \d users;)
数据拯救
当数据库遇到正常途径无法开库、备份失效或干脆没有备份、常规方式已无法恢复等极端情况时,想要获取原数据库中的数据,唯一可行的手段就是直接对数据文件进行抽取。
PDU工具正是为了这种场景而生,且能够以单表、模式为单位控制导出数据的粒度。在无法使用备份进行恢复,且数据文件的一致性被破坏,无法通过pg_ctl start起库的情况下,可直接从数据文件中进行数据抽取,是用于极端场景下的数据恢复手段,为用户的数据安全提供最后一道屏障。
unload tab <表名>; 
适用于单表导出,导出文件路径为 数据库名/模式名/表名.csv 。
unload sch <模式名>;
适用于整个模式导出,导出的文件全部放在 数据库名/模式名 路径下。
unload ddl; 
导出当前模式下的所有表的ddl。
unload copy;
导出 数据库名/模式名 路径下已导出的所有csv文件的copy语句。
**数据导出**unload tab <table>;                     │ 导出表数据 → <表名>.csv (例: unload tab orders;)unload sch <schema>;                    │ 导出指定模式的所有数据 (例: unload sch public;)unload ddl;                             │ 生成当前模式下的DDL语句文件unload copy;                            │ 生成已导出的CSV文件的COPY语句文件
恢复误删数据
scan <表名>;
选择数据库和模式后,扫描某张表,获取该表在所有归档日志中的删除事务记录,归档日志的路径为pdu.ini中设置的归档路径。请注意,不会扫描pg_wal下的日志,所以测试学习的时候需要进行手动归档操作。
restore del <事务号>;
在 事务号 恢复模式下,指定scan结果中的事务号,进行该删除事务中所有记录的恢复,恢复文件以 表名_事务号.csv 命名,文件路径为restore/public。
restore del all;
在 时间区间 恢复模式下,针对scan结果中的该时间区间内的所有数据,进行所有记录的恢复,恢复文件以 表名_起始时间_结束时间.csv 命名,文件路径为restore/public。
**误删数据恢复**scan t1;                                │ 扫描被误删的表restore del <Tx Number>;                │ 通过事务号恢复被误删的数据restore del all;                        │ 通过时间段恢复被误删的数据
单一数据库/表文件恢复
add <表文件oid> <表名> <列类型>;
add <filenode> <tablename> <attibutes>; │ 将特定表信息手动添加到restore库中例如: <add 12345 t1 varchar,varchar,timestamp,varchar,numeric,varchar,varchar,varchar,numeric;>
如果用户手头上存在某个损坏的表文件、或者恢复出来的表文件需要导出数据,这里假设
    表名为a
    列类型为varchar,int
    对应的表文件名为10236
那么请将10236文件放到retsore/datafile路径下,然后用 add 10000 a varchar,int 命令在restore库下注册该表的信息。
注册完成之后就可以用如下命令导出这张表中的数据。
use restore;unload tab a;
restore db <数据库名> <数据库路径>;
同样假设用户存在一整个数据库目录,目录名为<290113>,且丧失了base、global等结构,此时就可以用如下命令初始化这个目录的数据库元信息
restore db xmandb /home/postgres/data/base/290113;
初始化完毕后,使用use xmandb; 就可以正常进入该库导出数据。
参数设置
修改delete恢复模式为 事务号 恢复模式 或 时间区间 恢复模式
param resmode tx|time;                  │ 设置restore恢复的模式,选择按照【事务号/TX】或【时间区间/TIME】进行恢复
两种模式的具体使用技巧可参考下文:
PDU新增事务号恢复+时间区间恢复,助力PG各类DELETE恢复场景
在恢复删除数据时,如果归档路径中的文件数量超过250个,则需要设置起始 或 终点 WAL文件。设置命令如下:
param startwal 000000010000000800000008;│ 设置scan扫描的起始WAL文件,如果未设置则默认是归档目录的第一个文件param endwal 000000010000000800000009;  │ 设置scan扫描的结束WAL文件,如果未设置则默认是归档目录的最后一个文件
如果用户需要恢复指定时间段内删除的数据,则需要设置起始时间 和 结束时间。设置命令如下:
param starttime 2025-01-01_00:00:00;    │ 设置scan扫描的起始时间param endtime 2025-01-01_00:00:00;      │ 设置scan扫描的结束时间
需要强调的是,恢复时应该尽量多地覆盖WAL文件,这样可以保证所需的FPW都可以被扫描到。
例如,我们需要恢复13:00-13:05之间删除的数据,那么:
1、需要设置的startwal和endwal的文件生成时间应该大约在12:45-13:15之间
2、starttime和endtime则设置为我们真正需要的13:00-13:05。
reset <参数名>;
重置此前设置的某一参数为空。
show;
展示当前的所有参数值。
reset <paramname>                      │ 重置某个参数show;                                   │ 查看当前所有参数

以上就是PDU 2.0版本的所有功能介绍,大家在使用的过程中有任何问题或者发现了bug,欢迎私信投递Image

在公众号菜单中点击“PDU下载”或关注公众号回复“下载”,均可获取PDU的下载链接