PostgreSQL的wal文件回收问题

引子

将PostgreSQL的GUC参数wal_recycle设置为on,然后对数据库执行一定业务量的操作,会发现在pg_wal目录下,有很多未来使用的wal文件,且创建时间比现在正在使用的wal文件更早,下文将描述和分析这种情况。

问题描述

问题1:为什么未来使用的wal文件,创建时间会更早?
  1. 使用pg_controldata程序,查看数据库控制文件,发现PostgreSQL数据库当前正使用的wal文件为00000001000000000000007A;
[coder@localhost build_postgres]$ ./bin/pg_controldata data_test/
pg_control version number:            1201
Catalog version number:               201909212
Database system identifier:           7331656414979148006
Database cluster state:               shut down
pg_control last modified:             2024年02月04日 星期日 16时38分49秒
Latest checkpoint location:           0/7A000028
Latest checkpoint's REDO location:    0/7A000028
Latest checkpoint's REDO WAL file:    00000001000000000000007A
Latest checkpoint's TimeLineID:       1
Latest checkpoint's PrevTimeLineID:   1
Latest checkpoint's full_page_writes: on
Latest checkpoint's NextXID:          0:497
Latest checkpoint's NextOID:          16396
Latest checkpoint's NextMultiXactId:  1
Latest checkpoint's NextMultiOffset:  0
Latest checkpoint's oldestXID:        479
Latest checkpoint's oldestXID's DB:   1
Latest checkpoint's oldestActiveXID:  0
Latest checkpoint's oldestMultiXid:   1
Latest checkpoint's oldestMulti's DB: 1
Latest checkpoint's oldestCommitTsXid:486
Latest checkpoint's newestCommitTsXid:496
Time of latest checkpoint:            2024年02月04日 星期日 16时38分49秒
Fake LSN counter for unlogged rels:   0/3E8
Minimum recovery ending location:     0/0
Min recovery ending loc's timeline:   0
Backup start location:                0/0
Backup end location:                  0/0
End-of-backup record required:        no
wal_level setting:                    logical
wal_log_hints setting:                off
max_connections setting:              100
max_worker_processes setting:         8
max_wal_senders setting:              10
max_prepared_xacts setting:           0
max_locks_per_xact setting:           64
track_commit_timestamp setting:       on
Maximum data alignment:               8
Database block size:                  8192
Blocks per segment of large relation: 131072
WAL block size:                       8192
Bytes per WAL segment:                16777216
Maximum length of identifiers:        64
Maximum columns in an index:          32
Maximum size of a TOAST chunk:        1996
Size of a large-object chunk:         2048
Date/time type storage:               64-bit integers
Float4 argument passing:              by value
Float8 argument passing:              by value
Data page checksum version:           0
Mock authentication nonce:            def3a46f189241ca0085fac72f98a6f359897b3104fdc4ae6b4ea9ff7423e724
[coder@localhost build_postgres]$
  1. 查看data/pg_wal目录,发现在wal文件00000001000000000000007A后面,预分配了一些未来使用的wal文件。00000001000000000000007A后面的wal文件,是PostgreSQL在执行ckpt时,预分配的wal文件。观察发现,00000001000000000000007B及其以后的wal文件的时间,反而比00000001000000000000007A的创建时间更早。
