PostgreSQL LSN即Log sequence number,日志序列号,这是WAL日志唯一的、全局的标识。

那么pg中LSN究竟有什么作用呢?我们都知道wal日志中写入是有顺序的,比方说一条记录是先加100再乘200,如果顺序错乱变成先乘200再加100,那结果可是差之千里了,所以必须得记录wal日志的写入顺序。

而LSN就是负责这个的,给每条产生的wal日志记录一个编号。熟悉Oracle的朋友可能清楚,这和Oracle中redo的LRBA和HRBA有点类似。

LSN和WAL:

我们先来看下LSN是啥样的:

bill@bill=>select pg_current_wal_lsn();pg_current_wal_lsn
--------------------1/133E80B8
(1 row)

既然LSN是wal日志的序列号,那么它和wal日志有什么关系呢?

wal日志LSN编号规则:
1/920001F8(高32位/低32位)

wal日志文件命名规则:
我们看到的wal日志是这样的:000000010000000100000092

  • 其中前8位:00000001表示timeline;
  • 中间8位:00000001表示logid;
  • 最后8位:00000092表示logseg

对照关系:

  • wal日志的logseg前6位始终是0,后两位是LSN低32位/16MB(2*24),即LSN的前两位。如上例中logseg最后两位是92,LSN低32前两位也是92。
  • LSN在wal日志中的偏移量即LSN低32位中后24位对应的十进制值。

例如当前wal日志偏移量为504

bill=# select pg_walfile_NAME_OFFSET(pg_current_wal_lsn());pg_walfile_name_offset
--------------------------------(000000010000000100000092,504)
(1 row)bill=# select x'1F8'::int;int4
------504
(1 row)

LSN常用脚本:

我们可以使用下面的一些脚本查看LSN相关的信息。

查看当前wal日志中LSN:

select pg_current_wal_lsn();

查看当前LSN对应的wal日志文件:

select pg_walfile_name(pg_current_wal_lsn());

查看wal日志文件名和偏移量:

select pg_walfile_name_offset(pg_current_wal_lsn());

查看表page中的LSN(需要安装pageinspect扩展):

SELECT lsn FROM page_header(get_raw_page('t1', 0));

LSN与数据恢复:

当数据库出现故障需要进行数据恢复时,首先从检查点开始,回放WAL日志,如果数据页面的LSN小于WAL记录的LSN,则说明数据页面比较旧,需要进行回放,反之则不需要回放,就会跳过回放过程。
从检查点开始,回放WAL日志,如果数据页面的LSN小于WAL记录的LSN,则说明数据页面比较旧,需要进行回放,反之则不需要回放,就会跳过回放过程。

参考链接:

http://www.postgres.cn/docs/12/wal-internals.html
https://blog.csdn.net/weixin_39540651/article/details/106122610

PostgreSQL LSN详解相关推荐

  1. Postgresql 配置文件详解

    如果要查看配置文件中的一些选项,则可以登录psql后 使用 命令来查看: show  选项名; show all:  #查看所有数据库参数的值 主要选项: 选项 默认值 说明 是否优化 原因 max_ ...

  2. PostgreSQL clog详解

    PostgreSQL由于其多版本特性,因此需要提交日志clog来记录事务的状态,从而判断其可见性.clog分配于共享内存中,并作用于事务处理过程的全过程. 在pg中定义了4种事务状态,分别是:IN_P ...

  3. PostgreSQL索引详解5——Gist索引

    1.概述 Gist(Generalized Search Tree),即通用搜索树.和btree一样,也是平衡的搜索树. 和btree不同的是,btree索引常常用来进行例如大于.小于.等于这些操作中 ...

  4. PostgreSQL分区表(partitioning)应用实例详解

    https://www.jb51.net/article/97937.htm PostgreSQL分区表(partitioning)应用实例详解 更新时间:2016年11月22日 10:25:58   ...

  5. Postgresql -XL 10r.1.1安装部署详解(跳过N多坑)

    Postgresql -XL 10r.1.1安装部署详解(跳过N多坑) 目前安装postgre10r1.1的文档较少,本人目前是在三台虚拟机上搭建的postgre xl 10r1.1集群,之后将pos ...

  6. SQL全方位攻略:5. SQL “方言”大比拼:Oracle、MySQL、PostgreSQL限制检索行数语法详解(分页查询)

    系列文章目录 SQL全方位攻略:1.数据库介绍 SQL全方位攻略:2.SQL介绍 SQL全方位攻略:3.SQL标准 SQL全方位攻略:4. 标准SQL和SQL"方言" 文章目录 系 ...

  7. 详解mysql备份恢复的三种实现方式

    一.Mysql备份策略: 完整备份: 完整备份就是指对某一个时间点上的所有数据或应用进行的一个完整拷贝,对数据量大的,备份时间较长,当然数据在恢复的时候快. 增量备份: 备份自上一次备份(包括完整备份 ...

  8. Nmap扫描教程之基础扫描详解

    Nmap扫描教程之基础扫描详解 Nmap扫描基础扫描 当用户对Nmap工具了解后,即可使用该工具实施扫描.通过上一章的介绍,用户可知Nmap工具可以分别对主机.端口.版本.操作系统等实施扫描.但是,在 ...

  9. JetBrains DataGrip工具配置数据库过程详解

    JetBrains DataGrip工具配置数据库过程详解 DataGrip是一款数据库管理客户端工具,方便连接到数据库服务器,执行sql.创建表.创建索引以及导出数据等. DataGrip 是 Je ...

最新文章

  1. linux系统下redhat7之虚拟机控制
  2. js判断一个对象是否为空
  3. SAP CRM my task 6个roundtrip的原理讲解
  4. 初次就这么给了你(Django-rest-framework)
  5. 为什么我放弃饿了么产品总监,却要从事自由职业?
  6. vs 编译错误 The name 'InitializeComponent' does not exist in the current context in WPF application...
  7. [转]ListView滚动到底部自动加载数据
  8. QBoxLayout中setSpacing(int)和addSpacing(int)的区别
  9. Python让你成为AI 绘画大师,简直太惊艳了!(附代码)
  10. 计算机组成原理—DRAM的刷新
  11. 封装一个操作文件的函数
  12. 微积分(二)——曲线积分与曲面积分笔记
  13. 实验设计的道德伦理考量
  14. java程序员生日祝福语_给程序员的一句话祝福语
  15. 魔戒三曲,黑暗散去;人皇加冕,光明归来
  16. android手机存储空间猛增,实测安卓升级到鸿蒙,可用内存增加半个G,存储空间增加6个G...
  17. 产品分析————拼多多
  18. 直播预告 | ICLR专场一
  19. 软件智能:aaas系统AI众生的“世”和“界” 之21 整定问题空间和标定解决方案空间之1
  20. excel表格中隔行自动换颜色?

热门文章

  1. 诗友---名人名言排行榜
  2. 【学习笔记】简易的24位BMP图片转换成灰度图片
  3. 串口c语言 讲觯,用Powerpoint制作C语言动画课件.pdf
  4. 对计算机认识的英语作文,关于电脑的英语作文 Computer
  5. 飞沃科技IPO过会:年营收11.3亿 湖南文旅与沅澧投资是股东
  6. java根据IP获取当前区域天气信息
  7. 【PyAutoGUI操作指南】05 屏幕截图与图像定位:截图+定位单个目标+定位全部目标+灰度匹配+像素匹配+获取屏幕截图中像素的RGB颜色
  8. Python爬虫入门系列——Urllib详解
  9. Unity 禁用动画位移
  10. 基于物联网云平台的离心泵工况诊断系统