PostgreSQL恢复系列:pg_filedump恢复字典构造---惜分飞

pg_filedump是在pg数据库极端情况下直接解析数据库文件的利器,但是由于是开源软件,本身难以实现批量处理,通过对底层基表分析,可以实现批量处理功能
分析PostgreSQL库中数据库信息

--数据库查询结果

postgres=# select oid,datname,datdba,dattablespace from pg_database;

  oid  |   datname   | datdba | dattablespace

-------+-------------+--------+---------------

 14187 | postgres    |     10 |          1663

 16403 | db_xff      |     10 |          1663

     1 | template1   |     10 |          1663

 14186 | template0   |     10 |          1663

 16407 | db_xifenfei |  16405 |         16406

(5 rows)

--通过dump 该文件解析数据

<Data> -----

 Item   1 -- Length:    0  Offset:    5 (0x0005)  Flags: REDIRECT

 Item   2 -- Length:    0  Offset:    6 (0x0006)  Flags: REDIRECT

 Item   3 -- Length:  260  Offset: 7320 (0x1c98)  Flags: NORMAL

COPY: 14187     postgres

 Item   4 -- Length:  260  Offset: 7056 (0x1b90)  Flags: NORMAL

COPY: 16403     db_xff

 Item   5 -- Length:  297  Offset: 7888 (0x1ed0)  Flags: NORMAL

COPY: 1 template1

 Item   6 -- Length:  297  Offset: 7584 (0x1da0)  Flags: NORMAL

COPY: 14186     template0

 Item   7 -- Length:  260  Offset: 6792 (0x1a88)  Flags: NORMAL

COPY: 16407     db_xifenfei

分析PostgreSQL 表空间信息

--sql查询表空间信息

postgres=# select * from pg_tablespace;

  oid  |   spcname    | spcowner | spcacl | spcoptions

-------+--------------+----------+--------+------------

  1663 | pg_default   |       10 |        |

  1664 | pg_global    |       10 |        |

 16406 | tbs_xifenfei |    16405 |        |

(3 rows)

--通过dump 该文件解析数据

<Data> -----

 Item   1 -- Length:   96  Offset: 8096 (0x1fa0)  Flags: NORMAL

COPY: 1663      pg_default

 Item   2 -- Length:   96  Offset: 8000 (0x1f40)  Flags: NORMAL

COPY: 1664      pg_global

 Item   3 -- Length:   96  Offset: 7904 (0x1ee0)  Flags: NORMAL

COPY: 16406     tbs_xifenfei

分析PostgreSQL 对象id、name、path对应关系

--对象信息查询

postgres=# select oid ,relname,relnamespace,reltype,reloftype,relowner,relam,relfilenode,

           reltablespace from pg_class where relname like 't_t%' or relname like 't_x%';

  oid  |  relname   | relnamespace | reltype | reloftype | relowner | relam | relfilenode | reltablespace

-------+------------+--------------+---------+-----------+----------+-------+-------------+---------------

 16387 | t_xifenfei |         2200 |   16389 |         0 |       10 |     2 |       16390 |             0

 16391 | t_xff      |         2200 |   16393 |         0 |       10 |     2 |       16391 |             0

 16394 | t_xff2     |         2200 |   16396 |         0 |       10 |     2 |       16394 |             0

 16397 | t_xff3     |         2200 |   16399 |         0 |       10 |     2 |       16397 |             0

 16400 | t_xff4     |         2200 |   16402 |         0 |       10 |     2 |       16400 |             0

 16408 | t_tbs      |         2200 |   16410 |         0 |       10 |     2 |       16408 |         16406

(6 rows)

--通过dump 该文件解析数据(显示部分)

COPY: 16394     t_xff2  2200    16396   0       10      2       16394   0       0       0.000000000000  0       0       f       f       p       r

 Item  29 -- Length:    0  Offset:   31 (0x001f)  Flags: REDIRECT

 Item  30 -- Length:  172  Offset: 2592 (0x0a20)  Flags: NORMAL

