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 海无涯
- WAL日志的命名规则深度解析(一)
- WAL日志的命名规则深度解析(二)
- PHP命名空间的名称解析规则
- 预写式日志(Write-Ahead Logging (WAL))
- C#命名规则(一个程序员的C#命名规则 )
- 写wal log日志
- 交叉编译知识解析(二) —— 交叉编译器的名字的命名规则
- PHP命名空间解析规则
- PHP命名空间解析规则(告别PHP namespace给你带来的纠结)
- HashMap深度解析(一)
- HashMapS深度解析(一)
- postgresql减少wal日志生成量的方法
- postgresql减少wal日志生成量的方法
- HBase WAL 解析
- js 对有“命名空间”的表单做深度解析
- hbase 原代码分析 (11) WAL 写日志过程
- HBase源码系列(七)WAL与日志恢复
- Java基础篇笔记(一) ---变量的命名规则
- Pixhawk姿态解算流程图&姿态控制流程图
- 谷歌翻译代码-google translate code
- Android 根据系统声音模式设置提醒方式
- day 39 LAMP架构
- 人机关系:基于中国文化的机体哲学分析
- WAL日志的命名规则深度解析(一)
- mysql
- Thinkphp5.0 再进行api接口开发的时候,sesssion再同一个控制器不同的方法是无法获取session的。
- 关于模板类的实例
- IOS 开发常见问题列表
- 修改数据库主键为自增长时报错“[Err] 1062
- NLP汉语自然语言处理原理与实践 4 NLP中的概率图模型
- 《程序员修炼之道:从小工到专家》【PDF】下载
- js 中将string转化为double,避免产生多位数和计算精度损失。