lsn和redo

瀚高数据库
目录
文档用途
详细信息
相关文档

记录lsn三种记录形式,以及redo对lsn的操作。

详细信息

一、lsn的三种形式

1. pg_controldata中可以看到这样的lsn表示:

Latest checkpoint location: 0/1548018Latest
checkpoint’s REDO location: 0/1547FC8
Latest checkpoint’s REDO WAL file: 000000010000000000000001

2.pg中的一些控制函数也可以看到类似的表示:

psql (16.1)                                                                                                                                                              

Type "help" for help.                                                                                                                                                    

                                                                                                                                                                         

postgres=# select pg_current_wal_lsn();                                                                                                                                  

 pg_current_wal_lsn                                                                                                                                                      

--------------------                                                                                                                                                     

 0/15480C8                                                                                                                                                               

(1 row)                                                                                                                                                                  

                                                                                                         

[postgres@node1 pg_wal]$ pg_controldata | grep REDO

Latest checkpoint's REDO location:    0/15482D8

Latest checkpoint's REDO WAL file:    000000010000000000000001

                                                               

postgres=# select pg_walfile_name('0/15480C8');                                                                                                                          

     pg_walfile_name                                                                                                                                                     

--------------------------                                                                                                                                               

 000000010000000000000001                                                                                                                                                

(1 row)  

3. pg中的xlog文件命名看起来是另一种形式:

-rw-------. 1 postgres postgres 16777216 Jan 5 10:11 000000010000000000000001

二、解析文件名含义

一、文件名含义

000000010000000000000001
00000001    00000000    00000001

timeline          logid            segid

二、控制函数查出来的’A/B’形式的lsn含义

 0/15480C8

            0             1          5480C8

            logid       segid       offset

三、pg内部变量含义:就是lsn不带’/’

(gdb) p RedoRecPtr

$6 = 22315736

(gdb) p/x RedoRecPtr

$7 = 0x15482d8



            0          1          5482d8

            logid       segid       offset

后两种是等价的。

xlog文件名是把lsn最后6个16进制省略了,也就是一个16MB的文件中可以保存省略的偏移量offset。

offset范围:0x000000 - 0xFFFFFF = 16MB 所以16MB的文件的每个字节都可以通过offset索引到。

如要调试,可参考pg16恢复过程的调用栈:

(gdb) bt

#0  ReadCheckpointRecord (xlogprefetcher=0xf7dde8, RecPtr=22315736, replayTLI=1) at xlogrecovery.c:3971

#1  0x0000000000599c6f in InitWalRecovery (ControlFile=0x7fffe41d4980, wasShutdown_ptr=0x7fffffffde2f, haveBackupLabel_ptr=0x7fffffffde2d, 

    haveTblspcMap_ptr=0x7fffffffde2e) at xlogrecovery.c:769

#2  0x0000000000589710 in StartupXLOG () at xlog.c:5171

#3  0x00000000009073af in StartupProcessMain () at startup.c:282

#4  0x00000000008fbd49 in AuxiliaryProcessMain (auxtype=StartupProcess) at auxprocess.c:141

#5  0x00000000009061d7 in StartChildProcess (type=StartupProcess) at postmaster.c:5372

#6  0x0000000000901959 in PostmasterMain (argc=1, argv=0xf7bf20) at postmaster.c:1458

#7  0x00000000007cb6d1 in main (argc=1, argv=0xf7bf20) at main.c:198

三、Redo point变更

使用pg_controldata查看当前ControlFile内容:

[postgres@node1 pg_wal]$ pg_controldata | grep REDO

Latest checkpoint's REDO location:    0/15482D8

Latest checkpoint's REDO WAL file:    000000010000000000000001

插入几条测试数据:

psql (16.1)

Type "help" for help.



postgres=# insert into test values(1);

INSERT 0 1

postgres=# insert into test values(2);

INSERT 0 1

postgres=# insert into test values(3);

INSERT 0 1

postgres=# 

使用pg_waldump查看wal文件:

......

......

rmgr: Standby     len (rec/tot):     50/    50, tx:          0, lsn: 0/0156AC60, prev 0/0156A9D8, desc: RUNNING_XACTS nextXid 735 latestCompletedXid 734 oldestRunningXid 735