COPY: 16397     t_xff3  2200    16399   0       10      2       16397   0       0       0.000000000000  0       0       f       f       p       r

 Item  31 -- Length:  205  Offset: 3376 (0x0d30)  Flags: NORMAL

COPY: 12093     pg_shadow       11      12094   0       10      0       0       0       0       0.000000000000  0       0       f       f       p       v

 Item  32 -- Length:  172  Offset: 2416 (0x0970)  Flags: NORMAL

COPY: 16400     t_xff4  2200    16402   0       10      2       16400   0       0       0.000000000000  0       0       f       f       p       r

这个里面获取到pg_class.reltablespace是表空间的id值,根据自定义表空间的规则:在pgdata/pg_tblspc创建link指向创建表空间时候的文件夹路径

-bash-4.2$ pwd

/var/lib/pgsql/12/data/pg_tblspc

-bash-4.2$ ls -ltr

total 0

lrwxrwxrwx 1 postgres postgres 30 Apr 15 20:13 16406 -> /var/lib/pgsql/12/data/tbs_xff

结合上述的pg_database,pg_tablespace,pg_class信息,可以获取到每个表对应实际的存储路径
分析PostgreSQL 模式信息

--sql查询模式信息

postgres=# select * from pg_namespace;

  oid  |      nspname       | nspowner |               nspacl               

-------+--------------------+----------+-------------------------------------

    99 | pg_toast           |       10 |

 12314 | pg_temp_1          |       10 |

 12315 | pg_toast_temp_1    |       10 |

    11 | pg_catalog         |       10 | {postgres=UC/postgres,=U/postgres}

  2200 | public             |       10 | {postgres=UC/postgres,=UC/postgres}

 13887 | information_schema |       10 | {postgres=UC/postgres,=U/postgres}

 16404 | u_xifenfei         |       10 |

(7 rows)

--通过dump 该文件解析数据

<Data> -----

 Item   1 -- Length:    0  Offset:    6 (0x0006)  Flags: REDIRECT

 Item   2 -- Length:   96  Offset: 8096 (0x1fa0)  Flags: NORMAL

COPY: 99        pg_toast

 Item   3 -- Length:    0  Offset:    7 (0x0007)  Flags: REDIRECT

 Item   4 -- Length:   96  Offset: 8000 (0x1f40)  Flags: NORMAL

COPY: 12314     pg_temp_1

 Item   5 -- Length:   96  Offset: 7904 (0x1ee0)  Flags: NORMAL

COPY: 12315     pg_toast_temp_1

 Item   6 -- Length:  141  Offset: 7760 (0x1e50)  Flags: NORMAL

COPY: 11        pg_catalog

 Item   7 -- Length:  141  Offset: 7616 (0x1dc0)  Flags: NORMAL

COPY: 2200      public

 Item   8 -- Length:    0  Offset:    9 (0x0009)  Flags: REDIRECT

 Item   9 -- Length:  141  Offset: 7472 (0x1d30)  Flags: NORMAL

COPY: 13887     information_schema

 Item  10 -- Length:   96  Offset: 7376 (0x1cd0)  Flags: NORMAL

COPY: 16404     u_xifenfei

通过pg_namespace,pg_class信息,可以获取到对象所属的模式关系,基于上述汇总,可以获取到某个模式下面,所有表id和实际存储路径,现在使用pg_filedump进行恢复,还缺少表的列类型信息,通过pg_type和pg_attribute来获取。

获取PostgreSQL表的列名称和类型[编号]信息

--sql查询列信息

postgres=# \d t_tbs

               Table "public.t_tbs"

  Column  | Type | Collation | Nullable | Default

----------+------+-----------+----------+---------

 oid      | oid  |           |          |

 spcname  | name |           |          |

 spcowner | oid  |           |          |

Tablespace: "tbs_xifenfei"

postgres=# select attrelid,attname,atttypid,attstattarget,attlen,attnum from pg_attribute where attrelid=16408;

 attrelid | attname  | atttypid | attstattarget | attlen | attnum

