导读:
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()注册。
来源:oschina
链接:https://my.oschina.net/u/3399614/blog/3010149