[coder@localhost build_postgres]$ ll data_test/pg_wal/
总用量 1048576
-rw-------. 1 coder coder 16777216 24 16:38 000000010000000000000079
-rw-------. 1 coder coder 16777216 24 16:38 00000001000000000000007A
-rw-------. 1 coder coder 16777216 24 16:25 00000001000000000000007B
-rw-------. 1 coder coder 16777216 24 16:25 00000001000000000000007C
-rw-------. 1 coder coder 16777216 24 16:25 00000001000000000000007D
-rw-------. 1 coder coder 16777216 24 16:25 00000001000000000000007E
-rw-------. 1 coder coder 16777216 24 16:25 00000001000000000000007F
-rw-------. 1 coder coder 16777216 24 16:25 000000010000000000000080
-rw-------. 1 coder coder 16777216 24 16:25 000000010000000000000081
-rw-------. 1 coder coder 16777216 24 16:25 000000010000000000000082
-rw-------. 1 coder coder 16777216 24 16:25 000000010000000000000083
-rw-------. 1 coder coder 16777216 24 16:25 000000010000000000000084
-rw-------. 1 coder coder 16777216 24 16:25 000000010000000000000085
-rw-------. 1 coder coder 16777216 24 16:25 000000010000000000000086
-rw-------. 1 coder coder 16777216 24 16:25 000000010000000000000087
-rw-------. 1 coder coder 16777216 24 16:25 000000010000000000000088
-rw-------. 1 coder coder 16777216 24 16:25 000000010000000000000089
-rw-------. 1 coder coder 16777216 24 16:25 00000001000000000000008A
-rw-------. 1 coder coder 16777216 24 16:24 00000001000000000000008B
-rw-------. 1 coder coder 16777216 24 16:25 00000001000000000000008C
-rw-------. 1 coder coder 16777216 24 16:25 00000001000000000000008D
-rw-------. 1 coder coder 16777216 24 16:25 00000001000000000000008E
-rw-------. 1 coder coder 16777216 24 16:25 00000001000000000000008F
-rw-------. 1 coder coder 16777216 24 16:25 000000010000000000000090
-rw-------. 1 coder coder 16777216 24 16:25 000000010000000000000091
-rw-------. 1 coder coder 16777216 24 16:25 000000010000000000000092
-rw-------. 1 coder coder 16777216 24 16:25 000000010000000000000093
-rw-------. 1 coder coder 16777216 24 16:25 000000010000000000000094
-rw-------. 1 coder coder 16777216 24 16:25 000000010000000000000095
-rw-------. 1 coder coder 16777216 24 16:25 000000010000000000000096
-rw-------. 1 coder coder 16777216 24 16:25 000000010000000000000097
-rw-------. 1 coder coder 16777216 24 16:25 000000010000000000000098
-rw-------. 1 coder coder 16777216 24 16:25 000000010000000000000099
-rw-------. 1 coder coder 16777216 24 16:25 00000001000000000000009A
-rw-------. 1 coder coder 16777216 24 16:26 00000001000000000000009B
-rw-------. 1 coder coder 16777216 24 16:26 00000001000000000000009C
-rw-------. 1 coder coder 16777216 24 16:26 00000001000000000000009D
-rw-------. 1 coder coder 16777216 24 16:26 00000001000000000000009E
-rw-------. 1 coder coder 16777216 24 16:26 00000001000000000000009F
-rw-------. 1 coder coder 16777216 24 16:26 0000000100000000000000A0
-rw-------. 1 coder coder 16777216 24 16:26 0000000100000000000000A1
-rw-------. 1 coder coder 16777216 24 16:26 0000000100000000000000A2
-rw-------. 1 coder coder 16777216 24 16:26 0000000100000000000000A3
-rw-------. 1 coder coder 16777216 24 16:26 0000000100000000000000A4
-rw-------. 1 coder coder 16777216 24 16:26 0000000100000000000000A5
-rw-------. 1 coder coder 16777216 24 16:26 0000000100000000000000A6
-rw-------. 1 coder coder 16777216 24 16:26 0000000100000000000000A7
-rw-------. 1 coder coder 16777216 24 16:26 0000000100000000000000A8
-rw-------. 1 coder coder 16777216 24 16:26 0000000100000000000000A9
-rw-------. 1 coder coder 16777216 24 16:26 0000000100000000000000AA
-rw-------. 1 coder coder 16777216 24 16:26 0000000100000000000000AB
-rw-------. 1 coder coder 16777216 24 16:26 0000000100000000000000AC
-rw-------. 1 coder coder 16777216 24 16:26 0000000100000000000000AD
-rw-------. 1 coder coder 16777216 24 16:26 0000000100000000000000AE
-rw-------. 1 coder coder 16777216 24 16:26 0000000100000000000000AF
-rw-------. 1 coder coder 16777216 24 16:26 0000000100000000000000B0
-rw-------. 1 coder coder 16777216 24 16:26 0000000100000000000000B1
-rw-------. 1 coder coder 16777216 24 16:26 0000000100000000000000B2
-rw-------. 1 coder coder 16777216 24 16:26 0000000100000000000000B3
-rw-------. 1 coder coder 16777216 24 16:26 0000000100000000000000B4
-rw-------. 1 coder coder 16777216 24 16:26 0000000100000000000000B5
-rw-------. 1 coder coder 16777216 24 16:26 0000000100000000000000B6
-rw-------. 1 coder coder 16777216 24 16:26 0000000100000000000000B7
-rw-------. 1 coder coder 16777216 24 16:26 0000000100000000000000B8
drwx------. 2 coder coder       43 24 16:38 archive_status
[coder@localhost build_postgres]$
  1. 使用stat,查看wal文件的更改时间信息
