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 ...
随机推荐
- CoreThink开发(十)把官方首页轮播替换成HTML5-3D轮播
效果: 资源已经上传到我的下载里边. http://download.csdn.net/detail/u012995856/9587206 1.复制资源文件到CoreThink项目中 corethin ...
- linux环境配置时钟同步ntpd服务
配置: 服务器1:192.168.169.139 服务器2:192.168.169.140 服务器3:192.168.169.141 目的:NTP能与互联网的时间保持同步,而且本身也是一台NTP服务器 ...
- 一个很牛的计算pi的c程序!
C语言是面向过程的一种高级程序设计语言,它在世界范围内使用很广泛,而且很流行.很多大型的应用软件,基本上是用C语言所编写的.在对操作系统以及系统使用程序.需要对硬件进行操作的场合,C语言较其他的高级语 ...
- bind方法代替闭包
<a href="JavaScript:">a</a> <a href="JavaScript:">b</a> ...
- python的正则表达式捕获组命名问题
- mac下Appium环境配置
一.Appium环境搭建 1.xcode(需要OS X版本支持): 下载对应版本的xcode(支持对应手机系统),解压,拖入应用程序. xcode下载地址:https://developer.appl ...
- 2 Powershell与Cmd以及Unix/Linux Shell
上篇文章我说道,windows为了改变用户对其console界面的诟病,于是就从windows vista开始,计划要改变这种局面,于是就有 了Powershell的出现. 1.兼容shell命令 ...
- Spring中Bean管理的常用注解
在Spring中,主要用于管理bean的注解分为四大类:1.用于创建对象.2.用于给对象的属性注入值.3.用于改变作用的范围.4.用于定义生命周期.这几个在开发中经常接触到,也可以说每天都会遇见.其中 ...
- C++ Primer 第二章 学习笔记
在auto一个引用时,auto会忽略顶层const,而保存底层const decltype(sum()) x = i; // I的类型就是sum()返回值的类型
- 技巧.【转】在虚拟机Vmware中使用HID设备(如USB免驱键盘)
ZC:我的环境:Win7x64.VMware10 ZC:我的处理: ZC: (1).usb.generic.allowHID = "TRUE" (本来就有,将它的位置提前) ZC: ...