您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“PostgreSQL中WAL segment file內(nèi)部結(jié)構(gòu)分析”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
WAL segment file
WAL segment file內(nèi)部劃分為N個(gè)page(Block),每個(gè)page大小為8K,第一個(gè)page的header對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)為XLogLongPageHeaderData,其他page的header對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)是XLogPageHeaderData.在header后是N個(gè)XLOG Record.
XLOG Record
XLOG Record由兩部分組成,第一部分固定大小,對(duì)應(yīng)的結(jié)構(gòu)體為XLogRecord;第二部分是XLOG Record data
XLOG Record data
XLOG Record data由以下幾部分組成:
1.0..N個(gè)XLogRecordBlockHeader,每個(gè)XLogRecordBlockHeader對(duì)應(yīng)一個(gè)block data;
注意:如設(shè)置了BKPBLOCK_HAS_IMAGE標(biāo)記,則在XLogRecordBlockHeader結(jié)構(gòu)體后跟XLogRecordBlockImageHeader結(jié)構(gòu)體;如設(shè)置了BKPIMAGE_HAS_HOLE和 BKPIMAGE_IS_COMPRESSED則在XLogRecordBlockImageHeader后跟XLogRecordBlockCompressHeader結(jié)構(gòu)體;
2.XLogRecordDataHeader[Short|Long]:如數(shù)據(jù)<256Bytes,則使用Short格式,否則使用Long格式;
3.block data:full-write-block數(shù)據(jù),如啟用了壓縮,則壓縮存儲(chǔ),相關(guān)元數(shù)據(jù)存儲(chǔ)在XLogRecordBlockHeader中的XLogRecordBlockCompressHeader中.
4.main data:(tuple) data/checkpoint等日志數(shù)據(jù).
使用linux下的hexdump工具查看WAL文件中的內(nèi)容,可以直觀的感知上述內(nèi)部結(jié)構(gòu)
測(cè)試機(jī)的WAL segmengt file:
[xdb@localhost pg_wal]$ ll total 32796 -rw-------. 1 xdb xdb 16777216 Dec 18 10:52 000000010000000100000042 ...
XLogPageHeaderData
uint16 xlp_magic
[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 0 -n 2 00000000 98 d0 |..| 00000002
magic value為0xD098.
注意:X86 CPU使用小端模式(Little-Endian),如數(shù)據(jù)占用超過1個(gè)字節(jié),則高位字節(jié)在內(nèi)存高位地址,低位字節(jié)在內(nèi)存低位地址,寫入到文件時(shí)直接從內(nèi)存flush到磁盤上,磁盤文件上的字節(jié)順序與內(nèi)存保持一致.
uint16 xlp_info
[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 2 -n 2 00000002 07 00 |..| 00000004
xlp_info標(biāo)志為0x0007,即XLP_FIRST_IS_CONTRECORD | XLP_LONG_HEADER | XLP_BKP_REMOVABLE
標(biāo)明:
1.XLOG Record跨越page邊界;
2.這個(gè)page的header是XLogLongPageHeaderData
3.從該頁起始的backup blocks是可選的(不一定存在)
TimeLineID(uint32) xlp_tli
[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 4 -n 4 00000004 01 00 00 00 |....| 00000008
TimeLineID為0x00000001,即十進(jìn)制數(shù)值1
XLogRecPtr(uint64) xlp_pageaddr
[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 8 -n 8 00000008 00 00 00 42 01 00 00 00 |...B....| 00000010
XLog Record在事務(wù)日志指針(偏移)為0x00000001 42000000
uint32 xlp_rem_len
[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 16 -n 4 00000010 0f 00 00 00 |....| 00000014
上一頁空間不足以存儲(chǔ)XLOG Record,該Record在本頁繼續(xù)存儲(chǔ)占用的空間大小:0x0000000F
XLogLongPageHeaderData
XLogLongPageHeaderData的第一個(gè)域字段是XLogPageHeaderData,相關(guān)數(shù)據(jù)參見以上XLogPageHeaderData描述.
注意:XLogPageHeaderData結(jié)構(gòu)體按最大基本類型對(duì)齊,會(huì)擴(kuò)充為24Bytes(原為20Bytes),因此XLogLongPageHeaderData的內(nèi)容從24開始起算.
uint64 xlp_sysid
[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 24 -n 8 00000018 42 72 7f 55 41 76 ee 5b |Br.UAv.[| 00000020
系統(tǒng)標(biāo)識(shí)碼0x5BEE7641557F7242
[xdb@localhost ~]$ echo $((0x5BEE7641557F7242)) 6624362124887945794
使用pg_controldata查看Database system identifier-->6624362124887945794
[xdb@localhost ~]$ pg_controldata pg_control version number: 1100 Catalog version number: 201809051 Database system identifier: 6624362124887945794 ...
uint32 xlp_seg_size
[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 32 -n 4 00000020 00 00 00 01 |....| 00000024
值為0x01000000,即16M
[xdb@localhost ~]$ echo $((0x01000000)) 16777216
uint32 xlp_xlog_blcksz
[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 36 -n 4 00000024 00 20 00 00 |. ..| 00000028
值為0x00002000,即8K
[xdb@localhost ~]$ echo $((0x00002000)) 8192
上一page XLOG Record的數(shù)據(jù)
由于空間不足,上一page的XLOG Record在本頁繼續(xù)存儲(chǔ)占用的數(shù)據(jù)(xlp_rem_len=0x0F,補(bǔ)齊為16B)
[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 40 -n 16 00000028 31 00 00 00 00 00 00 00 00 69 b8 40 25 00 00 00 |1........i.@%...| 00000038
XLogRecord
接下來是XLogRecord
uint32 xl_tot_len
[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 56 -n 4 00000038 4f 00 00 00 |O...| 0000003c
XLOG Record長(zhǎng)度為0x0000004F
TransactionId(uint32) xl_xid
[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 60 -n 4 0000003c 6b 07 00 00 |k...| 00000040
事務(wù)ID為0x0000076B,即十進(jìn)制的1899
XLogRecPtr(uint64) xl_prev
[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 64 -n 8 00000040 c0 ff ff 41 01 00 00 00 |...A....| 00000048
上一個(gè)XLOG Record的偏移,即0x00000001 41FFFFC0
unit8 xl_info
[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 72 -n 1 00000048 00 |.| 00000049
標(biāo)志位為0x00
unit8 xl_rmid
[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 73 -n 1 00000049 0a |.| 0000004a
該記錄的資源管理器,即0x0A
2 bytes of padding
[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 74 -n 2 0000004a 00 00 |..| 0000004c
pg_crc32c(uint32) xl_crc
[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 76 -n 4 0000004c ea 21 d2 50 |.!.P| 00000050
CRC校驗(yàn)位,即0x50D221EA
“PostgreSQL中WAL segment file內(nèi)部結(jié)構(gòu)分析”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。