postgres wal2json插件jsonb字段数据丢失问题解决

2023-11-03 05:50

本文主要是介绍postgres wal2json插件jsonb字段数据丢失问题解决,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

使用pg+wal2json+debezium进行数据同步时,发现偶尔会有jsonb字段数据丢失的问题

进行测试时发现:
1、发生数据丢失的jsonb字段长度都比较大(超过toast阈值,使用toast表存储)
2、针对发生jsonb字段丢失的数据,jsonb字段本身未发生修改时,能够百分百重现问题;而如果jsonb字段发生修改,就不会有问题

针对这个情况,分析是由于wal2json针对pg toast存储的处理导致

GitHub上找到相应的issue:https://github.com/eulerto/wal2json/issues/98

首先理解下什么是toast:
TOAST(The Oversized-Attribute Storage Technique)是一种机制,用于处理大数据对象(LOBs,Large Objects)或者超长字段的存储。当某个表中包含大量的大数据对象或超长字段时,这些数据可能会占据大量的存储空间,影响数据库性能。为了优化存储和处理性能,PostgreSQL 将大数据对象和超长字段称为 “TOAS Table” 数据,并将其存储在单独的 TOAST 表中。

而wal2json针对pg toast的存储做了"性能优化",如果发现toast字段未发生改变,就不输出这个字段。但是下游的debezium并不知道它做了这个优化,当然就无法进行处理了(debezium误识别为schema变更,把jsonb字段更新为null)

于是自己尝试修改wal2json代码,重新编译
修改方法很简单:搜索VARATT_IS_EXTERNAL_ONDISK关键字,把对应的代码逻辑注释掉
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(其实这里看注释都能看出问题了)

修改之后重新编译(执行make命令即可),把新编译生成的wal2json.so文件,拷贝到pg的lib目录(我这里是/usr/pgsql-11/lib)

然后重新启动pg (systemctl start postgresql-11),问题解决

附带测试使用的命令:

创建slot:
pg_recvlogical -d postgres --slot test_slot --create-slot -P wal2json消费slot:
pg_recvlogical -d postgres --slot test_slot --start -o pretty-print=1 -o add-msg-prefixes=wal2json -f -删除slot:
pg_recvlogical -d postgres --slot test_slot --drop-slot

这篇关于postgres wal2json插件jsonb字段数据丢失问题解决的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/336019

相关文章

linux报错INFO:task xxxxxx:634 blocked for more than 120 seconds.三种解决方式

《linux报错INFO:taskxxxxxx:634blockedformorethan120seconds.三种解决方式》文章描述了一个Linux最小系统运行时出现的“hung_ta... 目录1.问题描述2.解决办法2.1 缩小文件系统缓存大小2.2 修改系统IO调度策略2.3 取消120秒时间限制3

Python将大量遥感数据的值缩放指定倍数的方法(推荐)

《Python将大量遥感数据的值缩放指定倍数的方法(推荐)》本文介绍基于Python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处理,并将所得处理后数据保存为新的遥感影像... 本文介绍基于python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB

关于@MapperScan和@ComponentScan的使用问题

《关于@MapperScan和@ComponentScan的使用问题》文章介绍了在使用`@MapperScan`和`@ComponentScan`时可能会遇到的包扫描冲突问题,并提供了解决方法,同时,... 目录@MapperScan和@ComponentScan的使用问题报错如下原因解决办法课外拓展总结@

MybatisGenerator文件生成不出对应文件的问题

《MybatisGenerator文件生成不出对应文件的问题》本文介绍了使用MybatisGenerator生成文件时遇到的问题及解决方法,主要步骤包括检查目标表是否存在、是否能连接到数据库、配置生成... 目录MyBATisGenerator 文件生成不出对应文件先在项目结构里引入“targetProje

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

numpy求解线性代数相关问题

《numpy求解线性代数相关问题》本文主要介绍了numpy求解线性代数相关问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 在numpy中有numpy.array类型和numpy.mat类型,前者是数组类型,后者是矩阵类型。数组