久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

PostgreSQL中WAL segment file內部結構分析

193次閱讀
沒有評論

共計 4430 個字符,預計需要花費 12 分鐘才能閱讀完成。

本篇內容介紹了“PostgreSQL 中 WAL segment file 內部結構分析”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓丸趣 TV 小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

WAL segment file
WAL segment file 內部劃分為 N 個 page(Block), 每個 page 大小為 8K, 第一個 page 的 header 對應的數據結構為 XLogLongPageHeaderData, 其他 page 的 header 對應的數據結構是 XLogPageHeaderData. 在 header 后是 N 個 XLOG Record.

XLOG Record
XLOG Record 由兩部分組成, 第一部分固定大小, 對應的結構體為 XLogRecord; 第二部分是 XLOG Record data

XLOG Record data
XLOG Record data 由以下幾部分組成:
1.0..N 個 XLogRecordBlockHeader, 每個 XLogRecordBlockHeader 對應一個 block data;
注意: 如設置了 BKPBLOCK_HAS_IMAGE 標記, 則在 XLogRecordBlockHeader 結構體后跟 XLogRecordBlockImageHeader 結構體; 如設置了 BKPIMAGE_HAS_HOLE 和 BKPIMAGE_IS_COMPRESSED 則在 XLogRecordBlockImageHeader 后跟 XLogRecordBlockCompressHeader 結構體;
2.XLogRecordDataHeader[Short|Long]: 如數據 256Bytes, 則使用 Short 格式, 否則使用 Long 格式;
3.block data:full-write-block 數據, 如啟用了壓縮, 則壓縮存儲, 相關元數據存儲在 XLogRecordBlockHeader 中的 XLogRecordBlockCompressHeader 中.
4.main data:(tuple) data/checkpoint 等日志數據.

二、樣例說明

使用 linux 下的 hexdump 工具查看 WAL 文件中的內容, 可以直觀的感知上述內部結構
測試機的 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), 如數據占用超過 1 個字節, 則高位字節在內存高位地址, 低位字節在內存低位地址, 寫入到文件時直接從內存 flush 到磁盤上, 磁盤文件上的字節順序與內存保持一致.

uint16 xlp_info

[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 2 -n 2 
00000002 07 00 |..|
00000004

xlp_info 標志為 0x0007, 即 XLP_FIRST_IS_CONTRECORD | XLP_LONG_HEADER | XLP_BKP_REMOVABLE
標明:
1.XLOG Record 跨越 page 邊界;
2. 這個 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, 即十進制數值 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 在事務日志指針 (偏移) 為 0x00000001 42000000

uint32 xlp_rem_len

[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 16 -n 4
00000010 0f 00 00 00 |....|
00000014

上一頁空間不足以存儲 XLOG Record, 該 Record 在本頁繼續存儲占用的空間大小:0x0000000F

XLogLongPageHeaderData
XLogLongPageHeaderData 的第一個域字段是 XLogPageHeaderData, 相關數據參見以上 XLogPageHeaderData 描述.
注意:XLogPageHeaderData 結構體按最大基本類型對齊, 會擴充為 24Bytes(原為 20Bytes), 因此 XLogLongPageHeaderData 的內容從 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

系統標識碼 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 的數據
由于空間不足, 上一 page 的 XLOG Record 在本頁繼續存儲占用的數據(xlp_rem_len=0x0F, 補齊為 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 長度為 0x0000004F
TransactionId(uint32) xl_xid

[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 60 -n 4
0000003c 6b 07 00 00 |k...|
00000040

事務 ID 為 0x0000076B, 即十進制的 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

上一個 XLOG Record 的偏移, 即 0x00000001 41FFFFC0
unit8 xl_info

[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 72 -n 1
00000048 00 |.|
00000049

標志位為 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 校驗位, 即 0x50D221EA

“PostgreSQL 中 WAL segment file 內部結構分析”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注丸趣 TV 網站,丸趣 TV 小編將為大家輸出更多高質量的實用文章!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-24發表,共計4430字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 台山市| 扎鲁特旗| 西充县| 江川县| 娱乐| 中西区| 福海县| 冕宁县| 上虞市| 清远市| 台北县| 桐庐县| 城市| 札达县| 利辛县| 白沙| 大城县| 金沙县| 明水县| 新田县| 子洲县| 沙河市| 长兴县| 三门峡市| 扬州市| 义马市| 小金县| 合山市| 南岸区| 田林县| 贵港市| 威远县| 夏邑县| 万盛区| 洪湖市| 元氏县| 安龙县| 杭锦后旗| 道孚县| 富锦市| 甘孜县|