----------+----------+----------+---------------+--------+--------

    16408 | tableoid |       26 |             0 |      4 |     -6

    16408 | cmax     |       29 |             0 |      4 |     -5

    16408 | xmax     |       28 |             0 |      4 |     -4

    16408 | cmin     |       29 |             0 |      4 |     -3

    16408 | xmin     |       28 |             0 |      4 |     -2

    16408 | ctid     |       27 |             0 |      6 |     -1

    16408 | oid      |       26 |            -1 |      4 |      1

    16408 | spcname  |       19 |            -1 |     64 |      2

    16408 | spcowner |       26 |            -1 |      4 |      3

(9 rows)

--dump 内容(截取部分)

 Item  11 -- Length:  144  Offset: 1424 (0x0590)  Flags: NORMAL

COPY: 16408     oid     26      -1      4       1

 Item  12 -- Length:  144  Offset: 1280 (0x0500)  Flags: NORMAL

COPY: 16408     spcname 19      -1      64      2

 Item  13 -- Length:  144  Offset: 1136 (0x0470)  Flags: NORMAL

COPY: 16408     spcowner        26      -1      4       3

 Item  14 -- Length:  144  Offset:  992 (0x03e0)  Flags: NORMAL

COPY: 16408     ctid    27      0       6       -1

 Item  15 -- Length:  144  Offset:  848 (0x0350)  Flags: NORMAL

COPY: 16408     xmin    28      0       4       -2

 Item  16 -- Length:  144  Offset:  704 (0x02c0)  Flags: NORMAL

COPY: 16408     cmin    29      0       4       -3

 Item  17 -- Length:  144  Offset:  560 (0x0230)  Flags: NORMAL

COPY: 16408     xmax    28      0       4       -4

 Item  18 -- Length:  144  Offset:  416 (0x01a0)  Flags: NORMAL

COPY: 16408     cmax    29      0       4       -5

PostgreSQL获取类型编号和实际类型名称对应关系

--查询类型编号和实际类型关系

postgres=# select oid,typname from pg_type;

  oid  |                typname               

-------+---------------------------------------

    16 | bool

    17 | bytea

    18 | char

    19 | name

    20 | int8

    21 | int2

    22 | int2vector

    23 | int4

    24 | regproc

    25 | text

    26 | oid

    27 | tid

    28 | xid

    29 | cid

……

--dump 内容(截取部分)

 Item   1 -- Length:  176  Offset: 8016 (0x1f50)  Flags: NORMAL

COPY: 16        bool

 Item   2 -- Length:  176  Offset: 7840 (0x1ea0)  Flags: NORMAL

COPY: 17        bytea

 Item   3 -- Length:  176  Offset: 7664 (0x1df0)  Flags: NORMAL

COPY: 18        char

 Item   4 -- Length:  176  Offset: 7488 (0x1d40)  Flags: NORMAL

COPY: 19        name

 Item   5 -- Length:  176  Offset: 7312 (0x1c90)  Flags: NORMAL

COPY: 20        int8

 Item   6 -- Length:  176  Offset: 7136 (0x1be0)  Flags: NORMAL

COPY: 21        int2

 Item   7 -- Length:  176  Offset: 6960 (0x1b30)  Flags: NORMAL

COPY: 22        int2vector

 Item   8 -- Length:  176  Offset: 6784 (0x1a80)  Flags: NORMAL

COPY: 23        int4

 Item   9 -- Length:  176  Offset: 6608 (0x19d0)  Flags: NORMAL

COPY: 24        regproc

 Item  10 -- Length:  176  Offset: 6432 (0x1920)  Flags: NORMAL

COPY: 25        text

 Item  11 -- Length:  176  Offset: 6256 (0x1870)  Flags: NORMAL

COPY: 26        oid

 Item  12 -- Length:  176  Offset: 6080 (0x17c0)  Flags: NORMAL

COPY: 27        tid

 Item  13 -- Length:  176  Offset: 5904 (0x1710)  Flags: NORMAL

COPY: 28        xid

 Item  14 -- Length:  176  Offset: 5728 (0x1660)  Flags: NORMAL

COPY: 29        cid

 Item  15 -- Length:  176  Offset: 5552 (0x15b0)  Flags: NORMAL

