可用工具
pg_recovery 使用简单,默认只有待找回数据;
pg_dirtyread 使用简单,默认返回全部数据;
WalMiner 需要对 walminer 全面掌握,并做好系统预设;
pg_resetwal 需要了解的内容较多;
pg_filedump 需要单独写一些脚本或工具来配合使用;
pageinspect 难度极大。
若无任何准备,如何恢复数据?推荐以下方法:
及时设置 vacuum_defer_cleanup_age
安装 pg_recover 或者 pg_dirtyread
无法安装插件可以采用 pg_resetwal ,无需任何额外工具

工具概述
下载地址https://github.com/df7cb/pg_filedump
pg_filedump 是一个用于格式化 PostgreSQL 堆/索引/控制文件的实用程序
成人类可读的形式。您可以通过多种方式格式化/转储文件,
如调用部分中所列,以及转储直接二进制文件。
通常可以自动确定文件类型(堆/索引)
通过文件中块的内容。但是,要格式化一个
pg_control 文件你必须使用 -c 选项。
默认设置是使用中列出的块大小格式化整个文件
块 0 并显示块的相对地址。这些默认值可以是
使用运行时选项修改。
有些选项可能看起来很奇怪,但它们存在是有原因的。为了
例如,块大小。它在那里是因为如果区块 0 的头部是
损坏,您需要一种强制块大小的方法。编译安装



调用
pg_filedump [-abcdfhikxy] [-R startblock [endblock]] [-D attrlist] [-S blocksize] [-s segsize] [-n segnumber] 文件
默认值是:相对寻址、整个文件的范围、块大小
如文件中块 0 所列
以下选项对堆和索引文件有效:
-a 格式化时显示绝对地址(块头
信息总是块相关的)
-b 显示一个范围内的二进制块图像(选项将打开
关闭所有格式选项)
-d 显示格式化的块内容转储(选项将关闭
所有其他格式选项)
-D 使用给定的逗号分隔类型列表解码元组。
支持的类型列表:
* 大整数
* 大连载
*布尔
* 字符
* 字符 N -- 字符(n)
* 日期
* 漂浮
* 浮动4
* 浮动8
* 整数
* JSON
* MAC地址
* 姓名
* 数字
* 对象
* 真实的
* 串行
* smallint
* 小系列
* 文本
* 时间
* 时间戳
*时间
* uuid
* 变量
* 变量 N -- 变量(n)
* xid
* XML
* ~ -- 忽略元组中剩余的所有属性
-f 显示格式化的块内容转储以及解释
-h 显示此信息
-i 显示已解释的项目详细信息
-k 验证块校验和
-R 显示文件中特定的块范围(块是
从 0 开始索引)
[startblock]:开始的块
[endblock]:块结束于
没有结束块的起始块将格式化单个块
-s 强制段大小为 [segsize]
-n 强制段号为 [segnumber]
-S 强制块大小为 [blocksize]
-x 强制将块项的格式解释为索引项
-y 强制将块项的格式解释为堆项
以下选项对控制文件有效:
-c 解释列为控制文件的文件
-f 显示格式化的内容转储以及解释
-S 强块大小为 [blocksize]
附加功能:
-m 将文件解释为 pg_filenode.map 文件并打印内容
(所有其他选项将被忽略)
在大多数情况下,建议使用-i 和-f 选项来获取最有用的转储输出。
上科技与狠活
postgres=# create table test(id int,name varchar(20));CREATE TABLEpostgres=# insert into test values(1,'cui');INSERT 0 1postgres=# insert into test values(2,'peng');INSERT 0 1postgres=# select * from test;id | name----+------1 | cui2 | peng(2 rows)查看表对应的文件postgres=# select pg_relation_filepath('test');pg_relation_filepath----------------------base/13593/16384(1 row)postgres@pgexp1-> ll base/13593/16384-rw------- 1 postgres postgres 8.0K May 22 22:46 base/13593/16384解析文件内容postgres@pgexp1-> pg_filedump base/13593/16384******************************************************************** PostgreSQL File/Block Formatted Dump Utility** File: base/13593/16384* Options used: None*******************************************************************Notice: Block size determined from reading block 0 is zero, using default 8192 instead.Hint: Use -S <size> to specify the size manually.Block 0 ********************************************************<Header> -----Block Offset: 0x00000000 Offsets: Lower 0 (0x0000)Block: Size 0 Version 0 Upper 0 (0x0000)LSN: logid 0 recoff 0x00000000 Special 0 (0x0000)Items: 0 Free Space: 0Checksum: 0x0000 Prune XID: 0x00000000 Flags: 0x0000 ()Length (including item array): 24Error: Invalid header information.<Data> -----Empty block - no items listed<Special Section> -----Error: Invalid special section encountered.*** End of File Encountered. Last Block Read: 0 ***-------------------------------------------------------------postgres@pgexp1-> pg_filedump -D int,charn base/13593/16384******************************************************************** PostgreSQL File/Block Formatted Dump Utility** File: base/13593/16384* Options used: -D int,charn*******************************************************************Block 0 ********************************************************<Header> -----Block Offset: 0x00000000 Offsets: Lower 32 (0x0020)Block: Size 8192 Version 4 Upper 8120 (0x1fb8)LSN: logid 0 recoff 0x0164ea10 Special 8192 (0x2000)Items: 2 Free Space: 8088Checksum: 0x0000 Prune XID: 0x00000000 Flags: 0x0000 ()Length (including item array): 32<Data> -----Item 1 -- Length: 32 Offset: 8160 (0x1fe0) Flags: NORMALCOPY: 1 cuiItem 2 -- Length: 33 Offset: 8120 (0x1fb8) Flags: NORMALCOPY: 2 peng*** End of File Encountered. Last Block Read: 0 ***生成可导入的csv文件postgres@pgexp1-> pg_filedump -D int,charn base/13593/16384|grep COPY |awk '{$1=null;print $0}'>testpostgres@pgexp1-> cat test1 cui2 peng导入数据postgres=# copy test from 'test'(DELIMITER ' ');COPY 2postgres=# select * from test;id | name----+------1 | cui2 | peng(2 rows)
文章转载自CP的PostgreSQL厨房,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




