在公众号菜单中点击“PDU下载”或关注公众号回复“下载”,均可获取PDU的下载链接
PDU(Postgresql Data Unloader),是一款针对PG数据库的灾难拯救工具,适用于Postgresql数据库的10-17版本,核心功能主要有两点: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;> │ 退出工具
选择当前要执行操作的模式,set完毕后会输出当前模式下表大小排名前20的表名。**数据库切换**use <db>; │ 指定目标数据库 (例: use logs;)set <schema>; │ 指定操作模式 (例: set recovery;)
查看某张表的ddl,其中不包含非空约束、注释、索引等元素的创建语句,只有基础的 列名+列类型**元数据展示**\l; │ 列出所有数据库\dn; │ 显示当前数据库模式\dt; │ 列出当前模式下的表\d+ <table>; │ 查看表结构详情 (例: \d+ users;)\d <table>; │ 查看表列类型 (例: \d users;)
当数据库遇到正常途径无法开库、备份失效或干脆没有备份、常规方式已无法恢复等极端情况时,想要获取原数据库中的数据,唯一可行的手段就是直接对数据文件进行抽取。PDU工具正是为了这种场景而生,且能够以单表、模式为单位控制导出数据的粒度。在无法使用备份进行恢复,且数据文件的一致性被破坏,无法通过pg_ctl start起库的情况下,可直接从数据文件中进行数据抽取,是用于极端场景下的数据恢复手段,为用户的数据安全提供最后一道屏障。适用于单表导出,导出文件路径为 数据库名/模式名/表名.csv 。适用于整个模式导出,导出的文件全部放在 数据库名/模式名 路径下。导出 数据库名/模式名 路径下已导出的所有csv文件的copy语句。**数据导出**unload tab <table>; │ 导出表数据 → <表名>.csv (例: unload tab orders;)unload sch <schema>; │ 导出指定模式的所有数据 (例: unload sch public;)unload ddl; │ 生成当前模式下的DDL语句文件unload copy; │ 生成已导出的CSV文件的COPY语句文件
选择数据库和模式后,扫描某张表,获取该表在所有归档日志中的删除事务记录,归档日志的路径为pdu.ini中设置的归档路径。请注意,不会扫描pg_wal下的日志,所以测试学习的时候需要进行手动归档操作。在 事务号 恢复模式下,指定scan结果中的事务号,进行该删除事务中所有记录的恢复,恢复文件以 表名_事务号.csv 命名,文件路径为restore/public。在 时间区间 恢复模式下,针对scan结果中的该时间区间内的所有数据,进行所有记录的恢复,恢复文件以 表名_起始时间_结束时间.csv 命名,文件路径为restore/public。**误删数据恢复**scan t1; │ 扫描被误删的表restore del <Tx Number>; │ 通过事务号恢复被误删的数据restore del all; │ 通过时间段恢复被误删的数据
add <filenode> <tablename> <attibutes>; │ 将特定表信息手动添加到restore库中例如: <add 12345 t1 varchar,varchar,timestamp,varchar,numeric,varchar,varchar,varchar,numeric;>
如果用户手头上存在某个损坏的表文件、或者恢复出来的表文件需要导出数据,这里假设那么请将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】进行恢复
在恢复删除数据时,如果归档路径中的文件数量超过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 <paramname> │ 重置某个参数show; │ 查看当前所有参数
以上就是PDU 2.0版本的所有功能介绍,大家在使用的过程中有任何问题或者发现了bug,欢迎私信投递
在公众号菜单中点击“PDU下载”或关注公众号回复“下载”,均可获取PDU的下载链接