導讀:數據庫
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
在數據庫關機時會首先執行一次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;
代碼中枚舉了這種類型的wal日誌,可是沒有代碼能產生這種wal記錄類型。rest
任何操做產生一個新的oid會產生這個wal類型日誌
此wal類型中可能包含的數據code
新產生的oid(Oid):必定存在,使用XLogRegisterData()註冊。
在wal日誌發生切換時會產生這個wal類型。
此wal類型中可能包含的數據
無特有數據
執行pg_stop_backup()時會產生這個wal類型
此wal類型中可能包含的數據
XLogRecPtr數據(開始備份的lsn):必定存在,使用XLogRegisterData()註冊。
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()註冊。
創建恢復點時會產生這個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()註冊。
若是GUC參數中的full_page_writes發生改變就會記錄這個wal類型
此wal類型中可能包含的數據
fullPageWrites(bool):必定存在,使用XLogRegisterData()註冊。
數據庫完成一次恢復後會產生這個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()註冊。
在開啓了page checksum或者wal_log_hints後,數據頁發生不重要變化時(好比pageheader一些flag)
也遵循全頁寫機制。
此wal類型中可能包含的數據
發生變化的page的全部數據:必定存在,經過XLogRegisterBlock()註冊。
初始化一個數據頁後(初始化索引頁時,表頁重構時),將此數據頁執行FPW寫到wal日誌中,產生此wal類型。
此wal類型中可能包含的數據
初始化的頁數據:必定存在,經過XLogRegisterBlock()註冊。