简单总结便于以后查询。
速查
- 第一步:建立连接
- 第二步: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
...