当前位置: 首页 > news >正文

PG逻辑解码

简介

postgresql中逻辑复制槽常备用于表级别的数据同步,多用于PG->PG之间跨版本的数据同步。Debezium插件便是利用逻辑复制的功能,可以将数据应用到异构数据库之间的数据同步。在不借助外部插件的情况下也可以同步读取复复制槽数据,实现数据异构之间的实时同步。
本文讲解一下使用逻辑解码实现异构数据库之间数据实时同步的方法思路。

创建复制槽

需要创建逻辑复制槽,物理复制槽并不能作为逻辑解码。
是用函数pg_create_logical_replication_slot手工创建,此函数有入参有四个
slot_name:定义复制槽名称
plugin name,:输出插件工具
temporary boolean DEFAULT false:是否定义临时复制槽,当会话断开之后就会被删掉。
twophase boolean DEFAULT false:是否定义两阶段提交
这里输出插件内置有pgoutput,test_conding两个,需要使用test_decoding。pgoutput插件暂时不支持SQL端调用解码,但是在发布订阅中,默认使用的是pgoutput输出插件,两者在输出格式上没什么太大差别。

输出插件在PG内置了两个pgoutput和test_decoding,

创建逻辑复制槽
select pg_create_logical_replication_slot('stream_slot_td','test_decoding',false,true);select pg_create_logical_replication_slot('stream_slot_td_tmp','test_decoding',true,true);select pg_create_logical_replication_slot('stream_slot_td_two','test_decoding',false,false);
删除复制槽
SELECT pg_drop_replication_slot('stream_slot_pt_two');

SQL接口进行解码

通过 pg_logical_slot_get_changes函数俘获
lot_name :需要俘获的复制槽名称
upto_lsn:读取终止点LSN
upto_nchanges:读取终止行数,相当limit
upto_lsn、upto_nchanges均为空的时候,读取到当前wal最后一个lsn
该函数用于消费复制槽中的数据,一旦被消费就会被清空。

除此之外还有两个函数可以进行逻辑解码

通过 pg_logical_slot_peek_changes 函数俘获
入参同pg_logical_slot_get_changes函数一样,此函数在消费过复制槽中的数据之后,复制槽中的数据并不会被清空。

通过 pg_logical_slot_get_binary_changes 函数俘获
入参同pg_logical_slot_get_changes函数一样,此函数在消费过复制槽中的数据之后,复制槽中的数据并不会被清空。返回值为bytea数据类型

使用函数进行解码复制槽其函数解码只会返回三个字段lsn,xid,data

select lsn,xid,data from pg_logical_slot_peek_changes ('stream_slot_td',null,null);select lsn,xid,data from  pg_logical_slot_get_binary_changes ('stream_slot_td',null,null);select lsn,xid,data from  pg_logical_slot_get_changes('stream_slot_td',null,null);

删除复制槽
SELECT pg_drop_replication_slot(‘your_slot_name’);

在解码复制槽时,并不会读取到非创建库的WAL信息。

pg_recvlogical的俘获复制槽流

pg_recvlogical -h 10.0.0.107 -d postgres --slot=stream_slot_td  --start   --no-loop  --file=output --plugin=test_decoding  -U postgres 

将其内容读取到output文件中去 使用以下python代码 去每一秒读取output文件,此时你可以将其读取出来数据转换为SQL 语句 更新到其他的异构库数据库中去。

import time
import paramiko# 远程服务器信息
ssh_host = "10.0.0.107"
ssh_user = "postgres"
ssh_password = "postgres"
remote_file_path = "/home/postgres/output"# 记录文件上次读取的位置
last_position = 0def run_ssh_command(ssh_client, command):"""执行 SSH 命令并返回输出"""stdin, stdout, stderr = ssh_client.exec_command(command)return stdout.read().decode('utf-8')try:# 设置SSH连接ssh_client = paramiko.SSHClient()ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())ssh_client.connect(ssh_host, username=ssh_user, password=ssh_password)while True:# 使用 tail 命令从上次的位置读取新增内容tail_command = f"tail -c +{last_position + 1} {remote_file_path}"new_data = run_ssh_command(ssh_client, tail_command)last_position += len(new_data)if new_data:# 处理每行日志并打印到控制台lines = new_data.splitlines()for line in lines:print(line)# 每隔1秒检查一次time.sleep(1)finally:ssh_client.close()

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 常见的性能测试方法!
  • 计算机毕业设计推荐-基于python的公司员工考勤管理系统
  • 全网最详细docker详解,从概念到实战一篇解决
  • 【 html+css 绚丽Loading 】000030 灵文闪烁符
  • 汽车免拆诊断案例 | 马自达CX-3无音频输出
  • 一文读懂flask
  • VSCode连接SSH发生connection timeout
  • 算法数学加油站:一元高斯分布(正态分布)Python精美科研绘图(PDF、CDF、PPF、ECDF曲线;QQ图)
  • P1004 [NOIP2000 提高组] 方格取数
  • linux 9系统分区扩容
  • pymysql cursor使用教程
  • CSS学习1
  • 百度文库文章-暂存下-------题 目: 链式简单选择排序
  • 内存管理篇-17解开页表的神秘面纱-下
  • 【Redis】Redis 持久化 AOF、RDB—(七)
  • php的引用
  • CentOS 7 修改主机名
  • Cumulo 的 ClojureScript 模块已经成型
  • emacs初体验
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • MySQL-事务管理(基础)
  • oldjun 检测网站的经验
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • React-生命周期杂记
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 从PHP迁移至Golang - 基础篇
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 微信小程序:实现悬浮返回和分享按钮
  • 线性表及其算法(java实现)
  • 小程序测试方案初探
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • #HarmonyOS:软件安装window和mac预览Hello World
  • (16)Reactor的测试——响应式Spring的道法术器
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (C)一些题4
  • (day18) leetcode 204.计数质数
  • (zhuan) 一些RL的文献(及笔记)
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (四)linux文件内容查看
  • (四)鸿鹄云架构一服务注册中心
  • (译)计算距离、方位和更多经纬度之间的点
  • (转)德国人的记事本
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .env.development、.env.production、.env.staging
  • .form文件_SSM框架文件上传篇
  • .JPG图片,各种压缩率下的文件尺寸
  • .Net 6.0 处理跨域的方式
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装