WAL日志文件名称格式详解
转自:http://blog.osdba.net/534.html
WAL日志文件名称格式详解
PostgreSQL的WAL日志文件在pg_xlog目录下,一般情况下,每个文件为16M大小:
osdba-mac:~ osdba$ ls -l $PGDATA/pg_xlog
total 262144
-rw------- 1 osdba osdba 16777216 Oct 8 10:57 0000000100000000000000B6
-rw------- 1 osdba osdba 16777216 Jun 17 22:12 0000000100000000000000B7
-rw------- 1 osdba osdba 16777216 Jun 17 22:12 0000000100000000000000B8
-rw------- 1 osdba osdba 16777216 Jun 17 22:12 0000000100000000000000B9
-rw------- 1 osdba osdba 16777216 Jun 17 22:12 0000000100000000000000BA
-rw------- 1 osdba osdba 16777216 Jun 17 22:12 0000000100000000000000BB
-rw------- 1 osdba osdba 16777216 Jun 17 22:13 0000000100000000000000BC
-rw------- 1 osdba osdba 16777216 Jul 23 19:01 0000000100000000000000BD
drwx------ 2 osdba osdba 68 Mar 9 2015 archive_status
文件名称为16进制的24个字符组成,每8个字符一组,每组的意义如下:
00000001 00000000 000000BC
-------- -------- --------
时间线 LogId LogSeg
- 时间线:英文为timeline,是以1开始的递增数字,如1,2,3...
- LogId:32bit长的一个数字,是以0开始递增的数字,如0,1,2,3...
- LogSeg:32bit长的一个数字,是以0开始递增的数字,如0,1,2,3...
然而需要注意的是,数据库刚建好时,LogSeg第一次是从1开始的数字,到达一个最大的数字后,会重头开始,但以后再从头开始时,不再从1开始,而是从0开始。为什么这样呢?下面我们会讲解到这个问题。
WAL日志的位置是一个无限长的位置,数据库一建立后,不断的开始写WAL日志,此位置就不断的增加,即使数据库重启后,此位置也不会重新开始,只会一直增加,所以这个位置值显然如果用32bit的一个数字是不够的,32bit最多表示4GB的日志,所以大家很容易可以想到用一个64bit的数字来表示这个WAL日志的位置,这当然就足够了(因为要写4G*4G的数据才会用完64bit的长度)。
这个WAL日志的位置称之为LSN,即Log Sequence Number。
看起来,LogId+LogSeg好象刚好组成一个64bit的LSN,是否是LogId是这个64bit的LSN中的高32bit字节,而LogSeg就是低32bit的字节呢?LogId确实是LSN的高32字节,但LogSeg却不是低32bit的字节,另我们可以观察到LogSeg的值是从00000000到000000FF后,就重新从00000000开始了,并不会出现00000100这样的数值,也就是LogSeg的8个字符中,前6个字符始终是0,这是为什么?
原来LogSeg是按文件递增,每增加一个文件,LogSeg就增加1,而每个WAL文件的大小是16M,LogSeg是LSN的低32bit的字节的值再除以16M的结果,这样4G/16M结果是256,所以LogSeg最大的值为256,即16进制的0xFF,这样就解释了LogSeg的前6字节都是零的原因。
另原本LSN起始位置可以从0开始,但为了表示一些无效的位置,LSN的起始值并不是从0开始,也不是从1开始,而是跳过了一个WAL文件大小,即16M的位置开始,这样第一次时LogSeg是从1开始的,而不是从0开始了。
我们知道了WAL日志文件名中的意义,但很多时候我们会发现在PostgreSQL中会用两个十六进制的数字中间用斜杠“/”分隔表示WAL日志位置,即表示LSN,如函数pg_current_xlog_location、pg_current_xlog_insert_locatione及pg_start_backup的返回结果,如下所示:
postgres=# select pg_current_xlog_location(), pg_current_xlog_insert_location();
pg_current_xlog_location | pg_current_xlog_insert_location
--------------------------+---------------------------------
0/12B00B48 | 0/12B00B48
(1 row)
postgres=# select pg_start_backup('osdba_backup201510082130');
pg_start_backup
-----------------
0/14000100
(1 row)
同时我们在主库上通过查询视图pg_stat_replication来看replication的状态时,一些字段也显示成这样的格式:
postgres=# select sent_location, write_location, flush_location, replay_location, sync_state from pg_stat_replication;
sent_location | write_location | flush_location | replay_location | sync_state
---------------+----------------+----------------+-----------------+------------
0/1177A9F0 | 0/1177A9F0 | 0/1177A320 | 0/11779818 | async
(1 row)
以上这些表示WAL日志位置的方法,就是用两个32bit的数字来表示LSN,前一个数字LSN的高32bit,而另一个数字则是LSN的低32bit。在PostgreSQL9.4之后,增加了一个专门的类型pg_lsn用于表示WAL日志的位置,在PostgreSQL9.4之前,则用字符串来表示这个位置。
象上面的例子中,函数pg_current_xlog_location返回0/12B00B48,如果当前timeline为1,那么当前的WAL日志文件名是什么呢?
- logId就是“0/12B00B48”中的第一个数字,即0
- logSeg就是“0/12B00B48”中的第二个数字除以16M的大小,即12B00B48除以16M,而16M相当于2的24次方,相当于十六进制数“12B00B48”右移6位,即“12B00B48”中的最高两位“12”
- 那么根据WAL文件的格式timeline+logId+logSeg,则相当于:“00000001”+“00000000”+“00000012”,即为:“000000010000000000000012”
- 写的位置是在文件“000000010000000000000012”中的偏移量是多少呢?实际上是在“0/12B00B48”中第二个数字“12B00B48”后六位“B00B48”,换算成十进制为“11537224”。
当然PostgreSQL已准备了函数pg_xlogfile_name_offset帮我们做以上的转换,如下所示:
postgres=# select pg_xlogfile_name_offset('0/12B00B48');
pg_xlogfile_name_offset
-------------------------------------
(000000010000000000000012,11537224)
(1 row)
WAL日志文件名称格式详解的更多相关文章
- Java字节码(.class文件)格式详解(一)
原文链接:http://www.blogjava.net/DLevin/archive/2011/09/05/358033.html 小介:去年在读<深入解析JVM>的时候写的,记得当时还 ...
- Linux日志文件/var/log详解
更多内容推荐微信公众号,欢迎关注: 如果愿意在Linux环境方面花费些时间,首先就应该知道日志文件的所在位置以及它们包含的内容.在系统运行正常的情况下学习了解这些不同的日志文件有助于你在遇到紧急情况时 ...
- 痞子衡嵌入式:PCM编码与Waveform音频文件(.wav)格式详解
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是PCM编码及Waveform音频文件格式. 嵌入式里有时候也会和音频打交道,比如最近特别火的智能音箱产品,离不开前端的音频信号采集.降噪 ...
- binlog之四:mysql中binlog_format模式与配置详解,binlog的日志格式详解
mysql复制主要有三种方式:基于SQL语句的复制(statement-based replication, SBR),基于行的复制(row-based replication, RBR),混合模式复 ...
- Linux 常见压缩格式详解
linux 文件压缩格式详解 压缩文件原理 在计算机科学和信息论中,数据压缩或者源编码是按照特定的编码机制用比未经编码少的数据比特(或者其它信息相关的单位)表示信息的过程.例如,如果我们将" ...
- java分享第十五天(log4j 格式详解)
log4j 格式详解 log4j.rootLogger=日志级别,appender1, appender2, -. 日志级别:ALL<DEBUG<INFO<WARN<ERRO ...
- PNG,JPEG,BMP,JIF图片格式详解及其对比
原文地址:http://blog.csdn.net/u012611878/article/details/52215985 图片格式详解 不知道大家有没有注意过网页里,手机里,平板里的图片,事实上,图 ...
- Mybatis中接口和对应的mapper文件位置配置详解
Mybatis中接口和对应的mapper文件位置配置详解 原链接为:https://blog.csdn.net/fanfanzk1314/article/details/71480954 今天遇到一个 ...
- JPEG文件编/解码详解
JPEG文件编/解码详解(1) JPEG(Joint Photographic Experts Group)是联合图像专家小组的英文缩写.它由国际电话与电报咨询委员会CCITT(The Interna ...
随机推荐
- NUnit TestFixtureSetup 和 TestFixtureTearDown
TestFixtureSetup 和 TestFixtureTearDown 在所有测试开始前(TestFixtureSetup)或结束后(TestFixtureTearDown)运行一 次.记住他只 ...
- selet2使用大全
selet2是一款input+selet结合的组件,是最好的搜索下拉框,没有之一.原因是别的没有,只有它这么一家,你没得选择.正如有人说它‘Select2不是特别好用,但又找不到比它更好的下拉框插件. ...
- JAVA发送HttpClient
http://bijian1013.iteye.com/blog/2310211 在发送HTTP请求的时候会使用到POST和GET两种方式,如果是传送普通的表单数据,我们直接将参数到一个Key-val ...
- Linux安全策略配置-pam_tally2身份验证模块
PAM身份验证安全配置实例 - 强制使用强密码(用户密码安全配置) - 用户SSH登录失败尝试次数超出限制后锁定账户(帐户锁定/解锁和时间设置) - 允许普通用户使用sudo而不是su(限制普通用户登 ...
- Mybatis中trim的使用
trim标记是一个格式化的标记,可以完成set或者是where标记的功能,如下代码: 1. select * from user <trim prefix="WHERE" p ...
- Python3.x:pyodbc调用sybase的存储过程
Python3.x:pyodbc调用sybase的存储过程 示例代码 # python3 # author lizm # datetime 2018-03-02 17:00:00 # -*- codi ...
- Nginx 启动脚本
Nginx 启动脚本 1.vim /etc/init.d/nginx #!/bin/bash # chkconfig: - 30 21 # description: http service. # S ...
- SQL-ALTER-change和modify区别
ALTER 对于列的应用: 1.更改列名 格式:CHANGE old_col_name new_col_name column_definition 保留old和new列名 ...
- Mybatis常见问题
1.#和$的区别和联系 1.1#是占位符,会对Sql进行预编译,相当于?:$是做Sql拼接,有sql注入的隐患 1.2#不需要关注数据类型,Mybatis自动实现类型转换,$必须自己判断数据类型联系 ...
- share point 2013 部署
最近工作需要,需要用share point 2013 开发项目,但是遇到了刚部署环境就遇到了不少问题.唉~ 本机部署搭建一个share point 2013 环境. 第一步:首先要下载一个vmware ...