PostgreSQL启动恢复过程中日志源的切换

  

日志源会在XLOG_FROM_ARCHIVE→XLOG_FROM_STREAM→XLOG_FROM_ARCHIVE直接切换,只有读取过程中出的错,就会切换到另外一个日志源。但实际执行过程中,XLOG_FROM_ARCHIVE出错后会到XLOG_FROM_PG_WAL读取,但是日志源的变量并不会改变。这个需要注意。

 PostgreSQL启动恢复过程中日志源的切换

static  int   XLogFileReadAnyTLI (XLogSegNo  segno, int  emode,, int 源)   {   ,   if  (expectedTLEs)   时间=tles  expectedTLEs;   其他的   时间=tles  readTimeLineHistory (recoveryTargetTLI);/*   1,WaitForWALToBecomeAvailable调用时,源是XLOG_FROM_ARCHIVE时,会使用XLOG_FROM_ANY   2、使用XLOG_FROM_ANY,会首先从归档中读取xlog,如果打开失败,则会使用XLOG_FROM_PG_WAL   3、外部日志源变量并没有切换   */foreach(细胞,tl) {   tli  timelineid也;=,((TimeLineHistoryEntry  *), lfirst(细胞))→tli;   if  (tli  & lt;, curFileTLI)   打破;/*,不要# 39;t  bother  looking  at  too-old  TLIs  */if  (source ==, XLOG_FROM_ANY  | |, source ==, XLOG_FROM_ARCHIVE) {   时间=fd  XLogFileRead (segno, emode,,, tli XLOG_FROM_ARCHIVE,,真的);   if  (fd  !=, 1) {   if  (expectedTLEs !)   expectedTLEs =, tl;   return  fd;   }   }   if  (source ==, XLOG_FROM_ANY  | |, source ==, XLOG_FROM_PG_WAL) {   时间=fd  XLogFileRead (segno, emode,,, tli, XLOG_FROM_PG_WAL,,真的);   if  (fd  !=, 1) {   if  (expectedTLEs !)   expectedTLEs =, tl;   return  fd;   }   }   }   return  1;   }


PostgreSQL启动恢复过程中日志源的切换