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

本文详细解释了PostgreSQL中WAL(Write-Ahead Logging)日志的一种常见格式,包括如何解析由十六进制组成的LSN(Log Sequence Number)以及如何使用内置函数进行转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者:瀚高PG实验室 (Highgo PG Lab)- 海无涯
上一次说到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 十进制的


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值