在postgres当中,重要的日志有两个,一个是WAL日志在postgres叫做xlog,有关详细信息在WAL子系统当中有说明。 本节要介绍的就是另一个提交日志,在postgres当中也叫做clog。

clog与xlog的交互:每当新的clog页面初始化为零的时候,都会生成一个xlog记录。clog其他写入来自xact.c当中事务的提交或者中止,xact.c为这些事件生成自己的xlog记录并在redo的时候重新执行更新状态。对于同步事务提交,在clog提交之前保证xlog提交已经刷新到磁盘来满足write xlog before data的规则。不过对于异步提交,需要跟踪影响每个clog页面的最新lsn,以便刷新xlog来满足WAL的规则。对于中止的事务,不需要关心这一点,无论同步还是异步最终都会失败。

// 初始化一个CLOG页,writeXlog为true的话还会写一个Xlog
ZeroCLOGPage(int pageno, bool writeXlog)  
{  
    int          slotno;  
  
    slotno = SimpleLruZeroPage(XactCtl, pageno);  
  
    if (writeXlog)  
       WriteZeroPageXlogRec(pageno);  
  
    return slotno;  
}

clog的page是通过slru.c中进行页面管理的。