一、原理分析
1,循环调用getopt_long解析命令行参数,将参数保存到静态DumpOptions dopt;中
2,判断参数是否相容,不相容则退出:
<代码>选项- s/J胶蚢/数据不能一起使用 选项- c/删弧?数据不能一起使用 选项——插入——列插入和o/oid不能一起使用 选择——是否存在需要选项- c/清洁代码>
3,调用CreateArchive打开输出文件,输出流为输出信号。该函数使用4个文件封装了4种不同转储文件格式,增加新文件可以增加新的导出文件类型各自封装,独立易于维护。
<代码> CreateArchive→_allocAH: 开关(啊→格式){ 案例archCustom: InitArchiveFmt_Custom(啊); 打破; 案例archNull: InitArchiveFmt_Null(啊); 打破; 案例archDirectory: InitArchiveFmt_Directory(啊); 打破; 案例archTar: InitArchiveFmt_Tar(啊); 打破; 默认值: exit_horribly (modulename,“无法识别的文件格式\ " % d \“\ n”, fmt); }代码>
4,输出信号是一个重要的全局变量
5,调用ConnectDatabase连接数据库
6,调用setup_connection,在连接上执行一些SQL语句:
<代码>选择pg_catalog。set_config (“search_path”、“假); 设置client_encoding ' % s '//pg_dump - e指定 % s//设置的作用 设置DATESTYLE=ISO; 设置INTERVALSTYLE=POSTGRES; extra_float_digits设置为3; 设置synchronize_seqscans; 设置statement_timeout=0; 设置lock_timeout=0; 设置idle_in_transaction_session_timeout=0; 设置row_security=; 开始; 设置事务隔离级别可重复读,只读;代码>
7日为兼容低版本,根据服务器版本号决定一些变量取值
8日调用tblinfo=getSchemaData(输出端,和numTables);决定导出哪些数据库对象。本函数又调用如下函数,值得关注哦。为了存储每个对象的元数据,这些函数会malloc申请空间,直到pg_dump进程结束才释放。
<代码> extinfo=getExtensions(输出端,和numExtensions); extinfoindex=buildIndexArray (extinfo numExtensions, sizeof (ExtensionInfo)); getExtensionMembership(输出端,extinfo numExtensions); nspinfo=getnamespace(输出端,和numNamespaces); nspinfoindex=buildIndexArray (nspinfo numNamespaces, sizeof (NamespaceInfo)); tblinfo=可以获得的(输出端,和numTables); tblinfoindex=buildIndexArray (tblinfo numTables, sizeof (TableInfo)); getOwnedSeqs(输出端,tblinfo numTables); funinfo=getFuncs(输出端,和numFuncs); funinfoindex=buildIndexArray (funinfo numFuncs, sizeof (FuncInfo)); typinfo=getTypes(输出端,和numTypes); typinfoindex=buildIndexArray (typinfo numTypes, sizeof (TypeInfo)); getProcLangs(输出端,numProcLangs); getAggregates(输出端,numAggregates); oprinfo=getOperators(输出端,和numOperators); oprinfoindex=buildIndexArray (oprinfo numOperators, sizeof (oprinfo)); getAccessMethods(输出端,numAccessMethods); getOpclasses(输出端,numOpclasses); getOpfamilies(输出端,numOpfamilies); getTSParsers(输出端,numTSParsers); getTSTemplates(输出端,numTSTemplates); getTSDictionaries(输出端,numTSDicts); getTSConfigurations(输出端,numTSConfigs); getForeignDataWrappers(输出端,numForeignDataWrappers); getForeignServers(输出端,numForeignServers); getDefaultACLs(输出端,numDefaultACLs); collinfo=getCollations(输出端,和numCollations); collinfoindex=buildIndexArray (collinfo numCollations, sizeof (collinfo)); getConversions(输出端,numConversions); getCasts(输出端,numCasts); getTransforms(输出端,numTransforms); inhinfo=getInherits(输出端,和numInherits); getEventTriggers(输出端,numEventTriggers); processExtensionTables(输出端,extinfo numExtensions); flagInhTables (tblinfo numTables、inhinfo numInherits); getTableAttrs(输出端,tblinfo numTables); flagInhAttrs(输出端→dopt、tblinfo numTables); getIndexes(输出端,tblinfo numTables); getExtendedStatistics(输出端); getConstraints(输出端,tblinfo numTables); getTriggers(输出端,tblinfo numTables); getRules(输出端,numRules); getPolicies(输出端,tblinfo numTables); getPublications(输出端); getPublicationTables(输出端,tblinfo numTables); getSubscriptions(输出端);代码>
<代码>对于每个getxxx函数都将执行下面流程,以能得到的为例: 1)根据服务器版本号查询系统表,读出对象的元数据信息 2)malloc内存空间并将查询结果存放到对象的数据结构中,TableInfo 3)对于每条元数据信息,调用selectDumpableTable标记需要导出的表,如果- t指定导出表,遍历该列的表,得到对应表并标记:DUMP_COMPONENT_ALL; - t指定删除表,标记tbinfo→dobj。转储=DUMP_COMPONENT_NONE 4)dumpIdMap [dobj→dumpId]=dobj;将导出表的元数据存放到dumpIdMap数组中 5)在导出表上执行锁表% s访问共享模式 6)将所有元数据信息保存后,执行设置statement_timeout=0保证语句不超时,能够一直执行下去PostgreSQL逻辑备份pg_dump使用及其原理解析