pg_dump执行流程简单记录

2022-09-26 21:57:07 浏览数 (2)

简单总结便于以后查询。

速查

  • 第一步:建立连接
  • 第二步: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
    ...

0 人点赞