dram.me

Postgres95 pg_dump实现

在Postgres95 1.01代码库中,包含有pg_dump的代码,以及pg4_dump的代码。

猜测pg4_dump是为兼容导出POSTGRES数据用的,这里只就pg_dump展开分析,以下为具体流程:

  1. 连接数据库;

  2. 调用findLastBuiltinOid获取系统内部使用的最近oid,代码中是直接查询pg_database表中datnametemplate1oid,但从后期版本的文档看,这一字段可能已经更改为datlastsysoid(待确认);

  3. 调用dumpSchema导出元数据,具体实现包括:

    1. 调用getTypesgetFuncsgetAggregatesgetOperatorsgetTablesgetIndices函数,获取数据库中相应系统数据表中的信息,并存储为C结构体实例;

    2. 调用对应的dumpTypesdumpTables等函数,输出可用于恢复数据的SQL语句,例如CREATE TYPECREATE TABLE等;

  4. 调用dumpClasses导出数据,其中会用到上一步骤获取的元数据信息。导出采用COPY命令,最终恢复数据命令也是使用COPY

有一个细节,getTypes等函数在获取数据时,先后执行了beginend查询,不知是否是表示事务?但其中只有一个查询,为何需要事务?其中原因有待确定。