[coder@localhost build_postgres]$ stat data_test/pg_wal/00000001000000000000007A
文件:"data_test/pg_wal/00000001000000000000007A"
大小:16777216        块:32768      IO 块:4096   普通文件
设备:fd00h/64768d      Inode:33554500    硬链接:1
权限:(0600/-rw-------)  Uid:( 1000/   coder)   Gid:( 1000/   coder)
环境:unconfined_u:object_r:user_home_t:s0
最近访问:2024-02-04 16:39:38.050057576 +0800
最近更改:2024-02-04 16:38:49.974694468 +0800
最近改动:2024-02-04 16:38:49.974694468 +0800
创建时间:-
[coder@localhost build_postgres]$ stat data_test/pg_wal/00000001000000000000007B
文件:"data_test/pg_wal/00000001000000000000007B"
大小:16777216        块:32768      IO 块:4096   普通文件
设备:fd00h/64768d      Inode:33554504    硬链接:1
权限:(0600/-rw-------)  Uid:( 1000/   coder)   Gid:( 1000/   coder)
环境:unconfined_u:object_r:user_home_t:s0
最近访问:2024-02-04 16:39:44.187103929 +0800
最近更改:2024-02-04 16:25:39.695772523 +0800
最近改动:2024-02-04 16:26:20.931006693 +0800
创建时间:-
[coder@localhost build_postgres]$
问题2:为什么无法使用pg_waldump,解析未来使用的wal文件?

使用pg_waldump程序,解析PostgreSQL预分配给未来使用的wal文件,发现pg_waldump提示“fatal: could not find a valid record after 0/7C000000”,无法成功解析未来使用的wal文件;

[coder@localhost build_postgres]$ ./bin/pg_waldump data_test/pg_wal/00000001000000000000007C | tail -n 10
pg_waldump: fatal: could not find a valid record after 0/7C000000
[coder@localhost build_postgres]$

问题分析

问题1:为什么未来使用的wal文件,创建时间会更早?
  1. 查看00000001000000000000007B文件的MD5,并与archive归档目录下的wal文件比较,我们发现00000001000000000000007B文件,与00000001000000000000004B的MD5是一致的。
[coder@localhost build_postgres]$ md5sum data_test/pg_wal/00000001000000000000007B
bac5e93ba8d551dabd8ffe5a24a678d1  data_test/pg_wal/00000001000000000000007B
[coder@localhost build_postgres]$ md5sum archive/* |grep bac5e93ba8d551dabd8ffe5a24a678d1
bac5e93ba8d551dabd8ffe5a24a678d1  archive/00000001000000000000004B
[coder@localhost build_postgres]$
  1. 分析PostgreSQL的checkpoint执行流程,
检查点
重启点
回收不再使用的wal文件
删除不再使用的wal文件
CreateCheckPoint
RemoveOldXlogFiles
CreateRestartPoint
RemoveXlogFile
InstallXLogFileSegment
durable_unlink
  1. RemoveXlogFile函数中,关键代码如下:
static void
RemoveXlogFile(const char *segname, XLogRecPtr lastredoptr, XLogRecPtr endptr)
{skip.../** Before deleting the file, see if it can be recycled as a future log* segment. Only recycle normal files, pg_standby for example can create* symbolic links pointing to a separate archive directory.*/if (wal_recycle &&endlogSegNo <= recycleSegNo &&lstat(path, &statbuf) == 0 && S_ISREG(statbuf.st_mode) &&InstallXLogFileSegment(&endlogSegNo, path,true, recycleSegNo, true)){ereport(DEBUG2,(errmsg("recycled write-ahead log file \"%s\"",segname)));CheckpointStats.ckpt_segs_recycled++;/* Needn't recheck that slot on future iterations */endlogSegNo++;}else{skip...}skip...
}
问题2:为什么无法使用pg_waldump,解析未来使用的wal文件?
  1. 使用pg_waldump解析00000001000000000000007B文件,发现无法成功解析,提示如下:
[coder@localhost build_postgres]$ ./bin/pg_waldump data_test/pg_wal/00000001000000000000007B
pg_waldump: fatal: could not find a valid record after 0/7B000000
  1. 堆栈分析,定位到XLogReaderValidatePageHeader函数中:
