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.mfbz.cn/a/558596.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

x-cmd mod | x whisper - 使用 whisper.cpp 进行本地 AI 语音识别

介绍 Whisper 模块通过 whisper.cpp 帮助用户快速将音频转换为文字。 INFO: whisper.cpp 是一个用 C/C 编写的轻量级智能语音识别库&#xff0c;是基于 OpenAI 的 Whisper 模型的移植版本&#xff0c;旨在通过深度学习模型实现音频转文字功能。 由于 whisper.cpp 目前只支持 1…

cdp集群Hbase组件HRegionServer服务停止原因以及排查

前言&#xff1a;重启集群后某一节点HRegionServer服务停止&#xff0c;重启前所有服务均正常 去查看日志&#xff1a; 日志报错 ERROR HRegionServer Master rejected startup because clock is out of sync org.apache.hadoop.hbase.ClockOutOfSyncException: org.apache.h…

OpenHarmony鸿蒙南向开发案例:【智能窗户通风设备】

样例简介 本文档介绍了安全厨房案例中的相关智能窗户通风设备&#xff0c;本安全厨房案例利用轻量级软总线能力&#xff0c;将两块欧智通V200Z-R/BES2600开发板模拟的智能窗户通风设备和燃气告警设备组合成。当燃气数值告警时&#xff0c;无需其它操作&#xff0c;直接通知软总…

小球反弹(蓝桥杯)

文章目录 小球反弹【问题描述】答案&#xff1a;1100325199.77解题思路模拟 小球反弹 【问题描述】 有一长方形&#xff0c;长为 343720 单位长度&#xff0c;宽为 233333 单位长度。在其内部左上角顶点有一小球&#xff08;无视其体积&#xff09;&#xff0c;其初速度如图所…

企业单位IPTV数字电视直播与点播系统-中国卫通怀来地球站IPTV数字电视直播与点播系统应用浅析

企业单位IPTV数字电视直播与点播系统-中国卫通怀来地球站IPTV数字电视直播与点播系统应用浅析 由北京海特伟业科技有限公司任洪卓发布于2024年4月19日 一、运营商光猫接入企业/单位IPTV数字电视直播与点播系统建设概述 中国卫通怀来地球站&#xff0c;位于怀来县土木镇&#xf…

W11安装WSL2 ubuntu 攻略

W11安装WSL2 ubuntu 攻略 最近换了新电脑重新安装一遍wsl2&#xff0c;记录一下方便以后使用。 打开控制面板&#xff0c;选择程序 —— 启用或关闭Windows功能&#xff0c;勾选 适用于Linux的Windows子系统还有虚拟机平台选项&#xff0c;修改后需要重启 wsl2版本 wsl --se…

springcloud第4季 springcloud-alibaba之nacos篇-配置中心

一 nacos的配置中心 1.1 配置中心 namespace&#xff0c;group&#xff0c;dataid 之间的关系 1.2 配置样例

基于ssm汽车租赁系统业务管理子系统论文

系统简介 随着信息互联网购物的飞速发展&#xff0c;一般企业都去创建属于自己的管理系统。本文介绍了汽车租赁系统业务管理子系统的开发全过程。通过分析企业对于汽车租赁系统业务管理子系统的需求&#xff0c;创建了一个计算机管理汽车租赁系统业务管理子系统的方案。文章介…

【项目亮点】大厂中分布式事务的最佳实践 问题产生->难点与权衡(偏爱Saga)->解决方案

【项目亮点】大厂中分布式事务的最佳实践 问题产生->难点与权衡->解决方案->底层实现->应用案例 不断有同学问我大厂中实践分布式事务的问题,这里从分布式事务的产生,到强弱一致性与性能的权衡,再到最终落地的解决方案,再到实际的代码实现,再到我工作中实际使用SA…

高斯溅射融合之路(一)- webgl渲染3d gaussian splatting

大家好&#xff0c;我是山海鲸的技术负责人。之前已经写了一个GIS融合系列。其实CesiumJS的整合有相当的难度&#xff0c;同时也有很多方面的工作&#xff0c;很难在几篇文章内写完&#xff0c;整个山海鲸团队也是投入了接近两年的时间&#xff0c;才把周边整套工具链进行了完善…

