PostgreSQL逻辑备份pg_dump使用及其原理解析

  

一、原理分析

  

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使用及其原理解析