POSTGRESQL 13.1 bug 与 逻辑复制槽参数调优

news2025/9/10 18:55:12

54a578e3144d21b46e1dc85fb00cddbe.png

随着问问题的同学越来越多,公众号内部私信回答问题已经很困难了,所以建立了一个群,关于各种数据库的问题都可以,目前主要是 POSTGRESQL, MYSQL ,MONGODB ,POLARDB ,REDIS,SQL SERVER 等,期待你的加入,加群请添加微信liuaustin3.  (群里有各方面的工作人员和专家)

这里首先的写这篇文章的之前的感谢阿里云的 PG RDS 数据库组的同学们,基于隐私我就不提名字了,感谢他们对这个故障所付出的时间和经历。

先说说问题是什么,核心的问题就是我们的逻辑复制槽,在工作的情况下,突发就不工作了,active 的状态为 f , 而这个问题困扰了我们一天的时间,最终还是通过阿里云的同学找到了问题的起因。

这里我们使用的POSTGRESQL 的版本是13.1 ,主要有两个原因 1 当时采用的PG的版本时最新的版本就是 13.1 , 另外我们从PG10 直接升级到 PG 13 是经过测试的无误的情况下,主要的一个需求也是 逻辑复制槽的支持和相关的数据传输的问题。

c98e606f049bcd53b91bcbc7e01ac43d.png

524b9849302e54eba1d1cade08050f70.png

首先逻辑decoding 是一个将数据库中持久化的更改的信息,用一种易于理解的数据格式的方式进行表达的方式,这里PG 是通过WAL 日志中的信息将这些内容进行表达的一种方式。

复制槽逻辑复制主要是功能就是将数据库的信息变动进行重放根据信息产生的顺序来进行每一个逻辑复制槽就是针对一个PG 逻辑数据库的回放通道。如果逻辑复制槽不正常的情况下,PG 会遇到灾难性的问题

1  数据库不在进行checkpoint  (手动也无效)

2  随着checkpoint 不工作,则WAL 日志会快速堆积,无法在清理,包含你有归档的情况下

对这方面不清楚的可以查看下面的文字

8792890302dabbcd50024c55bd5321ee.png

https://cloud.tencent.com/developer/article/1671149

所以逻辑复制槽本身对于数据库和数据库的性能有至关重要的影响。

这里的主要的问题的BUG 产生是这样的一个过程

1  在逻辑复制中我们采用的是 FOR ALL TABLES ,也就是说我们采用的逻辑复制是对这个逻辑数据库中的所有的表进行的数据变更的确认,那么这里如果有表在DDL 期间 REWRITE 了,也就是DDL 导致这个重新建立,那么在这个期间会产生一个临时表 pg_temp_xxxx ,而这个表实际上并不应该包含在 FOR ALL TABLES 内,因为包含了,也无法对这个表进行数据的传输。这里PG 对于这个问题进行了过滤。那么BUG 是怎么产生的。

2  BUG 的产生是对于逻辑复制中的对于DDL REWRITE 重写进行了处理,但是在我们这个版本 PG13.1中并未对 REWRITE 中的 TOAST 表进行处理,导致的问题。

另外还有一些其他可能引起的问题,参加下面这段文字, memory leak 和  插入的数据覆盖还在使用的toast中的数据的问题。所以需要对当前的PG

进行PTACH。

If speculative insert has a toast table insert then if that tuple

is not confirmed then the toast hash is not cleaned and that is

creating various problem like a) memory leak b) next insert is

using these uncleaned toast data for its insertion and other

error and assersion failure.  So this patch handle that by

queuing the spec abort changes and cleaning up the toast hash

on spec abort.  Currently, in this patch we are queuing up all

the spec abort changes, but as an optimization we can avoid

queuing the spec abort for toast tables but for that we need to

log that as a flag in WAL.

下面逐一对PG13.2 以及后续版本在 logical 部分的bug fix进行一个信息的统计

1 PG 13.2 更新了如下的logical 部分的问题

Fix memory leak in walsender processes while sending new

snapshots for logical decoding (Amit Kapila)

Fix relation cache leak in walsender processes while

sending row changes via the root of a partitioned relation

during logical replication (Amit Langote, Mark Zhao)

2 PG 13.3 更新了如下logical部分的问题

Fix crash when a logical replication worker does

ALTER SUBSCRIPTION REFRESH (Peter Smith)


 

3 PG 13.4 更新了如下logical部分的问题

Logical replication workers frequently used Asserts to check

for cases that could be triggered by invalid or out-of-order

replication commands. This seems unwise, so promote these

tests to regular error checks.

Fix assorted crash cases in logical replication of

partitioned-table updates (Amit Langote, Tom Lane)

Fix potential crash when firing AFTER triggers of partitioned

tables in logical replication workers (Tom Lane)

Fix deadlock when multiple logical replication workers try to

truncate the same table (Peter Smith, Haiying Tang)

Fix error cases and memory leaks in logical decoding of

speculative insertions (Dilip Kumar)