rmgr: Heap        len (rec/tot):     59/    59, tx:        735, lsn: 0/0156AC98, prev 0/0156AC60, desc: INSERT+INIT off: 1, flags: 0x00, blkref #0: rel 1663/5/16387 blk 0

rmgr: Btree       len (rec/tot):     90/    90, tx:        735, lsn: 0/0156ACD8, prev 0/0156AC98, desc: NEWROOT level: 0, blkref #0: rel 1663/5/16390 blk 1, blkref #2: rel 1663/5/16390 blk 0

rmgr: Btree       len (rec/tot):     64/    64, tx:        735, lsn: 0/0156AD38, prev 0/0156ACD8, desc: INSERT_LEAF off: 1, blkref #0: rel 1663/5/16390 blk 1

rmgr: Transaction len (rec/tot):     34/    34, tx:        735, lsn: 0/0156AD78, prev 0/0156AD38, desc: COMMIT 2024-01-05 17:31:07.213249 CST

rmgr: Standby     len (rec/tot):     50/    50, tx:          0, lsn: 0/0156ADA0, prev 0/0156AD78, desc: RUNNING_XACTS nextXid 736 latestCompletedXid 735 oldestRunningXid 736

rmgr: Heap        len (rec/tot):     59/    59, tx:        736, lsn: 0/0156ADD8, prev 0/0156ADA0, desc: INSERT off: 2, flags: 0x00, blkref #0: rel 1663/5/16387 blk 0

rmgr: Btree       len (rec/tot):     64/    64, tx:        736, lsn: 0/0156AE18, prev 0/0156ADD8, desc: INSERT_LEAF off: 2, blkref #0: rel 1663/5/16390 blk 1

rmgr: Transaction len (rec/tot):     34/    34, tx:        736, lsn: 0/0156AE58, prev 0/0156AE18, desc: COMMIT 2024-01-05 17:31:16.074250 CST

rmgr: Heap        len (rec/tot):     59/    59, tx:        737, lsn: 0/0156AE80, prev 0/0156AE58, desc: INSERT off: 3, flags: 0x00, blkref #0: rel 1663/5/16387 blk 0

rmgr: Btree       len (rec/tot):     64/    64, tx:        737, lsn: 0/0156AEC0, prev 0/0156AE80, desc: INSERT_LEAF off: 3, blkref #0: rel 1663/5/16390 blk 1

rmgr: Transaction len (rec/tot):     34/    34, tx:        737, lsn: 0/0156AF00, prev 0/0156AEC0, desc: COMMIT 2024-01-05 17:31:22.578713 CST

rmgr: Standby     len (rec/tot):     50/    50, tx:          0, lsn: 0/0156AF28, prev 0/0156AF00, desc: RUNNING_XACTS nextXid 738 latestCompletedXid 737 oldestRunningXid 738

pg_waldump: error: error in WAL record at 0/156AF28: invalid record length at 0/156AF60: expected at least 24, got 0

最后一个XLOG Record记录的位置为0/0156AF28,加上记录大小50(十六进制为0x32),位置为0/0156AF5A,按理论上来说,如果现在执行checkpoint,该位置为REDO point.

执行checkpoint:

postgres=# checkpoint ;

2024-01-05 17:41:28.687 CST [9080] LOG:  checkpoint starting: immediate force wait

