導讀:node
heap2(RM_HEAP2_ID)是數據庫對heap的修改產生的wal記錄(heap除去),以下爲heap2類型的wal子類型數組
#define XLOG_HEAP2_REWRITE 0x00 #define XLOG_HEAP2_CLEAN 0x10 #define XLOG_HEAP2_FREEZE_PAGE 0x20 #define XLOG_HEAP2_CLEANUP_INFO 0x30 #define XLOG_HEAP2_VISIBLE 0x40 #define XLOG_HEAP2_MULTI_INSERT 0x50 #define XLOG_HEAP2_LOCK_UPDATED 0x60 #define XLOG_HEAP2_NEW_CID 0x70
這種wal子類型在copy命令向表中插入數據時產生。代碼在heap_multi_insert()函數中。redo函數爲heap_xlog_multi_insert()。app
描述結構體函數
typedef struct xl_heap_multi_insert { uint8 flags; uint16 ntuples; OffsetNumber offsets[FLEXIBLE_ARRAY_MEMBER]; } xl_heap_multi_insert;
ntuples:這個mutinsert wal記錄中,包含的tuple的個數。post
offsets:每個tuple的在其page的相對位置。ui
flags:標誌位spa
#define XLH_INSERT_ALL_VISIBLE_CLEARED (1<<0)// VM穩健性相關 #define XLH_INSERT_LAST_IN_MULTI (1<<1)//一次copy命令產生的最後一個muti insert記錄會有此標記,logicaldecoding使用 #define XLH_INSERT_IS_SPECULATIVE (1<<2)//預測插入 #define XLH_INSERT_CONTAINS_NEW_TUPLE (1<<3)//即便fpw也要寫入元組數據
此wal類型中可能包含的數據.net
①xl_heap_multi_insert結構體:必定存在,經過XLogRegisterData()註冊日誌
②插入的元組所在的page數據:可能存在,使用XLogRegisterBuffer()註冊。
③插入的元組數據:可能存在,使用XLogRegisterBufData()註冊。
一個copy命令可能插入不少個page的數據。一個muti insert記錄裏的全部元組必須插入到同一個page裏。所以一個copy命令可能會產生不少這個wal記錄。
開啓logical wal日誌模式時,在系統表和一些特殊用戶表在執行vacuum full的過程當中。
會產生這個wal記錄類型。這個wal日誌類型主要是爲了恢復pg_logical/mapping下的文件,mapping目錄下的文件用於在系統表發生vacuum full後來判斷系統表元組的可見性。
描述結構體
typedef struct xl_heap_rewrite_mapping { TransactionId mapped_xid; /* xid that might need to see the row */ Oid mapped_db; /* DbOid or InvalidOid for shared rels */ Oid mapped_rel; /* Oid of the mapped relation */ off_t offset; /* How far have we written so far */ uint32 num_mappings; /* Number of in-memory mappings */ XLogRecPtr start_lsn; /* Insert LSN at begin of rewrite */ } xl_heap_rewrite_mapping;
mapped_xid:每個mapping都是用xid來標識的
mapped_db:數據庫oid
mapped_rel:表的oid
offset:pg_logical/mapping下這個map文件下一個寫入的位置
num_mappings:map的數量
start_lsn:rewrite開始時的lsn
此wal類型中可能包含的數據
①xl_heap_rewrite_mapping結構體:必定存在,經過XLogRegisterData()註冊
②此mapping的數據LogicalRewriteMappingData以下:必定存在,使用XLogRegisterData()註冊。
typedef struct LogicalRewriteMappingData { RelFileNode old_node; RelFileNode new_node; ItemPointerData old_tid; ItemPointerData new_tid; } LogicalRewriteMappingData;
執行vacuum會產生此wal記錄類型,一個page被清理後,會對這個page的item進行更新
typedef struct xl_heap_clean { TransactionId latestRemovedXid; uint16 nredirected; uint16 ndead; /* OFFSET NUMBERS are in the block reference 0 */ } xl_heap_clean;
latestReemovedXid:最舊xid,備機使用
nredirected:重定向的item的個數
ndead:死亡的item的個數
此wal類型中可能包含的數據
①xl_heap_clean結構體:必定存在,經過XLogRegisterData()註冊
②清理的page的全部數據:可能存在,使用XLogRegisterBuffer()註冊。
③'重定向的item的位置'數組,可能存在,經過XLogRegisterBufData()註冊
④'死亡的item的位置'數組,可能存在,經過XLogRegisterBufData()註冊
⑤'未使用的item的位置'數組,可能存在,經過XLogRegisterBufData()註冊
執行vacuum時,若是有元組被freeze,產生此wal記錄。
描述結構體
typedef struct xl_heap_freeze_page { TransactionId cutoff_xid; uint16 ntuples; } xl_heap_freeze_page;
cutoff_xid:最舊xid,備機使用
ntuples:freeze的元組的個數
此wal類型中可能包含的數據
①xl_heap_freeze_page結構體,必定存在,經過XLogRegisterData()註冊
②清理的page的全部數據:可能存在,使用XLogRegisterBuffer()註冊。
③每個freeze元組的清理結果,清理結果用xl_heap_freeze_tuple存儲,必定存在,使用XLogRegisterBufData()註冊。
typedef struct xl_heap_freeze_tuple { TransactionId xmax; OffsetNumber offset; uint16 t_infomask2; uint16 t_infomask; uint8 frzflags; } xl_heap_freeze_tuple;
備機使用的wal,具體做用沒有研究明白,暫時留白。
更改某個數據page在VM文件中的映射位時,產生這個wal記錄。
描述結構體
typedef struct xl_heap_visible { TransactionId cutoff_xid; uint8 flags; } xl_heap_visible;
cutoff_xid:最舊xid,備機使用
flags:設置的映射信息
#define VISIBILITYMAP_ALL_VISIBLE 0x01 //page內全部的tuple均可見 #define VISIBILITYMAP_ALL_FROZEN 0x02 //page內全部的tuple都frozen #define VISIBILITYMAP_VALID_BITS 0x03 //ALL_VISIBLE + ALL_FROZEN
此wal類型中可能包含的數據
①xl_heap_visible結構體,必定存在,經過XLogRegisterData()註冊
②修改的位所在的vm buff ,可能存在,經過XLogRegisterBuffer()註冊
③修改的位所指定的heapbuff,可能存在,經過XLogRegisterBuffer()註冊
在鎖定tuple時,若是當前元組有一個hot鏈,那麼須要將hot鏈上的全部tuple都要進行鎖定
對每個hot鏈上的tuple進程鎖定時,就會產生一個XLOG_HEAP2_LOCK_UPDATED 記錄
描述結構體
typedef struct xl_heap_lock_updated { TransactionId xmax; OffsetNumber offnum; uint8 infobits_set; uint8 flags; } xl_heap_lock_updated;
xmax: 產生wal記錄時的xmax
offnum: 被鎖定tuple在page上的偏移量
infobits_set:infomask值
flags: 標誌位
#define XLH_LOCK_ALL_FROZEN_CLEARED 0x01//VM文件相關
wal級別是logical以上時,系統表的heap發生變化時,就會產生這個wal記錄。
這個記錄的意義不在於恢復數據庫,而在於logigal decoding時分析系統表的變化而使用。
目前都logical decoding沒有很瞭解,這個wal記錄的解析,暫時留白。