Rust入门-引用借用

一、引用借用&#xff0c;是什么、为什么、怎么用 所有权上篇我们已经讨论过了&#xff0c;所以这篇我们讨论Rust的引用借用 1、引用借用 是什么&#xff1f; Rust 通过借用(Borrowing) 这个概念来达成上述的目的&#xff0c;获取变量的引用&#xff0c;称之为借用(borrowin…

nodejs工具脚本json转excel

json转excel 主要使用 sheetjs 库 vim convertJsonToExcel.js 封装转换方法 import fs from fs; import XLSX from xlsx;/*** 扁平化嵌套json对象* param {Object} jsonObj* param {String} prefix* returns*/ export function flattenKeys(jsonObj, prefix ) {const resul…

Echarts-丝带图

Echarts-丝带图 demo地址 打开CodePen 什么是丝带图&#xff1f; 丝带图是Power BI中独有额可视化视觉对象&#xff0c;它的工具提示能展示指标当期与下期的数据以及排名。需求&#xff1a;使用丝带图展示"2022年点播订单表"不同月份不同点播套餐对应订单数据。 …

给rwkv-pytorch 写个chat ui demo

rwkv-pytorch 项目地址 rwkv-pytorch from nicegui import uimessage_dict {1: [{"name":"Assistant","text":"你好"}]} current_name 1 import aiohttpasync def get_text_async(text"Hello, how are you?"):# 定义AP…

统一SQL-支持CHAR和VARCHAR2 (size BYTE|CHAR)转换

统一SQL介绍 https://www.light-pg.com/docs/LTSQL/current/index.html 源和目标 源数据库&#xff1a;Oracle 目标数据库&#xff1a;Postgresql&#xff0c;TDSQL-MySQL&#xff0c;达梦8&#xff0c;LightDB-Oracle 操作目标 在Oracle中的CHAR和VARCHAR2数据类型&…

stm32二刷-GPIO

一 什么是 GPIO: GPIO(general porpose intput output), 通用输入输出端口 . 二 我们先认识芯片控制 GPIO 输出控制。 2.1LED 硬件原理如图&#xff1a; 当电流从这根电线流通&#xff0c; LED 亮。当电流不通过这根电线&#xff0c; LED 灭。 上面 PF** &#xff0c;芯片电…

Windows下使用SDKMAN对JDK(Java)进行多版本管理

Windows下使用SDKMAN对JDK&#xff08;Java&#xff09;进行多版本管理 1.背景2.基于msys2工具2.1. msys2简介2.2. 安装与配置2.2. Windows环境变量配置参考2.3 结果确认 3. 基于WSL 1.背景 前端有nvm,python有miniconda,miniforge等&#xff0c;java呢&#xff1f;java在Linu…

【机器学习】Q-Learning算法:在序列决策问题中的实践与探索

在序列决策问题中的实践与探索 一、Q-Learning算法概述二、Q-Learning算法实例分析三、Q-Learning算法代码实现四、总结与展望 在人工智能领域&#xff0c;序列决策问题一直是一个核心挑战。面对复杂的环境和动态变化的状态&#xff0c;智能体如何做出最优决策&#xff0c;以达…

电动汽车充电站的最优选址定容(matlab程序)

0.代码链接 电动汽车充电站的最优选址定容&#xff08;matlab程序&#xff09;_电动汽车充电站配置程序资源-CSDN文库 1.简述 随着经济的快速发展,环境污染和能源紧缺问题越来越严重,电动汽车的出现可以起到保护环境,节约能源的作用。未来随着我国电动汽车数量的快速增加,充电…

OpenHarmony实战开发-如何视频弹幕功能。

介绍 本示例介绍如何使用ohos.danmakuflamemaster和ohos.gsyvideoplayer开发支持视频弹幕的播放器。可以自定义弹幕样式、占据屏幕宽度&#xff0c;发送弹幕&#xff0c;开关弹幕视图。 效果图预览 使用说明 点击播放按钮&#xff0c;进行视频播放&#xff0c;弹幕自动开启点…
最新文章