暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL学习随笔25 利用工具恢复误删除数据5之pg_filedump

1169

可用工具

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 TABLE
    postgres=# insert into test values(1,'cui');
    INSERT 0 1
    postgres=# insert into test values(2,'peng');
    INSERT 0 1
    postgres=# select * from test;
    id | name
    ----+------
    1 | cui
    2 | 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: 0
    Checksum: 0x0000 Prune XID: 0x00000000 Flags: 0x0000 ()
    Length (including item array): 24


    Error: 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: 8088
    Checksum: 0x0000 Prune XID: 0x00000000 Flags: 0x0000 ()
    Length (including item array): 32


    <Data> -----
    Item 1 -- Length: 32 Offset: 8160 (0x1fe0) Flags: NORMAL
    COPY: 1 cui
    Item 2 -- Length: 33 Offset: 8120 (0x1fb8) Flags: NORMAL
    COPY: 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}'>test
    postgres@pgexp1-> cat test
    1 cui
    2 peng

    导入数据
    postgres=# copy test from 'test'(DELIMITER ' ');
    COPY 2
    postgres=# select * from test;
    id | name
    ----+------
    1 | cui
    2 | peng
    (2 rows)

    文章转载自CP的PostgreSQL厨房,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论