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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一些关于使用Flask对PostgreSQL数据库进行JSON格式数据读写操作的代码示例。 在使用Flask和PostgreSQL之前,您需要先安装所需的Python包。请使用以下命令安装: ``` pip install Flask psycopg2-binary ``` 接下来,您可以按照以下步骤来编写Flask代码以读写PostgreSQL中的JSON数据: 1. 导入所需的包: ```python from flask import Flask, jsonify, request import psycopg2 ``` 2. 建立PostgreSQL数据库连接: ```python conn = psycopg2.connect(database="your_database_name", user="your_username", password="your_password", host="your_host", port="your_port") ``` 3. 创建Flask应用程序: ```python app = Flask(__name__) ``` 4. 编写一个函数,用于从PostgreSQL数据库中读取JSON格式数据: ```python @app.route('/get_json_data') def get_json_data(): cur = conn.cursor() cur.execute("SELECT json_data FROM your_table_name") rows = cur.fetchall() data = [] for row in rows: data.append(row[0]) cur.close() return jsonify(data) ``` 5. 编写一个函数,用于将JSON格式数据写入PostgreSQL数据库: ```python @app.route('/write_json_data', methods=['POST']) def write_json_data(): json_data = request.json cur = conn.cursor() cur.execute("INSERT INTO your_table_name (json_data) VALUES (%s)", (json_data,)) conn.commit() cur.close() return jsonify({"message": "Data written successfully"}) ``` 6. 运行Flask应用程序: ```python if __name__ == '__main__': app.run() ``` 这样,您就可以使用Flask和PostgreSQL来读写JSON格式数据了。请记得将代码中的数据库连接信息替换为您自己的信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值