前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >pg_dump执行流程简单记录

pg_dump执行流程简单记录

作者头像
mingjie
发布2022-09-26 21:57:07
4560
发布2022-09-26 21:57:07
举报

简单总结便于以后查询。

速查

  • 第一步:建立连接
  • 第二步:expand把入参做进一步解析,例如目标表、目标命名空间等,解析为oids
  • 第三步:getXXX系列函数,拼接SQL调用Libpq执行,结果就是所有数据库对象,所有对象归一化为DumpableObject父类型,具体使用时把DumpableObject转换为子类型。
  • 第四步:dumpXXXX系列函数,遍历所有DumpableObject拼接成可执行文本,输出。

详细

pg_dump.c

代码语言:javascript
复制
// 打开输出文件
fout = CreateArchive

// 创建连接
ConnectDatabase
setup_connection

// 按参数配置过滤,然后将对象名转换为OID
expand_schema_name_patterns          ---> schema_include_oids
expand_table_name_patterns           ---> table_include_oids ------------------
expand_foreign_server_name_patterns  ---> foreign_servers_include_oids        |
expand_extension_name_patterns       ---> extension_include_oids              |
                                                                              |
                                                                              |
// 开始收集所有能导出对象的信息(无数据)                                           /
getSchemaData                                                                |
  getExtensions                                                              |
  getNamespaces                                                              |
  getTables  <--------------------------------------------------------------/
    // 【第一步】长SQL查询pg_class表,拿到所有:
    // RELKIND_SEQUENCE、RELKIND_RELATION、RELKIND_SEQUENCE、RELKIND_VIEW、RELKIND_COMPOSITE_TYPE
    // 类型对象
    // numTables = 结果行数
    // 【第二步】构造TableInfo数组,数组长度=numTables
    // 【第三步for】遍历TableInfo数组,添加数据-->
      // 【第四步】使用selectDumpableTable函数标记某个tblinfo是否需要dump:tbinfo->dobj.dump=DUMP_COMPONENT_ALL或DUMP_COMPONENT_NONE
  getOwnedSeqs
  getFuncs
  getTypes
  ...
  getIndexes
    // 【第一步for】 遍历tblinfo数组,排除无索引表、排除tbinfo->dobj.dump标记不导出的表
      // 【第二步】对于每一个需要导出的表,长SQL查询索引信息,申请一个IndxInfo数组挂在【tbinfo->indexes】长度等于索引数
      // 【第三步for】对于查询出来的每一个索引,也就是IndxInfo数组中的每一个位置-->
        // 【第四步】填充IndxInfo数组数据
  flagInhIndexes
    // 标记分区表索引
  getConstraints
  

// 收集数据
getTableData
  makeTableDataInfo

=====================================

// 开始dump数据
dumpEncoding
dumpStdStrings
dumpSearchPath
dumpDatabase
for (i = 0; i < numObjs; i++)
  // 所有对象统一成DumpableObject格式
  dumpDumpableObject(Archive *fout, const DumpableObject *dobj)
    DO_TABLE:    dumpTable
    DO_INDEX:    dumpIndex
    ...
    DO_FUNC:     dumpFunc
    ...
本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-08-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 速查
  • 详细
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com