(gdb) bt
#0  XLogReaderValidatePageHeader (state=0x6401f0, recptr=2063597568, phdr=0x640b10 "\001\321\a") at xlogreader.c:865
#1  0x000000000040574a in ReadPageInternal (state=0x6401f0, pageptr=2063597568, reqLen=0) at xlogreader.c:629
#2  0x00000000004060d9 in XLogFindNextRecord (state=0x6401f0, RecPtr=2063597568) at xlogreader.c:959
#3  0x00000000004044a7 in main (argc=2, argv=0x7fffffffe3e8) at pg_waldump.c:1116
(gdb)
  1. 关键以下代码:
bool
XLogReaderValidatePageHeader(XLogReaderState *state, XLogRecPtr recptr,char *phdr)
{...skip...if (hdr->xlp_pageaddr != recaddr){char        fname[MAXFNAMELEN];XLogFileName(fname, state->readPageTLI, segno, state->wal_segment_size);report_invalid_record(state,"unexpected pageaddr %X/%X in log segment %s, offset %u",(uint32) (hdr->xlp_pageaddr >> 32), (uint32) hdr->xlp_pageaddr,fname,offset);return false;}...skip...
}
pg_waldump
  1. 经过调试发现,pg_waldump在解析00000001000000000000007B文件时,发现其中的第一个XLogPageHeader的xlp_pageaddr是0x4b000000,也就是对应archive/00000001000000000000004B文件,与其文件名00000001000000000000007B不符,所以打印错误信息,退出该wal文件的解析。

小结

  1. PostgreSQL对于不再使用的wal文件,会根据具体情况,以及wal_recycle参数,决定是执行回收还是删除操作。如果是回收wal文件,则是直接重命名该wal文件的,并不会修改或者重置wal文件中的内容。
  2. 使用pg_waldump工具,无法解析回收的wal文件,原因是回收的wal文件,根据其文件名称,与文件中的实际内容,计算出的xlp_pageaddr不一致,pg_waldump发现不一致后,直接退出wal文件的解析。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot160社区智慧养老监护管理平台设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