2024-01-05 17:41:28.710 CST [9080] LOG:  checkpoint complete: wrote 40 buffers (0.2%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.007 s, sync=0.004 s, total=0.024 s; sync files=33, longest=0.003 s, average=0.001 s; distance=139 kB, estimate=139 kB; lsn=0/156AF98, redo lsn=0/156AF60

CHECKPOINT

postgres=# 

pg_controldata查看:

[postgres@node1 pg_wal]$ pg_controldata|grep 'REDO location'
Latest checkpoint's REDO location:    0/156AF60

再次查看XLOG Record记录:

......
rmgr: Btree       len (rec/tot):     64/    64, tx:        735, lsn: 0/0156AD38, prev 0/0156ACD8, desc: INSERT_LEAF off: 1, blkref #0: rel 1663/5/16390 blk 1

rmgr: Transaction len (rec/tot):     34/    34, tx:        735, lsn: 0/0156AD78, prev 0/0156AD38, desc: COMMIT 2024-01-05 17:31:07.213249 CST

rmgr: Standby     len (rec/tot):     50/    50, tx:          0, lsn: 0/0156ADA0, prev 0/0156AD78, desc: RUNNING_XACTS nextXid 736 latestCompletedXid 735 oldestRunningXid 736

rmgr: Heap        len (rec/tot):     59/    59, tx:        736, lsn: 0/0156ADD8, prev 0/0156ADA0, desc: INSERT off: 2, flags: 0x00, blkref #0: rel 1663/5/16387 blk 0

rmgr: Btree       len (rec/tot):     64/    64, tx:        736, lsn: 0/0156AE18, prev 0/0156ADD8, desc: INSERT_LEAF off: 2, blkref #0: rel 1663/5/16390 blk 1

rmgr: Transaction len (rec/tot):     34/    34, tx:        736, lsn: 0/0156AE58, prev 0/0156AE18, desc: COMMIT 2024-01-05 17:31:16.074250 CST

rmgr: Heap        len (rec/tot):     59/    59, tx:        737, lsn: 0/0156AE80, prev 0/0156AE58, desc: INSERT off: 3, flags: 0x00, blkref #0: rel 1663/5/16387 blk 0

rmgr: Btree       len (rec/tot):     64/    64, tx:        737, lsn: 0/0156AEC0, prev 0/0156AE80, desc: INSERT_LEAF off: 3, blkref #0: rel 1663/5/16390 blk 1

rmgr: Transaction len (rec/tot):     34/    34, tx:        737, lsn: 0/0156AF00, prev 0/0156AEC0, desc: COMMIT 2024-01-05 17:31:22.578713 CST

rmgr: Standby     len (rec/tot):     50/    50, tx:          0, lsn: 0/0156AF28, prev 0/0156AF00, desc: RUNNING_XACTS nextXid 738 latestCompletedXid 737 oldestRunningXid 738

rmgr: Standby     len (rec/tot):     50/    50, tx:          0, lsn: 0/0156AF60, prev 0/0156AF28, desc: RUNNING_XACTS nextXid 738 latestCompletedXid 737 oldestRunningXid 738

rmgr: XLOG        len (rec/tot):    114/   114, tx:          0, lsn: 0/0156AF98, prev 0/0156AF60, desc: CHECKPOINT_ONLINE redo 0/156AF60; tli 1; prev tli 1; fpw true; xid 0:738; oid 24579; multi 1; offset 0; oldest xid 722 in DB 1; oldest multi 1 in DB 1; oldest/newest commit timestamp xid: 0/0; oldest running xid 738; online

可以看到0/0156AF60是最后一条checkpoint记录的起始写入位置,REDO point为0/0156AF60,比预想的要多出6个字节(0/0156AF60-0/0156AF5A = 6)。

[postgres@node1 pg_wal]$ echo "obase=10;ibase=16;56AF28"|bc

5680936

[postgres@node1 pg_wal]$ hexdump -C 000000010000000000000001 -s 5680936 -n 50

0056af28  32 00 00 00 00 00 00 00  00 af 56 01 00 00 00 00  |2.........V.....|

0056af38  10 08 00 00 09 be d0 ba  ff 18 00 00 00 00 00 00  |................|

0056af48  00 00 00 e3 bd 2d e2 02  00 00 e2 02 00 00 e1 02  |.....-..........|

0056af58  00 00                                             |..|

0056af5a

[postgres@node1 pg_wal]$ 

XLOG Record的头部首先是XLogRecord结构体,第一个域是uint32的record的大小,即0x00000032,十进制为50,跟pg_waldump打印出的一样。

[postgres@node1 pg_wal]$ hexdump -C 000000010000000000000001 -s 5680986 -n 6

0056af5a  00 00 00 00 00 00                                 |......|

0056af60

[postgres@node1 pg_wal]$ 

后续的6个字节均为0x00

[postgres@node1 pg_wal]$ hexdump -C 000000010000000000000001 -s 5681048 -n 114

0056af98  72 00 00 00 00 00 00 00  60 af 56 01 00 00 00 00  |r.......`.V.....|

0056afa8  10 00 00 00 e0 5a e5 07  ff 58 60 af 56 01 00 00  |.....Z...X`.V...|

0056afb8  00 00 01 00 00 00 01 00  00 00 01 00 00 00 00 00  |................|

0056afc8  00 00 e2 02 00 00 00 00  00 00 03 60 00 00 01 00  |...........`....|

0056afd8  00 00 00 00 00 00 d2 02  00 00 01 00 00 00 01 00  |................|

0056afe8  00 00 01 00 00 00 00 00  00 00 c8 ce 97 65 00 00  |.............e..|

0056aff8  00 00 00 00 00 00 00 00  00 00 e2 02 00 00 00 00  |................|

0056b008  00 00                                             |..|

0056b00

image.png

上述图有点老了,pg16CheckPoint是88B,图片来源:https://www.interdb.jp/pg/pgsql09/04.html

大小为0x00000072,即114B(头部XLogRecord 24B + XLogRecordDataHeaderShort 2B + Checkpoint 88B )。从FF 58为XLogRecordDataHeaderShort结构体的内容,0xFF为标志位,0x58为Data的大小(即88B).

checkpoint记录的内容详见Checkpoint结构体,该结构体第一个域字段为8个字节的LSN–>0x00000000 0156AF60,即REDO point:0/0156AF60.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/473959.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

智慧公园:AI智能分析网关V4城市公园视频智能监管方案

一、背景分析 随着天气渐渐转暖,城市公园的花卉也逐渐盛开,春暖花开时节,前往公园赏花游玩的城市居民也渐渐多起来,因此安全问题也成为相关监管部门的重要管理任务之一。随着科技的不断进步,智能监控技术已经成为现代…

Python将字符串转换为datetime

有这样一些字符串: 1710903685 20240320110125 2024-03-20 11:01:25 要转换成Python的datetime 代码如下: import functools import re from datetime import datetime, timedelta from typing import Union# pip install python-dateutil from date…

关于Rust的项目结构的笔记

层级 PackageCrateModulePath Package cargo的特性, 构建、测试、共享Crate 组成: 一个 Cargo.toml 文件, 描述了如何构建这些 Crates至少包含一个 crate最多只能包含一个 library crate可以包含任意个 binary crate cargo new demo-pro 会产生一个名为 demo-pro 的 Packa…

Python 深度学习第二版(GPT 重译)(一)

前言 序言 如果你拿起这本书,你可能已经意识到深度学习在最近对人工智能领域所代表的非凡进步。我们从几乎无法使用的计算机视觉和自然语言处理发展到了在你每天使用的产品中大规模部署的高性能系统。这一突然进步的后果几乎影响到了每一个行业。我们已经将深度学…

MATLAB三维图形的绘制

1,三维曲线 plot3(x,y,z)通过描点连线画出曲图,这里x,y,z都是n维向量,分别表示该曲线上点集的横坐标,纵坐标,竖坐标。 t0:pi/50:10*pi; subplot(121),plot3(sin(t),cos(t),t); subplot(122),fplot3((t)sin(t),(t)cos…

Linux集群

前言: 环境准备:虚拟机,xshell,mysql,tomcat,jdk,centos 虚拟机安装centos可以参考博客:虚拟机安装centos 一,安装jdk 打开xshell 点击cftp,如果没有安装…

HarmonyOS(鸿蒙)应用开发——(一)

目录 1 创建hellopro项目 2 了解ArkTS 3 了解ArkTS的组件 4 组件介绍 4.1 常用基础组件: 4.1.1 Text 4.1.2 Button 4.1.3 TextInput 4.2 容器组件 4.2.1 Column 4.2.2 Row 5 案例——实现一个简易登录页面 5.1 在实现预览效果之前,我们…

记录开发STM32遇到的卡死问题-串口

背景:以STM32作为主控,广州大彩显示屏显示,主控实时采集数据,串口波特率115200.设置收发频率为50Hz,即单片机每秒发送50帧数据,每秒接收50帧数据,每帧数据大概14字节。 问题:系统长…

Cronos zkEVM 基于 Covalent Network(CQT)数据可用性 API,推动其 Layer2 DeFi 生态更好地发展

在一项旨在显著改善 DeFi 生态的战略举措中,Cronos 与 Covalent Network(CQT)携手合作,以期待 Cronos zkEVM 的推出。这一整合,预计将进一步降低以太坊生态系统的交易成本、提升交易速度,并带来更好的交易体…

ZnO非线性电阻片功率损耗的频率特性

对不同频率正弦交流电压作用下直流氧化锌阀片的功率损耗进行了测量。图3.16(a)和(b)分别为试品类型A和试品类型B两种直流ZnO阀片在不同频率电压作用下的功率损耗随荷电率变化的特性。两种阀片的功率损耗都随频率和荷电率的增加而增加。当频率达到1kHz或以上时,阀片的功率损耗增…

SQLiteC/C++接口详细介绍sqlite3_stmt类(二)

返回目录:SQLite—免费开源数据库系列文章目录 上一篇:SQLiteC/C接口详细介绍sqlite3_stmt类简介 下一篇:SQLiteC/C接口详细介绍sqlite3_stmt类(三) sqlite3_reset() 功能:重置一个准备好执行的SQL语…

IDEA之This license XXXX has been suspended

IDEA激活码突然报如下错误: This license XXXXX has been suspended. Please contact your license administrator 解决方案: IDEA版本2022.2.3,亲测管用

【机器学习智能硬件开发全解】(十一)—— 政安晨:通过ARM-Linux掌握基本技能【C语言程序的链接过程】

政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: 机器学习智能硬件开发全解 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 前言 我们回顾一下上篇文章: 【机器学习…

软件企业在咨询第三方软件测试机构报价时,应提前准备什么资料?

近年来,随着软件行业的迅速发展,软件企业对于软件质量的重视程度日益增加。为了确保软件产品的质量以及用户的满意度,越来越多的企业倾向于委托第三方软件测试机构进行测试工作。在咨询第三方软件测试机构报价之前,软件企业需要提…

SQLiteC/C++接口详细介绍sqlite3_stmt类(四)

返回:SQLite—系列文章目录 上一篇:SQLiteC/C接口详细介绍sqlite3_stmt类(三) 下一篇:SQLiteC/C接口详细介绍sqlite3_stmt类(五) 7. sqlite3_bind_parameter_count函数 sqlite3_bind_param…

风速预测(八)VMD-CNN-Transformer预测模型

往期精彩内容: 时序预测:LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较-CSDN博客 风速预测(一)数据集介绍和预处理-CSDN博客 风速预测(二)基于Pytorch的EMD-LSTM模型-CSDN博客 风速预测&#xff…

【实例】React 组件传值方法: Props、回调函数、Context、路由传参

React原始传值方法 借用状态管理库的传值见下篇文:MobX 和 Redux 【实例】React 状态管理库 MobX Redux 入门及对比 文章目录 React原始传值方法父组件->子组件 props子组件->父组件 回调函数Context路由传值 父组件->子组件 props 父组件可以通过属性&a…

sheng的学习笔记-AI-Inception network

目录:sheng的学习笔记-AI目录-CSDN博客 基础知识 构建卷积层时,你要决定过滤器的大小究竟是11(原来是13,猜测为口误),33还是55,或者要不要添加池化层。而Inception网络的作用就是代替你来决定&…

流畅的 Python 第二版(GPT 重译)(一)

前言 计划是这样的:当有人使用你不理解的特性时,直接开枪打死他们。这比学习新东西要容易得多,不久之后,活下来的程序员只会用一个容易理解的、微小的 Python 0.9.6 子集来编写代码 。 Tim Peters,传奇的核心开发者&am…

【数据结构】——线性表(顺序表加链表),万字解读(加链表oj详解)

前言 由于之前存在过对两者的区别考虑,所以把他们放在一起来说,更加容易区别和理解 对于有关线性表的概念这里就不展示了,这里主要是介绍线性表里面的这两个结构的知识点 一.顺序表 1.顺序表介绍 顺序表的存储结构和逻辑结构都是相邻的&a…