WAL日志的命名规则深度解析(二)

来源:互联网 发布:北京壁虎网络 编辑:程序博客网 时间:2024/06/05 05:12

上一次说到WAL日志的命名规则,但是在实际的数据库环境中,我们还会经常遇到WAL日志的另一种命名格式:

highgo=# select pg_current_xlog_location(); pg_current_xlog_location -------------------------- 1/A301EEE0(1 行记录)

这里表示的同为WAL日志文件的位置LSN(Log Sequence Number)
此处的文件格式和时间线相关的“历史文件”中文件命名格式相同(参考源码函数:src\backend\access\transam\timeline.c)

除此之外,函数pg_current_xlog_location、pg_current_xlog_insert_locatione及pg_start_backup返回的格式也都是两个十六进制的数字中间用斜杠“/”分隔表示WAL日志位置。
logId就是“1/A301EEE0”中的第一个数字,即1
logSeg就是“0/A301EEE0”中的第二个数字除以16M的大小,即A301EEE0除以16M,而16M相当于2的24次方,相当于十六进制数“A301EEE0”右移6位(32-24),即“A301EEE0”中的最高两位“A3” 。
那么根据WAL文件的格式timeline+logId+logSeg,则相当于:“00000001”+“00000001”+“000000A3”,即为:“0000000100000000000000A3” 写的位置是在文件“0000000100000001000000A3”中的偏移量是多少呢?实际上是在“1/A301EEE0”中第二个数字“12B00B48”后六位“01EEE0”,换算成十进制为“126688”。
当然PostgreSQL已准备了函数pg_xlogfile_name_offset帮我们做以上的转换。

binary 二进制的octal 八进制的hexadecimal 十六进制的decimal 十进制的

BY 海无涯

原创粉丝点击