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

来源:互联网 发布:多伦多大学gpa算法 编辑:程序博客网 时间:2024/06/07 16:08
文章参考了唐成老师的博客:http://blog.osdba.net/534.html

此处说的WAL日志的命名规则指的就是$PGDATA/pg_xlog目录下的文件命名规则,或者说是归档日志的命名规则。
文件名字以十六进制表示且分为三个部分,第一部分是时间线标识(timelineid),一般保持该部分值不变。第二部分是文件标识ID(fileid,seg)第三部分是区段ID(seg)且值不能超过255,即0xFF。

    00000001 00000000 000000BC    -------- -------- --------     时间线    LogId    LogSeg

时间线:英文为timeline,是以1开始的递增数字,如1,2,3…
LogId:32bit长的一个数字,是以0开始递增的数字,如0,1,2,3…
LogSeg:32bit长的一个数字,是以0开始递增的数字,如0,1,2,3…

在pg_xlog中每个WAL区段都有16MB,每当前一个WAL日志填充满(或者被强制切换)就会切换到下一个WAL日志。
我们先来看一下当前写入的WAL日志:

highgo=# select pg_xlogfile_name(pg_current_xlog_location());     pg_xlogfile_name     -------------------------- 0000000100000001000000A3(1 row)WAL

日志的位置称之为LSN,即Log Sequence Number。
这样看起来LogID和LogSeg就组成了一个64bit的LSN,事实是这样吗?
此外我们可以观察到LogSeg的值是从00000000到000000FF后,就重新从00000000开始了,并不会出现00000100这样的数值,也就是LogSeg的8个字符中,前6个字符始终是0,这又是为什么?
LogSeg是按文件递增,每增加一个文件,LogSeg就增加1。其实,LogID确实是LSN的高32位,但是LogSeg却不是LSN的低32位,我们刚才已经讲了,每个WAL日志是16M,而32bit所能表示的最大值是4G(2^32)。实际上LogSeg是LSN的低32bit的字节的值再除以16M的结果,这样4G/16M(2^32/1024/1024/16)结果是256,所以LogSeg最大的值为256,即16进制的0xFF,这样就解释了LogSeg的前6字节都是零的原因。
另外原本LSN起始位置可以从0开始,但为了表示一些无效的位置,LSN的起始值并不是从0开始,也不是从1开始,而是跳过了一个WAL文件大小,即16M的位置开始,这样第一次时LogSeg是从1开始的,而不是从0开始了。

BY 海无涯

阅读全文
0 0
原创粉丝点击