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

openGauss数据拯救终于有方案

原创 ZhangChen-PDU 2025-01-07
420

    数据拯救是专业DBA绕不开的一个话题,当数据库遇到正常途径无法开库、备份失效或干脆没有备份、常规方式已无法恢复等极端情况时,想要获取原数据库中的数据,唯一可行的手段就是直接对数据文件进行抽取。

    极端场景下的数据拯救也是各种数据库的生态中重要的一环。在此类场景中,Oracle可以用odu/dul直接对数据文件或者ASM磁盘进行数据提取;Postgresql也有生态中的pg_filedump工具可以在知道表结构的情况下对单表进行挖掘。

    而openGauss虽然是基于Postgresql 9.2进行重构,但是由于数据页的结构存在差异、TOAST表不严格按照seq排序等原因,pg_filedump这款工具是没有办法用于openGauss的。

    经过很长一段时间的开发与验证,我终于可以向各位介绍这款面向openGauss系数据库的数据拯救工具——pdu。

    首先让我们明确pdu的使用场景:在无法使用备份进行恢复,且数据文件的一致性被破坏,无法通过gs_ctl start起库的情况下,可使用pdu工具直接从数据文件中进行数据抽取,是用于极端场景下的数据恢复手段,为用户的数据安全提供最后一道屏障。

    pdu工具由两部分组成,pdu可执行文件+PGDATA.ini配置文件,整体的设计理念就是降低使用者的学习成本。

--------使用指南 起始位置--------

1、配置PGDATA路径

    用户只需要在PGDATA.ini中配置数据目录所在的路径即可,无需其他配置。

图片

2、Bootstrap 初始化

    路径配置完成后,执行./pdu,即可进入使用界面。     

图片

    初始化命令为 'b;' 该命令会自动对配置文件中数据目录进行初始化,读取整个数据库的结构关系并打印在屏幕上。                              

图片

    初始化完成后的界面如上所示,以 上层【数据库】+下层模式 的形式进行展示。不过这个界面只会在初始化时出现一次,后续用户可以用show database命令来查看可选择的数据库。

图片

    对于同一个数据目录,只需要初始化一次即可一直使用(毕竟PDU的使用场景默认数据文件不会再有变化)。

3、Use Database/Set Schema 指定数据库与模式

    初始化完毕后的使用方式参考了openGauss本身gsql客户端的使用逻辑,用户在抽取数据之前首先需要指定当前的Database与Schema。

    在使用 'use 库名;' 的命令选定数据库之后,会显示出该数据库下可设置的模式与其对应的表数量。
           图片
    在使用 'set 模式名;' 的命令选定模式之后,则会显示出该模式下表大小排名前50的表名与其表文件的大小。
       图片
4、unload tablename 导出单张表
    在选定DB与Schema后,用户就可以使用unload命令对数据进行抽取了。例如上图中最大的表t1,可以用unload t1命令进行解析。
图片
图片
最终对t1表解析了40个表文件,行数为89466177
5、unload SCH 导出整个schema
单独处理完大表后,我们也可以选择直接导出整个Schema。此处选择的xman数据库的testschema3模式,在当前界面执行unload SCH即可导出testschema3下的所有数据+表ddl+COPY语句

图片

6、unload SCHDDL 导出schema下所有表的ddl
    为了在测试的过程中验证抽取的数据是否可以正常恢复,还额外提供了生成表DDL的功能,但该功能比较起pg_get_tabledef中获取的表定义还是相差了很多细节,只能用于简单测试使用,像是表上的索引、约束、排序规则、注释等均没有进行恢复。

图片

7、使用COPY还原
    有了表数据+表结构,最后一步就是用COPY把数据还原回去,在unload SCH命令的最后一步会自动生成包含COPY命令的文件。用户也可以自行生成COPY文件。
图片

图片 

图片
此外,退出命令为exit;

--------使用指南 结束位置--------

    以上就是pdu的大致使用方式,其他的细节可以使用help命令来查看

图片

    pdu当前支持的数据库版本:
1、openGauss5.0(其他版本没有时间进行测试)
2、基于openGauss的商用发行数据库,目前对海量数据库Vastbase G100的支持度最高。其他厂商如果也是基于og 5.0版本且无大的变动,则pdu应该同样适用。

    数据类型方面,当前支持的数据类型如下,_前缀表示一维数组类型:

  • smallserial、tinyint、smallint、int、oid、xid、bigint、bigserial

  • time、timetz、date、timestamp、timestamptz

  • real、float4、float8、bool、numeric、number

  • name、char、charn、varchar、varcharn、varchar2、text、json、xml、blob

  • _int4、_text、_varchar、_float4、_float8、_timestamp

    当前尚不支持GIS类型,其余数据类型到时候如果大家高频用到了却发现不支持的也可以留言反馈。
pdu工具当前也存在着诸如以下等问题:
  1. 不支持解析加密过的数据;

  2. BLOB类型的16进制数据会被直接解析为字符串;

  3. 对于表对象数量xx的大库初始化较慢;

  4. 不支持并行解析表

...

    至于工具的下载链接,大家可以关注微信公众号ZhangChen-PDU并回复"og"即可下载opengauss版本的pdu;回复"vb"即可下载Vastbase版本的pdu。
    在使用前,建议使用ulimit -n放开open file的限制;且出于安全考虑,如果数据库是运行状态,则pdu无法运行,建议在测试环境进行学习使用。

    本次发出的版本不对数据抽取做任何限制,包含当前的所有功能和数据类型,仅存在有效期的限制。

   希望大家在使用的过程中可以反馈一些意见和建议,应该也会有很多我没测出的bug,希望大家多多包涵🌝。以及大家如果能想到一些有意义发但是当前没有的功能也可以在公众号中私信我。


--在文章的结尾特别感谢我的女朋友在计算机底层专业知识上给予我的帮助❤

最后修改时间:2025-01-07 10:59:46
文章转载自ZhangChen-PDU,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论