Fix memory leak in logical replication output (Amit Langote)

4 PG 13.5 更新了如下logical 部分问题

Fix logical decoding to correctly ignore toast-table changes

for transient tables (Bertrand Drouvot)

Logical decoding normally ignores changes in transient tables

such as those created during an ALTER TABLE heap rewrite.

But that filtering wasn't applied to the associated toast

table if any, leading to possible errors when rewriting a table

that's being published.

Fix logical decoding's memory usage accounting to handle TOAST

data correctly (Bertrand Drouvot)

5 PG 13.6 更新了如下的logcial 部分的问题

Be sure to fsync the pg_logical/mappings subdirectory during

checkpoints (Nathan Bossart)

On some filesystems this oversight could lead to losing logical

rewrite status files after a system crash.

而我们目前的问题就是 PG13.5 中FIX 的问题

Fix logical decoding to correctly ignore toast-table changes
for transient tables (Bertrand Drouvot)
另外我们还要知道一个问题就是 POSTGRESQL 13 中的关于 logical 的优化
部分,
1  max_changes_in_memory(4096)

2 logcial_decoding_work_mem

这里我们关注的是第二个参数 logcial_decoding_work_mem 的设置值的问题

3a2c969da3e981b43fb923202c391642.png

这里可以优化的参数在PG 13中被提供,可以通过开启更大的 logical_

decoding_mem 来支持在处理数据的过程中,使用内存,而不是将数据防止在

磁盘上。对于一些强依赖 logical 复制做大数据的情况下,是有意义的。

那么我们回到问题,遇到这个BUG 如何解决,没有办法只能删除,并重建这个

复制槽。然后我们准备对PG 进行小版本升级的工作。

下面是一些监控逻辑复制槽部分的语句如果有需要可以自取

select   pid, client_addr, state, sync_state,

pg_wal_lsn_diff(sent_lsn, write_lsn) as write_lag,

pg_wal_lsn_diff(sent_lsn, flush_lsn) as flush_lag,

pg_wal_lsn_diff(sent_lsn, replay_lsn) as replay_lag

from pg_stat_replication;

1c958b5e324d4bfbc316443b94097d87.png

SELECT slot_name, plugin, slot_type, database, active, restart_lsn,

confirmed_flush_lsn FROM pg_replication_slots;

e3c93195d18fc4be718c63db563196cd.png

 SELECT slot_name, 

    pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn)) as replicationSlotLag, 

     pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), confirmed_flush_lsn)) as confirmedLag,

     active,wal_status

 FROM pg_replication_slots;

fbc5e5c2d510c7a06c246262b03e5bdb.png

或者通过上面的命令来查看逻辑复制槽积压的数据的动态值,和复制槽的状态

如wal_status 出现LOST 则说明你当前复制槽已经不可用,对方需要的数据已经

被删除,如果是extended 则说明虽然逻辑复制槽还在保留数据但是保留的数据的

的大小已经超过max_wal_size 的大小,需要注意了

140f046e3f9e6873e3e6946ce7899e1d.png

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

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

相关文章

pytorch 多卡运行详细教程

先说明一下背景,目前正在魔改以下这篇论文的代码: https://github.com/QipengGuo/GraphWriter-DGLgithub.com 由于每次完成实验需要5个小时(baseline),自己的模型需要更久(2倍),非…

战略和什么相关?

(1)战略和创新企业做到最大,就是业务多元化/一体化、区域全球化。想再折腾折腾,那就手里这几张牌搞重新排列组合,这就是:企业再造。就是中国人说的:天下大势分久必合合久必分。按照波士顿咨询来…

20221224英语学习

今日词汇 lash v.将(物品)系牢,捆绑;(风、雨等)猛烈打击;鞭打;猛烈抨击,严厉斥责 detective n.侦探; 警探; 发掘者; 发现者 division n.分开; 分隔; 分配; 分隔物; 刻…

深度学习SSD算法

目录1 SSD网络结构1.1 backbone1.2 extra部分1.3 loc和cls1.3.1 PriorBox层先验框的生成方法1.3.2 loc的预测结果2 模型训练2.1 正负样本标记2.2 损失函数2.3 困难样本挖掘3 模型预测4 总结1 SSD网络结构 SSD是YOLO V1出来后,YOLO V2出来前的一款One-stage目标检测…

Linux0.11 考古笔记

Linux0.11 考古笔记 最近读完《Linux 内核完全注释》和《品读 Linux0.11 核心代码》,大致理解下 Linux0.11 内核的全貌。在我理解这些属于计算机基础类的知识,所以在未来的工作场景不太可能会直接用到它们,如果用不到的话这些知识可能会随着…

从 2022 年优秀 Linux 发行版中挑选你喜欢的版本

导读如果你想从 2022 年最佳 Linux 发行版列表中挑选一个最喜欢的版本,那么今天你需要考虑以下几个选项。 2022 年是充满惊喜的一年,Linux 发行版的表现也不例外。从充满功能的新版本到各种桌面选项,总有一些值得期待的东西。 如果你想从 20…