COPY: 30        oidvector

通过pg_class、pg_type和pg_attribute可以获取对象的表的列名称,数据类型等信息。通过以上几个对象,即可获取到pg_filedmp处理所需要的所有信息,然后可以实现批量处理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/825821.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode--3 无重复最长字串

题目描述 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长 子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。示例 2: 输入: s "bbbbb" 输出: 1 …

PyTorch torch.nn.functional.one_hot用法解析

1.用法 在PyTorch中&#xff0c;我们可以使用torch.nn.functional.one_hot函数来实现One-Hot编码。下面是一个简单的例子&#xff1a; import torch import torch.nn.functional as F # 假设我们有一个包含类别标签的张量 labels torch.tensor([0, 2, 1, 0, 2]) # 使用torch…

深度学习概念

AIGC数据生产&#xff1a; AIGC在生成小图片时效果更佳(因为小图信息量更少&#xff0c;相同算力下效果更好)&#xff1b;所以适合构造一些交通场景。比如护栏损坏&#xff1a;只mask原图的部分区域(图中白色区域)&#xff0c;即可引导模型在mask处生成损坏的护栏。 基于此方…

【LeetCode热题100】【动态规划】完全平方数

题目链接&#xff1a;279. 完全平方数 - 力扣&#xff08;LeetCode&#xff09; 完全平方数是可以表示成某个整数的平方的数&#xff0c;要找和为n的完全平方数的最少数目 满足要求的完全平方数最小是1&#xff0c;最大不会超过n的平方根 所以题目变成要从1&#xff0c;2&am…

【LeetCode热题100】【动态规划】最长递增子序列

题目链接&#xff1a;300. 最长递增子序列 - 力扣&#xff08;LeetCode&#xff09; 让dp[i]是以nums[i]为结尾的子序列的最长递增长度&#xff0c;遍历nums[i]之前的元素&#xff0c;如果有比nums[i]小的&#xff0c;说明递增子序列可以延申 class Solution { public:int le…

拖拽式工作流有哪几个优势?

在信息技术迅猛发展的今天&#xff0c;如何助力中小型企业在数字化转型的过程中平稳过渡&#xff1f;又是如何让中小型企业摆脱数据孤岛、成本投入高等各种瓶颈和难题&#xff1f;低代码技术平台是近些年较为理想的平台产品&#xff0c;其中拖拽式工作流优势特点突出&#xff0…

地埋电缆故障检测方法有哪些?地埋电缆故障检测费用是多少?

地埋电缆故障检测方法主要涵盖脉冲反射法、桥接法、高压闪络法和声波定位法等多种方法。选择适当的方法取决于故障类型、电缆类型和实际现场条件。至于地埋电缆故障检测费用则受到多个因素的影响&#xff0c;包括故障类型、检测方法的复杂性、检测设备的先进程度以及所处地区的…

从零开始搭建社交圈子系统:充实人脉的最佳路径

线上交友圈&#xff1a;拓展社交网络的新时代 线上交友圈是社交网络的新引擎&#xff0c;提供了更广泛的社交机会&#xff0c;注重共同兴趣的连接&#xff0c;强调多样性的社交形式&#xff0c;更真实地展示自己&#xff0c;让朋友更全面地了解我们的生活状态。虽然虚拟交往存在…

SD-WAN解决电商企业海外业务网络难题

全球化背景下&#xff0c;众多国内企业都涉及到海外贸易业务&#xff0c;尤其是出海电商得到蓬勃发展。企业做出海电商&#xff0c;需要访问国外网页、社交平台&#xff0c;如亚马逊、TikTok、Facebook、YouTube等与客户沟通互动&#xff0c;SD-WAN的发展正好为解决国际网络访问…

时序分析相关考题汇总

时序分析例题_如下一个分频电路,触发器建立时间tsu 2ns,保持时间thold 2ns,逻辑延时tq -CSDN博客 IC/FPGA笔试/面试题分析&#xff08;七&#xff09;建立时间和保持时间类型考题汇总分析_建立时间 保持时间 笔试题-CSDN博客

