postgres预写式日志的内核实现详解-XLOG类型

导读:

    postgres预写式日志的内核实现详解-概述

 

XLOG(RM_XLOG_ID)日志类型记录很杂乱,如下为XLOG类型的wal子类型。

/* XLOG info values for XLOG rmgr */
#define XLOG_CHECKPOINT_SHUTDOWN		0x00
#define XLOG_CHECKPOINT_ONLINE			0x10
#define XLOG_NOOP						0x20
#define XLOG_NEXTOID					0x30
#define XLOG_SWITCH						0x40
#define XLOG_BACKUP_END					0x50
#define XLOG_PARAMETER_CHANGE			0x60
#define XLOG_RESTORE_POINT				0x70
#define XLOG_FPW_CHANGE					0x80
#define XLOG_END_OF_RECOVERY			0x90
#define XLOG_FPI_FOR_HINT				0xA0
#define XLOG_FPI						0xB0

 

XLOG_CHECKPOINT_SHUTDOWN和XLOG_CHECKPOINT_ONLINE

在数据库关机时会首先执行一次checkpoint,XLOG_CHECKPOINT_SHUTDOWN类型就是记录关机checkpoint

数据库正常运行时也会进行checkpoint,XLOG_CHECKPOINT_ONLINE类型就是记录正常的checkpoint

此wal类型中可能包含的数据

CheckPoint结构体:一定存在,使用XLogRegisterData()注册。

typedef struct CheckPoint
{
	XLogRecPtr	redo;			/* next RecPtr available when we began to
								 * create CheckPoint (i.e. REDO start point) */
	TimeLineID	ThisTimeLineID; /* current TLI */
	TimeLineID	PrevTimeLineID; /* previous TLI, if this record begins a new
								 * timeline (equals ThisTimeLineID otherwise) */
	bool		fullPageWrites; /* current full_page_writes */
	uint32		nextXidEpoch;	/* higher-order bits of nextXid */
	TransactionId nextXid;		/* next free XID */
	Oid			nextOid;		/* next free OID */
	MultiXactId nextMulti;		/* next free MultiXactId */
	MultiXactOffset nextMultiOffset;	/* next free MultiXact offset */
	TransactionId oldestXid;	/* cluster-wide minimum datfrozenxid */
	Oid			oldestXidDB;	/* database with minimum datfrozenxid */
	MultiXactId oldestMulti;	/* cluster-wide minimum datminmxid */
	Oid			oldestMultiDB;	/* database with minimum datminmxid */
	pg_time_t	time;			/* time stamp of checkpoint */
	TransactionId oldestCommitTsXid;	/* oldest Xid with valid commit
										 * timestamp */
	TransactionId newestCommitTsXid;	/* newest Xid with valid commit
										 * timestamp */

	/*
	 * Oldest XID still running. This is only needed to initialize hot standby
	 * mode from an online checkpoint, so we only bother calculating this for
	 * online checkpoints and only when wal_level is replica. Otherwise it's
	 * set to InvalidTransactionId.
	 */
	TransactionId oldestActiveXid;
} CheckPoint;

 

XLOG_NOOP

代码中枚举了这种类型的wal日志,但是没有代码能产生这种wal记录类型。

 

XLOG_NEXTOID

任何操作产生一个新的oid会产生这个wal类型

此wal类型中可能包含的数据

新产生的oid(Oid):一定存在,使用XLogRegisterData()注册。

 

XLOG_SWITCH

在wal日志发生切换时会产生这个wal类型。

此wal类型中可能包含的数据

无特有数据

 

XLOG_BACKUP_END

执行pg_stop_backup()时会产生这个wal类型

此wal类型中可能包含的数据

XLogRecPtr数据(开始备份的lsn):一定存在,使用XLogRegisterData()注册。

 

XLOG_PARAMETER_CHANGE

wal_level、wal_log_hints、MaxConnections、max_worker_processes、max_prepared_xacts、max_locks_per_xact、track_commit_timestamp

上述这些对备机很重要的GUC参数如果发生了改变就会产生这个wal类型

执行pg_stop_backup()时会产生这个wal类型

特定描述结构体

typedef struct xl_parameter_change
{
	int			MaxConnections;
	int			max_worker_processes;
	int			max_prepared_xacts;
	int			max_locks_per_xact;
	int			wal_level;
	bool		wal_log_hints;
	bool		track_commit_timestamp;
} xl_parameter_change;

此wal类型中可能包含的数据

xl_parameter_change结构体:一定存在,使用XLogRegisterData()注册。

 

XLOG_RESTORE_POINT

建立恢复点时会产生这个wal记录

特定描述结构体

typedef struct xl_restore_point
{
	TimestampTz rp_time;
	char		rp_name[MAXFNAMELEN];
} xl_restore_point;

rp_time:建立恢复点的时间

rp_name:恢复点的名字

此wal类型中可能包含的数据

xl_restore_point结构体:一定存在,使用XLogRegisterData()注册。

 

XLOG_FPW_CHANGE

如果GUC参数中的full_page_writes发生改变就会记录这个wal类型

此wal类型中可能包含的数据

fullPageWrites(bool):一定存在,使用XLogRegisterData()注册。

 

XLOG_END_OF_RECOVERY

数据库完成一次恢复后会产生这个wal类型

特定描述结构体

typedef struct xl_end_of_recovery
{
	TimestampTz end_time;
	TimeLineID	ThisTimeLineID; /* new TLI */
	TimeLineID	PrevTimeLineID; /* previous TLI we forked off from */
} xl_end_of_recovery;

此wal类型中可能包含的数据

xl_end_of_recovery结构体:一定存在,使用XLogRegisterData()注册。

 

XLOG_FPI_FOR_HINT

在开启了page checksum或者wal_log_hints后,数据页发生不重要变化时(比如pageheader一些flag)

也遵循全页写机制。

此wal类型中可能包含的数据

发生变化的page的所有数据:一定存在,通过XLogRegisterBlock()注册。

XLOG_FPI

初始化一个数据页后(初始化索引页时,表页重构时),将此数据页执行FPW写到wal日志中,产生此wal类型。

此wal类型中可能包含的数据

初始化的页数据:一定存在,通过XLogRegisterBlock()注册。

 

 

转载于:https://my.oschina.net/lcc1990/blog/3010149

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值