postgres預寫式日誌的內核實現詳解-XLOG類型

導讀:數據庫

    postgres預寫式日誌的內核實現詳解-概述ide

 

XLOG(RM_XLOG_ID)日誌類型記錄很雜亂,以下爲XLOG類型的wal子類型。post

/* 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類型就是記錄關機checkpointui

數據庫正常運行時也會進行checkpoint,XLOG_CHECKPOINT_ONLINE類型就是記錄正常的checkpointthis

此wal類型中可能包含的數據spa

CheckPoint結構體:必定存在,使用XLogRegisterData()註冊。.net

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記錄類型。rest

 

XLOG_NEXTOID

任何操做產生一個新的oid會產生這個wal類型日誌

此wal類型中可能包含的數據code

新產生的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()註冊。

相關文章
相關標籤/搜索