【数据分享】1929-2023年全球站点的逐年平均能见度(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、能见度等指标&#xff0c;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 之前我们分享过1929-2023年全球气象站点的逐年平均气温数据、逐年最高气温数据…

在django中集成markdown文本框

首先需要下载开源组件&#xff1a;http://editor.md.ipandao.com/&#xff0c;可能需要挂梯子。 百度网盘&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1D9o3P8EQDqSqfhAw10kYkw 提取码&#xff1a;eric 1.在html代码中生成一个div&#xff0c;ideditor <div c…

Oracle数据表ID自增操作

一、Oracle ID自增长功能介绍 Oracle数据库默认不支持像 SQLServer、MySQL中的自增长&#xff08;auto increment&#xff09;功能&#xff0c;即自动为每一行记录的自增长字段生成下一个值。 二、Oracle ID自增长方法 第一种&#xff0c;通过序列&#xff08;sequence&#…

蓝桥杯Web应用开发-CSS 基础语法4(字体属性、链接中的伪类、列表样式)

专栏持续更新中 字体属性 字体属性用于定义字体的类型、字号大小、加粗、斜体等方面样式。常用的字体属性如下表所示&#xff1a; 属 性可 取 值描 述fontfont-style、font-variant、font-weight、font-size&#xff08;或 line-height&#xff09;、font-family在一个声明中…

《计算机网络简易速速上手小册》第5章:无线网络和移动通信(2024 最新版)

5.1 WLAN的工作原理 - 揭秘无线局域网络的魔法 5.1.1 基础知识 无线局域网络&#xff08;WLAN&#xff09;允许设备通过无线方式连接到一个局部区域网络&#xff0c;主要基于IEEE 802.11标准&#xff0c;俗称Wi-Fi。WLAN的核心是无线路由器&#xff0c;它不仅充当着网络中各设…

【多模态】27、Vary | 通过扩充图像词汇来提升多模态模型在细粒度感知任务(OCR等)上的效果

论文&#xff1a;Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models 代码&#xff1a;https://github.com/Ucas-HaoranWei/Vary 出处&#xff1a;旷视 时间&#xff1a;2023.12 一、背景 当前流行的大型视觉-语言模型 Large Vision-Language Mode…

挑战杯 python+opencv+深度学习实现二维码识别

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; pythonopencv深度学习实现二维码识别 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;3分 该项目较为新颖&…

探索Gin框架:Golang Gin框架请求参数的获取

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站https://www.captainbed.cn/kitie。 前言 我们在专栏的前面几篇文章内讲解了Gin框架的路由配置&#xff0c;服务启动等内容。 专栏地址&…

后台弱口令问题

网站的运营管理不能缺少后台管理系统的支持&#xff0c;若能成功进入后台管理系 统&#xff0c;就意味着在Web渗透测试中成功了一大半。进行非授权登录有很多种方法&#xff0c; 这里主要介绍的是弱口令问题&#xff0c;破解弱口令是进入系统的最常见也是最有效的方 法&#xf…

如何在 Java 中通过 Map.Entry 访问 Map 的元素

我们使用 Map.Entry 来遍历 ConcurrentHashMap 的代码片段如下&#xff1a; for (Map.Entry<String, String> entry : map.entrySet()) { System.out.println("Key: " entry.getKey() ", Value: " entry.getValue()); } 在 Map.java 中&…

RabbitMQ_00000

MQ的相关概念 RabbitMQ官网地址&#xff1a;https://www.rabbitmq.com RabbitMQ API地址&#xff1a;https://rabbitmq.github.io/rabbitmq-java-client/api/current/ 什么是MQ&#xff1f; MQ(message queue)本质是个队列&#xff0c;FIFO先入先出&#xff0c;只不过队列中…

web前后端小坑记录

游戏服务器过年这段时间忙完了&#xff0c;好久没看web了&#xff0c;重温一下。发现竟然没有文章记录这些修BUG的过程&#xff0c;记录一下。 目录 如何处理F5刷新&#xff1f; 如何处理F5刷新&#xff1f; 后端应该发现路由不存在&#xff0c;直接返回打包好的index.html就…

2024美赛数学建模C题完整论文教学(含十几个处理后数据表格及python代码)

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了数学建模美赛本次C题目Momentum in Tennis完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文。 C论文共49页&…

第6节、T型加减速转动【51单片机+L298N步进电机系列教程】

↑↑↑点击上方【目录】&#xff0c;查看本系列全部文章 摘要&#xff1a;本章介绍步进电机T型加减速的控制方法&#xff0c;分三个小节&#xff0c;本小节主要内容为该控制方法的推导与计算。目前各平台对该控制方法介绍的文章目前较多&#xff0c;但部分关键参数并未给出推导…

Linux【docker 设置阿里源】

文章目录 一、查看本地docker的镜像配置二、配置阿里镜像三、检查配置 一、查看本地docker的镜像配置 docker info一般没有配置过是不会出现Registry字段的 二、配置阿里镜像 直接执行下面代码即可&#xff0c;安装1.10.0以上版本的Docker客户端都会有/etc/docker 1.建立配置…

在openSUSE-Leap-15.5-DVD-x86_64中使用deepin-wine-8.16再使用微信3.9.7.29

在openSUSE-Leap-15.5-DVD-x86_64中使用deepin-wine-8.16再使用微信3.9.7.29 《在openSUSE-Leap-15.5-DVD-x86_64中使用deepin-wine-6.0.0.62再使用微信3.9.5》 https://blog.csdn.net/weixin_42145772/article/details/135074804?spm1001.2014.3001.5501 按照上面文章的方法…

计算机设计大赛 深度学习 python opencv 实现人脸年龄性别识别

文章目录 0 前言1 项目课题介绍2 关键技术2.1 卷积神经网络2.2 卷积层2.3 池化层2.4 激活函数&#xff1a;2.5 全连接层 3 使用tensorflow中keras模块实现卷积神经网络4 Keras介绍4.1 Keras深度学习模型4.2 Keras中重要的预定义对象4.3 Keras的网络层构造 5 数据集处理训练5.1 …

飞天使-k8s知识点16-kubernetes实操1-pod

文章目录 深入Pod 创建Pod&#xff1a;配置文件详解写个pod的yaml 文件深入Pod 探针&#xff1a;探针技术详解 深入Pod 创建Pod&#xff1a;配置文件详解 资源清单参考链接&#xff1a;https://juejin.cn/post/6844904078909128712写个pod的yaml 文件 apiVersion: v1 kind: P…

Android Compose 一个音视频APP——Magic Music Player

Magic Music APP Magic Music APP Magic Music APP概述效果预览-视频资源功能预览Library歌曲播放效果预览歌曲播放依赖注入设置播放源播放进度上一首&下一首UI响应 歌词歌词解析解析成行逐行解析 视频播放AndroidView引入Exoplayer自定义Exoplayer样式横竖屏切换 歌曲多任…