• pg_dump执行流程简单记录


    简单总结便于以后查询。

    速查

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

    详细

    pg_dump.c

    // 打开输出文件
    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
        ...
        
        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
  • 相关阅读:
    软件工程开发和文档流程(及概要设计+详细设计)
    老卫带你学---leetcode刷题(139. 单词拆分)
    Android AMS——停止和结束Activity清理(十三)
    Java面试题:什么是Java中的单元测试以及如何编写单元测试?
    基于vue框架的uniapp小程序开发发现了新大陆
    makefile之静态库的生成
    JAVA最全面试题汇总基础篇(四)
    Linux--CE--ansible安装以及配置主控服务器和被控服务器
    Netty源码学习2——NioEventLoop的执行
    微服务实战系列之SpringCloud Alibaba学习(七)
  • 原文地址:https://blog.csdn.net/jackgo73/article/details/126591468