自制macOS安装镜像iso虚拟机用

在网上下载的用于在虚拟机中安装的镜像版本相对比较旧。安装完成后还要进行升级比较麻烦。于是我就想自己制作安装镜像了。 精华 #创建空白磁盘镜像 hdiutil create -o /tmp/ventura -size 13800m -volname ventura -layout SPUD -fs HFSJ #挂载上面创建的镜像 hdiutil attac…

【Java 数据结构】-二叉树OJ题

作者:学Java的冬瓜 博客主页:☀冬瓜的博客🌙 专栏:【Java 数据结构】 分享:宇宙的最可理解之处在于它是不可理解的,宇宙的最不可理解之处在于它是可理解的。——《乡村教师》 主要内容:二叉树的…

离职时,是在公司群里大方告别,主动退群?还是一言不发,默默退出?

离职时怎么体面退出工作群?一位网友说,自己公司的同事离职那天,在公司群里发了一大段感谢的话,大大方方挥手告别后主动退了群。有同事夸这个离职的人情商高,这样告别大方得体,是离职的好表率。但楼主觉得&a…

SAP UI5 加载本地并不存在的 PDF 文件的错误处理

这个 _onLoadListener 函数什么时候注册的呢? iframe 完成加载之后,就触发这个 load 事件注册的处理函数: PDFViewer.prototype.onAfterRendering function () {var fnInitIframeElement function () {// cant use attachBrowserEvent be…

vue后台管理系统项目-vue-quill-editor实现富文本编辑器功能 可直接使用

富文本编辑器功能实现详细过程 目录 富文本编辑器功能实现详细过程 1.安装富文本插件 2.实现效果 3.实现详细过程 可直接使用 全局引入 局部引入 配置option 扩展需求 自定义配置文字大小 1.安装富文本插件 npm install vue-quill-editor --save //或者 yarn add vu…

Android电源管理介绍

一、电源管理基础知识1.1电源管理的几种状态Android kernel源码中,定义了三种电源状态,在kernel/power/suspend.c中:对应的宏定义/include/linux/suspend.h1.2 电源管理状态的介绍:PM_SUSPEND_ON设备处于正常工作状态PM_SUSPEND_S…

VsCode搭建C语言运行环境以及终端乱码问题解决

在VsCode中搭建C/C运行环境需要先安装以下插件 1、安装c/c插件 2、安装code runner插件 当然也可以安装一些其他的美化插件根据个人习惯,但是以上这两个是必装的。 安装好插件后来到插件主页点击卸载旁边的小齿轮选择扩展设置 找到扩展设置中的下图选项并打上勾即可…

前端小知识:控制台打印(console)- 模拟Java日志打印、表格形式打印美化输出对象、代码运行时间统计

文章目录6. 控制台打印(Console)模拟Java日志打印格式美化对象打印(表格形式打印输出)日志等级输出(让其在控制台显示时有颜色提示)代码运行时间统计打印输出6. 控制台打印(Console)…

LeetCode HOT 100 —— 560. 和为 K 的子数组

题目 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的连续子数组的个数 思路 首先,要明白本题不能使用双指针或者滑动窗口,因为双指针和滑动窗口使用的一个必要条件就是能一步一步迭代,确定窗口的收缩方…

Unity3D教程:2D游戏技能特效

在我们的2D图形游戏中不可缺少大量的光影、技能特效,像Diablo II中的魔法效果的实现,幸好我们拥有强大的CPU来为我们实现Alpha混合与色彩饱和混合,接下来让我们来讨论一下如何用这些方法来实现我们游戏中所需要的技能特效。 一、Alpha混合特效…

【ArcGIS Pro微课1000例】0023:ArcGIS Pro 3.0中打开GeoPackage数据库(.gpkg)

本文讲解ArcGIS Pro 3.0中打开GeoPackage数据库(.gpkg)的两种方法。 文章目录 一、QGIS创建GeoPackage二、ArcGIS Pro 3.0打开GeoPackage1. 直接加载2. 添加数据库一、QGIS创建GeoPackage 本文使用到的GeoPackage是在QGIS中创建并入库的,具体操作可以参考: 【QGIS入门实战…

Kakarot:部署在Starknet上的ZK-EVM type 3

1. 引言 sayajin-labs团队开源的: https://github.com/sayajin-labs/kakarot(ZK-EVM type 3 written in Cairo, leveraging STARK proof system.) Kakarot提供了相应的playground: https://playground.kakarot.org/?forkmerg…

aardio - libxl库,一个dll操作excel

经常用到excel操作,也有几个现成的库能实现我需要的功能,但用起来总是感觉不顺手。 于是便抽了两天时间,在aaz.libxl库的基础上,按照我的使用习惯进行了修改。 以后再也不用为操作excel发愁啦。 下载地址:http://che…

基于docker部署nexus并创建发布npm包

1. nenus部署 1.1 搜索镜像 [rootsurpass ~]# docker search nexus INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED docker.io docker.io/sonatype/nexus3 …