本页目录

GaussDB/OpenGauss AStore WAL日志回放

heap_insert产生WAL entry

openGauss-server/include/access/xlogdefs.h

/*
 * Pointer to a location in the XLOG.  These pointers are 64 bits wide,
 * because we don't want them ever to overflow.
 */
typedef uint64 XLogRecPtr;

产生一条RM_HEAP_ID类型的WAL记录。

openGauss-server/gausskernel/storage/access/heap/heapam.cpp

        uint8 info = XLOG_HEAP_INSERT;
        ...
        recptr = XLogInsert(RM_HEAP_ID, info, InvalidBktId, istoast);

        PageSetLSN(page, recptr);

Page LSN可以保证日志回放的幂等性

  • 如果 记录LSN > 页面LSN:说明这条WAL记录比页面上的修改更新,页面缺少这次更新。因此,恢复进程会执行这条WAL记录中的操作,将数据页更新到最新状态。操作完成后,调用 PageSetLSN 将页面的LSN更新为 记录LSN。
  • 如果 记录LSN <= 页面LSN:说明这条WAL记录的修改已经体现在了当前数据页上(可能之前已经重做过了)。此时,恢复进程会安全地跳过这条WAL记录,不做任何操作。

XLOG类型定义