资源类型
所有类型定义在src/include/access/rmgrlist.h
文件中通过宏定义PG_RMGR
引入,并在src/backend/access/transam/rmgr.c
z中通过如下代码定义到RmgrTable
数组中:
/* must be kept in sync with RmgrData definition in xlog_internal.h */
#define PG_RMGR(symname,name,redo,desc,identify,startup,cleanup,mask,decode) \
{ name, redo, desc, identify, startup, cleanup, mask, decode },
RmgrData RmgrTable[RM_MAX_ID + 1] = {
#include "access/rmgrlist.h"
};
数组元素类型RmgrData
定义如下:
typedef struct RmgrData
{
const char *rm_name;
void (*rm_redo) (XLogReaderState *record);
void (*rm_desc) (StringInfo buf, XLogReaderState *record);
const char *(*rm_identify) (uint8 info);
void (*rm_startup) (void);
void (*rm_cleanup) (void);
void (*rm_mask) (char *pagedata, BlockNumber blkno);
void (*rm_decode) (struct LogicalDecodingContext *ctx,
struct XLogRecordBuffer *buf);
} RmgrData;
出了资源类型名,改结构体定义了一组方法在处理XLOG时调用:
- rm_redo: 解析XLOG日志并重做
- rm_desc: 解析XLOG日志,输出描述信息(字符串)
- rm_identify: 解析XLOG,输出标识符(字符串),不同资源类型的标识符定义不同,也可能存储在不同的字段
- rm_startup: XLOG重做前调用,用于资源初始化
- rm_cleanup: XLOG重做后调用,用于资源回收
- rm_mask: 对页面进行屏蔽操作。一般用于比较2个页面是否一致前,使用该接口屏蔽掉不用比较的部分(比如heap页面的free space部分)
- rm_decode: 用于XLOG的逻辑解码
下表分析了所有资源类型:
类型 | 类型ID | 说明 |
---|---|---|
XLOG | RM_XLOG_ID | 主要和pg_control文件相关,也包括其它一些作用的日志: XLOG_CHECKPOINT_SHUTDOWN: 正常关闭PG时的最后一个checkpoint日志XLOG_CHECKPOINT_ONLINE: 一般checkpoint日志XLOG_NOOP: 目前看没有任何作用XLOG_NEXTOID: 分配下一批OidXLOG_SWITCH: 用于XLOG日志文件切换时原文件的最后1条日志XLOG_BACKUP_END: backup结束时插入该日志,表示一致性点XLOG_PARAMETER_CHANGE: 一些写入pg_control的参数往往也要求主备一致,所以需要写入此类日志XLOG_RESTORE_POINT: 用于标识pg_create_restore_point创建的恢复点的日志XLOG_FPW_CHANGE: PG的full_page_writes配置发生改变时写入此日志XLOG_END_OF_RECOVERY: recovery结束时写入此日志XLOG_FPI_FOR_HINT: 因为设置hint bits产生的全页写日志XLOG_FPI: 全页写日志 |
Transaction | RM_XACT_ID | 和各种事务有关的日志: XLOG_XACT_COMMIT: 事务提交日志XLOG_XACT_PREPARE: 2PC事务prepare日志XLOG_XACT_ABORT: 事务回滚日志XLOG_XACT_COMMIT_PREPARED: 2PC事务提交日志XLOG_XACT_ABORT_PREPARED: 2PC事务回滚日志XLOG_XACT_ASSIGNMENT: 带子事务的事务通知备机子事务列表的日志。参考XLOG_XACT_INVALIDATIONS: 逻辑复制时给备机传递InvalidationMessage的日志XLOG_XACT_HAS_INFO: 额外的标记bit,标识是否有设置一组标记信息 |
Storage | RM_SMGR_ID | 和文件元操作相关的日志: XLOG_SMGR_CREATE: 创建文件XLOG_SMGR_TRUNCATE: 截断文件 |
CLOG | RM_CLOG_ID | 和CLOG文件操作相关的日志: CLOG_ZEROPAGE: 页面清零CLOG_TRUNCATE: truncate clog文件 |
Database | RM_DBASE_ID | 和database相关的日志: XLOG_DBASE_CREATE_FILE_COPY: 此模式下,DB使用的每一个表空间只写入一条日志,表示复制整个目录XLOG_DBASE_CREATE_WAL_LOG: 此模式下,先写入该条日志,然后将所有复制文件的操作,包括元数据和数据都写入WALLOG,PG的默认模式XLOG_DBASE_DROP: 删除数据库目录 |
Tablespace | RM_TBLSPC_ID | 和表空间相关的日志: XLOG_TBLSPC_CREATE: 创建表空间XLOG_TBLSPC_DROP: 删除表空间 |
MultiXact | RM_MULTIXACT_ID | 和MultiXact相关的日志: XLOG_MULTIXACT_ZERO_OFF_PAGE: offsets文件页面清零XLOG_MULTIXACT_ZERO_MEM_PAGE: members文件页面清零XLOG_MULTIXACT_CREATE_ID: 创建MultiXact的日志,包含其事务ID和所有membersXLOG_MULTIXACT_TRUNCATE_ID: 清理MultiXact的日志,包含要清理的事务集合 |
RelMap | RM_RELMAP_ID | 和pg_filenode.map相关的日志: XLOG_RELMAP_UPDATE: 更新pg_filenode.map文件 |
Standby | RM_STANDBY_ID | 和备机相关的日志: XLOG_STANDBY_LOCK: AccessExclusiveLock写入的日志,该锁需要传递给备机XLOG_RUNNING_XACTS: 将当前快照的所有xid发送到备机XLOG_INVALIDATIONS: 给备机传递InvalidationMessage的日志 |
HeapHeap2 | RM_HEAP_IDRM_HEAP2_ID | heap文件相关的日志: XLOG_HEAP_INSERT: 插入tupleXLOG_HEAP_DELETE: 删除tuple,标记删除,不是真的删除元组XLOG_HEAP_UPDATE: 更新tuple,包含新旧tuple信息XLOG_HEAP_TRUNCATE: 逻辑复制时才有,对应普通模式的XLOG_SMGR_TRUNCATEXLOG_HEAP_HOT_UPDATE: HOT更新tupleXLOG_HEAP_CONFIRM: 确认潜在(on conflict)插入tuple成功时写入该类型日志,如果不成功产生一条XLOG_HEAP_DELETE日志XLOG_HEAP_LOCK: tuple锁XLOG_HEAP_INPLACE: 原地更新tutple。比如pg_class表中一些统计值的更新就使用这种操作XLOG_HEAP_INIT_PAGE: 额外的标记bit,表示日志是对应页面的第一次操作XLOG_HEAP2_REWRITE: 一张表如果开了逻辑复制,则在其RelFileNode发生改变时(CLUSTER或VACCUM FULL),会将其加入到一个map文件中,该日志对应这个文件的持久化XLOG_HEAP2_PRUNE: 对页的prune操作,标记死元组,碎片整理XLOG_HEAP2_VACUUM: 对页的vacuum操作,清理死元组XLOG_HEAP2_FREEZE_PAGE: 对页的freeze操作,freeze元组XLOG_HEAP2_VISIBLE: 设置页面的vm状态XLOG_HEAP2_MULTI_INSERT: 批量插入tupleXLOG_HEAP2_LOCK_UPDATED: tuple的exclusive锁XLOG_HEAP2_NEW_CID: 在打开逻辑解码时,系统表的tuple更新操作需要发送此类型日志 |
Btree | RM_BTREE_ID | 和B+树索引相关的日志: XLOG_BTREE_INSERT_LEAF: 不产生页面分裂情况下,在叶子节点插入索引项XLOG_BTREE_INSERT_UPPER: 在中间节点插入索引项,以完成下层节点的分裂操作XLOG_BTREE_INSERT_META: XLOG_BTREE_INSERT_UPPER的情况下,加上更新meta页XLOG_BTREE_SPLIT_L: 插入索引项引起节点分裂,新项在左节点XLOG_BTREE_SPLIT_R: 插入索引项引起节点分裂,新项在右节点XLOG_BTREE_INSERT_POST: 在叶子节点插入key重复的索引项,引起倒排索引链表的更新XLOG_BTREE_DEDUP: 对结点中的索引项进行去重处理,生成倒排索引链XLOG_BTREE_DELETE: 从叶子节点删除索引项XLOG_BTREE_UNLINK_PAGE: 将一个处于half-dead 状态的节点删除。参考XLOG_BTREE_UNLINK_PAGE_META: XLOG_BTREE_UNLINK_PAGE的情况下,加上更新meta页XLOG_BTREE_NEWROOT: 创建新的ROOT节点(原ROOT节点分裂)XLOG_BTREE_MARK_PAGE_HALFDEAD: 将一个叶子节点标记为half-dead 状态。参考XLOG_BTREE_VACUUM: vacuum时批量删除索引项XLOG_BTREE_REUSE_PAGE: 根据FSM重用一个索引页XLOG_BTREE_META_CLEANUP: 更新meta页中数据清理相关的字段 |
Hash | RM_HASH_ID | 和hash索引相关的日志: XLOG_HASH_INIT_META_PAGE: 初始化meta页XLOG_HASH_INIT_BITMAP_PAGE: 初始化bitmap页XLOG_HASH_INSERT: 不产生页面分裂情况下,插入索引项XLOG_HASH_ADD_OVFL_PAGE: 增加一个溢出页XLOG_HASH_SPLIT_ALLOCATE_PAGE: 分裂出新的bucket页,一般根据填充因子,会提前分裂XLOG_HASH_SPLIT_PAGE: 索引项从老的bucket分裂复制到新的bucket页XLOG_HASH_SPLIT_COMPLETE: 分裂操作结束XLOG_HASH_MOVE_PAGE_CONTENTS: 在一个bucket内,对索引项进行跨页的迁移(整理碎片)XLOG_HASH_SQUEEZE_PAGE: 删除整理后空的溢出页XLOG_HASH_DELETE: 从页面中删除索引项XLOG_HASH_SPLIT_CLEANUP: 所有因split操作需要清理的元组完成清理后,需要重置bucket的对应标记位XLOG_HASH_UPDATE_META_PAGE: vacuum操作后更新meta页XLOG_HASH_VACUUM_ONE_PAGE: 清理一个页面里的死元组 |
Gin | RM_GIN_ID | 和GIN索引相关的日志: XLOG_GIN_CREATE_PTREE: 使用1条元组,构建新的PostingTreeXLOG_GIN_INSERT: 不产生页面分裂情况下,插入索引项XLOG_GIN_SPLIT: 插入索引项,引起页面分裂XLOG_GIN_VACUUM_PAGE: 页面vacuum操作,通常就是写入整个页面XLOG_GIN_VACUUM_DATA_LEAF_PAGE: PostingTree的叶子节点的vacuum操作XLOG_GIN_DELETE_PAGE: 删除一个PostingTree节点XLOG_GIN_UPDATE_META_PAGE: 更新meta页XLOG_GIN_INSERT_LISTPAGE: 将一组索引项构造为一个页面并插入PendingListXLOG_GIN_DELETE_LISTPAGE: 从PendingList批量删除节点 |
Gist | RM_GIST_ID | 和GiST索引相关的日志: XLOG_GIST_PAGE_UPDATE: 页面更新日志,包括多条记录的删除和(或)插入操作XLOG_GIST_DELETE: (标记)删除叶子节点中的索引项XLOG_GIST_PAGE_REUSE: 根据FSM重用一个索引页XLOG_GIST_PAGE_SPLIT: 索引页分裂日志XLOG_GIST_PAGE_DELETE: 删除索引页XLOG_GIST_ASSIGN_LSN: dummy日志,为了推进一下LSN |
Sequence | RM_SEQ_ID | 和Sequence相关的日志: XLOG_SEQ_LOG: 创建、重置取下一个值的操作都是这一种日志类型 |
SPGist | RM_SPGIST_ID | 和SP-GiST索引相关的日志: XLOG_SPGIST_ADD_LEAF: 不产生页面分裂情况下,插入索引项XLOG_SPGIST_MOVE_LEAFS: 跨页迁移一个索引链然后插入索引项XLOG_SPGIST_ADD_NODE: 插入内部索引项XLOG_SPGIST_SPLIT_TUPLE: 按前后缀拆分元组XLOG_SPGIST_PICKSPLIT: 插入索引项,引起页面分裂XLOG_SPGIST_VACUUM_LEAF: 叶子节点的vacuum操作XLOG_SPGIST_VACUUM_ROOT: 既是叶子结点又是ROOT节点(只有1个节点)的vacuum操作XLOG_SPGIST_VACUUM_REDIRECT: 清理重定向和占位索引项 |
BRIN | RM_BRIN_ID | 和Brin索引相关的日志: XLOG_BRIN_CREATE_INDEX: 创建新的BRIN索引,就是构造一个meta页XLOG_BRIN_INSERT: 插入索引项XLOG_BRIN_UPDATE: 更新索引项,实际上是在另一个页面插入新索引项XLOG_BRIN_SAMEPAGE_UPDATE: 同上,不过新索引项和老的在同一个页面XLOG_BRIN_REVMAP_EXTEND: 扩展一个revmap页面XLOG_BRIN_DESUMMARIZE: 删除索引项,标记页Range为unsummarizedXLOG_BRIN_INIT_PAGE: 额外的标记bit,表示日志是对应页面的第一次操作 |
CommitTs | RM_COMMIT_TS_ID | 和CommitTs文件相关的日志: COMMIT_TS_ZEROPAGE: 页面清零COMMIT_TS_TRUNCATE: truncate CommitTs文件 |
ReplicationOrigin | RM_REPLORIGIN_ID | 和复制源有关的日志: XLOG_REPLORIGIN_SET: 更新复制源的进度XLOG_REPLORIGIN_DROP: 删除复制源 |
Generic | RM_GENERIC_ID | 通用的日志类型,就一种子类型。对应页面的二进制修改 |
LogicalMessage | RM_LOGICALMSG_ID | 逻辑解码日志,就一种子类型。 |