Qt(十二)Graphics View 绘图架构(三)

文章目录 一、QGraphicsView相关整理二、QGraphicsView架构下实时鼠标绘制图形2.1 鼠标拖拽绘图说明2.2 记录图形第一个绘制点2.3 实时获取鼠标最新位置并绘图2.4 释放绘制点&#xff0c;绘制最终图形 三、QGraphicsView 在鼠标点击处进行放大缩小 一、QGraphicsView相关整理 …

14 Php学习:表单

表单 PHP 表单是用于收集用户输入的工具&#xff0c;通常用于网站开发。PHP 可以与 HTML 表单一起使用&#xff0c;用于处理用户提交的数据。通过 PHP 表单&#xff0c;您可以创建各种类型的表单&#xff0c;包括文本输入框、复选框、下拉菜单等&#xff0c;以便用户可以填写和…

孩子不爱学习的解决办法?最佳回答

孩子说不想上学了&#xff0c;想必这句话很多父母都不陌生&#xff0c;从自家孩子嘴里听到过。孩子十三岁了&#xff0c;正是叛逆的时候&#xff0c;很多孩子会在这个时候出现不爱读书的情况&#xff0c;面对这样的情况&#xff0c;家长要保持冷静&#xff0c;采取合理的解决办…

主存储器与CPU之间的连接(会画图)

位扩展 字扩展 由于只有A13&#xff0c; A14 连到了译码器上&#xff0c;以、因此该译码器是一个 2/4 译码器&#xff0c;对应的选片有四种。选中第一个选片&#xff0c;就是把译码器“0口置0&#xff0c; 1~3口置1”&#xff0c;因为CS有非号&#xff0c;因此&#xff0c;低电…

数据结构——线索树

核心思路就是要先将空指针转为线索 也就是多出来的n1个指针&#xff0c;然后再将这些指针连成一个链表&#xff0c;遍历就可以达到O(n&#xff09;的速度打出 以下代码为中序遍历 前序和后续随缘更新 #include <iostream> #include <stdlib.h> using namespace s…

【C++】string的使用

目录 1、为什么学习string类&#xff1f; 2、标准库中的string类 2.1 string类 2.2 string类的常见接口声明 2.2.1 string类的常见构造 ​编辑 2.2.2 string类对象的访问及遍历操作 2.2.3 string类对象的容量操作 2.2.4 string类对象的修改操作 ​编辑 1、为什么学习s…

npm install CERT_HAS_EXPIRED解决方法

目录 一、问题描述二、问题原因三、解决方法 一、问题描述 执行命令 npm install 报错&#xff1a; npm WARN registry Unexpected warning for https://registry.npm.taobao.org/: Miscellaneous Warning CERT_HAS_EXPIRED: request to https://registry.npm.taobao.org/js-…

excel中vlookup查找值必须在table_array的第一列,有其他办法吗有XLOOKUP

vlookup查找值必须在table_array的第一列&#xff0c;有其他办法吗&#xff1f;有XLOOKUP。 vlookup 查找如下&#xff0c;查找值必须在table_array的第一列 如果下面&#xff0c;编码和名称交换位置&#xff0c;就不能使用vlookup查找了。 XLOOKUP 查找如下

Linux:进程调度

Linux&#xff1a;进程调度 进程优先级查看优先级调整优先级 Linux 2.6 内核进程调度队列 进程优先级 查看优先级 在Linux中&#xff0c;进程是有优先级的&#xff0c;我们可以通过指令ps -la来查看&#xff1a; 其中PRI表示priority优先级&#xff0c;在Linux中&#xff0c;…

算法章节目录

​​​​​​0 决策树基础-CSDN博客 1 GBDT:梯度提升决策树-CSDN博客 2 逻辑斯蒂回归&#xff08;分类&#xff09;-CSDN博客 3 xgboost-CSDN博客 4 lightGBM-CSDN博客 5 CatBoost模型-CSDN博客 6 tabNet: 堪比xgboost的深度学习模型-CSDN博客 7 Transform结构-CSDN博客