前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Postgresql源码(7)Xlog格式

Postgresql源码(7)Xlog格式

作者头像
mingjie
发布2022-07-16 10:22:48
3350
发布2022-07-16 10:22:48
举报
文章被收录于专栏:Postgresql源码分析

日志头格式

代码语言:javascript
复制
typedef struct XLogPageHeaderData
{
【校验用magic数字】
	uint16		xlp_magic;		/* magic value for correctness checks */
【标志位信息】
	uint16		xlp_info;		/* flag bits, see below */
【时间线信息】
	TimeLineID	xlp_tli;		/* TimeLineID of first record on page */
【当前页面在日志文件中的位置】
	XLogRecPtr	xlp_pageaddr;	/* XLOG address of this page */
【日志跨页面保存,当前页面需要存的剩下的长度】
	uint32		xlp_rem_len;	/* total len of remaining data for record */
} XLogPageHeaderData;

文件结构

在这里插入图片描述
在这里插入图片描述

XLOG RECORD

日志之间有链接关系,xl_prev指向上一条日志的起始位置,下一条日志的位置用xl_tot_len可以找到,日志之间形成“双向链表”。

代码语言:javascript
复制
typedef struct XLogRecord
{
【日记长度】
	uint32		xl_tot_len;		/* total len of entire record */
【事务ID】
	TransactionId xl_xid;		/* xact id */
【上一条日志的LSN】
	XLogRecPtr	xl_prev;		/* ptr to previous record in log */
【产生这个记录的动作】
	uint8		xl_info;		/* flag bits, see below */
【日志记录对应的资源管理器】
	RmgrId		xl_rmid;		/* resource manager for this record */
	/* 2 bytes of padding here, initialize to zero */
	pg_crc32c	xl_crc;			/* CRC for this record */

	/* XLogRecordBlockHeaders and XLogRecordDataHeader follow, no padding */
【日志的数据信息】
} XLogRecord;

xl_info低4位保存flag信息,高4位保存日志动作信息。

第四位:

代码语言:javascript
复制
/*
 * If a WAL record modifies any relation files, in ways not covered by the
 * usual block references, this flag is set. This is not used for anything
 * by PostgreSQL itself, but it allows external tools that read WAL and keep
 * track of modified blocks to recognize such special record types.
 */
#define XLR_SPECIAL_REL_UPDATE	0x01

/*
 * Enforces consistency checks of replayed WAL at recovery. If enabled,
 * each record will log a full-page write for each block modified by the
 * record and will reuse it afterwards for consistency checks. The caller
 * of XLogInsert can use this value if necessary, but if
 * wal_consistency_checking is enabled for a rmgr this is set unconditionally.
 */
#define XLR_CHECK_CONSISTENCY	0x02

高四位:比如HEAP操作,对应8种动作信息

代码语言:javascript
复制
#define XLOG_HEAP_INSERT		0x00
#define XLOG_HEAP_DELETE		0x10
#define XLOG_HEAP_UPDATE		0x20
#define XLOG_HEAP_TRUNCATE		0x30
#define XLOG_HEAP_HOT_UPDATE	0x40
#define XLOG_HEAP_CONFIRM		0x50
#define XLOG_HEAP_LOCK			0x60
#define XLOG_HEAP_INPLACE		0x70

#define XLOG_HEAP_OPMASK		0x70
/*
 * When we insert 1st item on new page in INSERT, UPDATE, HOT_UPDATE,
 * or MULTI_INSERT, we can (and we do) restore entire page in redo
 */
#define XLOG_HEAP_INIT_PAGE		0x80

XLOG RECORD的数据格式

数据主要分两部分:

  • 页面信息:没有实际数据,只有页面相关的信息
  • 数据信息:紧跟着XlogRecordDataHeader后面存储,
    • 实际数据<255字节,使用XLogRecordDataHeaderShort,用1字节保存数据长度
    • 否则使用XLogRecordDataHeaderLong,用4字节保存数据长度
代码语言:javascript
复制
typedef struct XLogRecordDataHeaderShort
{
	uint8		id;				/* XLR_BLOCK_ID_DATA_SHORT */
	uint8		data_length;	/* number of payload bytes */
}			XLogRecordDataHeaderShort;

#define SizeOfXLogRecordDataHeaderShort (sizeof(uint8) * 2)

typedef struct XLogRecordDataHeaderLong
{
	uint8		id;				/* XLR_BLOCK_ID_DATA_LONG */
	/* followed by uint32 data_length, unaligned */
}			XLogRecordDataHeaderLong;

#define SizeOfXLogRecordDataHeaderLong (sizeof(uint8) + sizeof(uint32))
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-08-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 日志头格式
  • 文件结构
  • XLOG RECORD
  • XLOG RECORD的数据格式
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档