openGauss系数据库逻辑复制实现双写

news2024/11/24 16:10:26

本篇关于逻辑复制实现双写的案例,本来准备了3个环境,分别是306、501和505,奈何在5版本向3版本订阅的时候,出现了报错,但也将整个过程都记录下来吧。

环境准备

节点信息

MogDB=# select version();                                                                  version

------------------------------------------------------------------------------------------------------------------------------------------------------
 (MogDB 5.0.5 build b77f1a82) compiled at 2023-12-08 03:11:47 commit 0 last mr 1804  on x86_64-unknown-linux-gnu, compiled by g++ (GCC) 7.3.0, 64-bit
(1 row)

MogDB=# show wal_level ;
 wal_level
-----------
 logical
(1 row)

MogDB=# select version();
                                                                       version
------------------------------------------------------------------------------------------------------------------------------------------------------
 (MogDB 5.0.1 build ae6d2ada) compiled at 2023-08-16 09:07:43 commit 0 last mr 1804  on x86_64-unknown-linux-gnu, compiled by g++ (GCC) 7.3.0, 64-bit
(1 row)

MogDB=# show wal_level ;
 wal_level
-----------
 logical
(1 row)

MogDB=# select version();                                                                    version

------------------------------------------------------------------------------------------------------------------------------------------------------
 (MogDB 3.0.6 build 0e82b772) compiled at 2023-09-08 03:05:33 commit 0 last mr 1801  on x86_64-unknown-linux-gnu, compiled by g++ (GCC) 7.3.0, 64-bit
(1 row)

MogDB=# show wal_level ;
 wal_level
-----------
 logical
(1 row)

用户权限 (所有节点)

--创建用户
create user logicalrep REPLICATION OPRADMIN encrypted password 'logicalrep@123';

--配置白名单
host    replication            logicalrep  172.20.22.1/24     sha256

语句准备

--测试表(所有节点)
create table logicaltest(id serial, col1 text, ctime timestamp);
alter table logicaltest REPLICA IDENTITY full;

--初始数据(源)
insert into logicaltest select generate_series(1,5),md5(random()),now();

--发布者mypub506(在505实例,发布者名字应该叫505)
create publication mypub506 for table logicaltest;

--订阅者mysub506(在501实例)
create subscription mysub506 connection 'dbname=postgres host=172.20.22.218 user=logicalrep password=logicalrep@123 port=25001' publication mypub506;

--发布者mypub501(在501实例)
create publication mypub501 for table logicaltest;

--订阅者mysub501(在505实例)
create subscription mysub501 connection 'dbname=postgres host=172.20.22.220 user=logicalrep password=logicalrep@123 port=26001' publication mypub501;

--订阅者mysub501(在306实例)
create subscription mysub501 connection 'dbname=postgres host=172.20.22.220 user=logicalrep password=logicalrep@123 port=26001' publication mypub501;

复制测试

用户访问测试

订阅发布信息检查

目前三个节点都是干净的,没有订阅发布

建立发布订阅关系

506实例初始化数据,并创建发布者

501创建订阅者,发布者是mypub506

5.0.x版本支持了复制历史数据

501创建发布者

506创建订阅者

image.png

双写测试

在501节点上插入数据11-15

 

数据已经同步到506,且在506上再次插入数据1-5,发现数据已经正常写入且同步到501

双写分析

逻辑复制实现双写,没有造成数据循环的原因在于record_origin这个标记,这与PG16中的WITH (ORIGIN = NONE)异曲同工。

REDO @ 1B/312EC090; LSN 1B/312EC100: prev 1B/312EC050; xid 1233997; term 1; len 72; total 111; crc 4149308913; desc: Transaction - XLOG_XACT_COMMIT commit: 2024-04-30 18:28:45.671021 CST; csn:1049046; RecentXmin:1233996; origin: node 1, lsn C/2EE68978, at 2024-04-30 18:42:35.911074 CST
	SYSID 0; record_origin 1; max_block_id 4294967295; readSegNo 6961; readOff 3063808; readPageTLI 0; curReadSegNo 0; curReadOff 0 latestPagePtr 1B/312EC000; latestPageTLI 1; currRecPtr 1B/312EC090
	PRIVATE @1B/31000000-1B/32000000; TLI 1; endptr_reached 0
	MAINDATA main_data_len 72; main_data_bufsz 72
mog_xlogdump: FATAL:  error in WAL record at 1B/3141D9E0: invalid record length at 1B/3141DA38: wanted 32, got 0

问题汇总

高版本5.0.x无法订阅低版本3.0.x

LOG:  received wal replication command: IDENTIFY_MODE
LOG:  received wal replication command: SELECT 1 FROM pg_catalog.pg_publication t WHERE t.pubname IN ('mypub3')
FATAL:  replication command parser returned 1

本文作者:高云龙

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

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

相关文章

【Linux】进程间通信之匿名管道

👦个人主页:Weraphael ✍🏻作者简介:目前正在学习c和算法 ✈️专栏:Linux 🐋 希望大家多多支持,咱一起进步!😁 如果文章有啥瑕疵,希望大佬指点一二 如果文章对…

易飞销货单出货时审核库存检查

公司接到一客户因品种多而数量少,单一出货计划行比较多,而只上了生产ERP易飞,审核时经常会出现倒催货,提前做销售单,行数有时超30行以上,审核跳窗报错时也不方便查找,特写一外挂程序&#xff0c…

代码随想录算法训练营第36期DAY49

DAY49 139单词拆分 没有思路。 回溯法 回溯怎么做呢:拼接str,看能不能拼出来。注意每个单词能用多次,不是用了就没。 但是语法还是难写。 自己的思路不好,题解思路:枚举所有分割字符串,判断是否在字典…

红队神器Evil-winrm的使用

前言 Evil-winrm 工具最初是由 Hackplayers 团队开发的。开发该工具的目的是尽可能简化渗透测试,尤其是在 Microsoft Windows 环境中。 Evil-winrm 使用 PowerShell 远程协议 (PSRP),且系统和网络管理员经常使用Windows Remote Management 协议进行上传和…

哈尔滨三级等保测评需要测哪些设备?

哈尔滨三级等保测评需要测的设备,主要包括物理安全设备、网络安全设备和应用安全设备三大类别。这些设备在保障哈尔滨地区信息系统安全方面发挥着至关重要的作用。 首先,物理安全设备是确保信息系统实体安全的基础。在哈尔滨三级等保测评中,物…

Deepin安装PostGresql

最近要把开发环境完全从Windows移到Deepin上,本次介绍在Deepin借助apt-get安装和配置数据库。同时可以用Dbever提供图形化管理工具。 安装PostGreSQL数据库和创建数据库 #安装postgresql zhanglianzhuzhanglianzhu-PC:/$ sudo apt-get install postgresql-16 正在…

PyCharm中 Fitten Code插件的使用说明一

一. 简介 Fitten Code插件是是一款由非十大模型驱动的 AI 编程助手,它可以自动生成代码,提升开发效率,帮您调试 Bug,节省您的时间,另外还可以对话聊天,解决您编程碰到的问题。 前一篇文章学习了 PyCharm…

mysql数据库密码破解

一、Mysql数据库密码破解 ①一旦获取了网站一定的权限后,如果能够获取MSQL中保存用户数据,通过解密后,即可通过正常途径来访问数据库;一方面可以直接操作数据库中的数据,另一方面可以用来提升权限。 ②MySQL数据库用户密码跟其它…

安泰高压放大器应用领域分享:介电电泳(DEP)技术的具体应用

介电电泳(Dielectrophoresis—DEP)技术描述的是位于非匀称电场的中性微粒由于介电极化的作用而产生的平移运动。产生在微粒上的偶极矩可以有两个相同带电量但极性相反的电荷来表示,当它们在微粒界面上不对称分布时,产生一个宏观的…

小型柴油发电机不发电的原因

小型柴油发电机不发电的原因 小型柴油发电机不发电的原因可能有多种,以下是一些常见的原因: 发动机问题: 发动机油路不通畅,可能导致燃油无法顺利到达燃烧室。 气缸压缩不正常,影响发动机的正常工作。 润滑油粘度过大…

【c语言】自定义类型----结构体

结构体是c语言的一种自定义类型,自定义类型对于开发者及其重要的类型,它可以随意由开发者进行谱写功能,而今天的结构体可以用来表示一种变量的单个或多种具体属性,再编写代码时有着不可替代的作用!!&#x…

Android 代码打印meminfo

旨在替代adb shell dumpsys meminfo packageName,在log打印meminfo,以便分析内存情况 ActivityManager.MemoryInfo memoryInfo new ActivityManager.MemoryInfo(); activityManager.getMemoryInfo(memoryInfo); long totalMemory Runtime.getRuntime(…

绘唐官网绘唐科技

绘唐AI工具是一种基于人工智能技术的绘画辅助工具。 使用教程:https://iimenvrieak.feishu.cn/docx/CWwldSUU2okj0wxmnA0cHOdjnF 它可以根据用户提供的输入或指令生成各种类型的图像。 绘唐AI工具可以理解用户的绘画需求,并根据用户的要求生成具有艺术…

Python爬取与可视化-豆瓣电影数据

引言 在数据科学的学习过程中,数据获取与数据可视化是两项重要的技能。本文将展示如何通过Python爬取豆瓣电影Top250的电影数据,并将这些数据存储到数据库中,随后进行数据分析和可视化展示。这个项目涵盖了从数据抓取、存储到数据可视化的整个…

【python解决】查询报%d format: a number is required, not str问题

【Python解决】查询报%d format: a number is required, not str问题 在Python中,字符串格式化是一种常见的操作,用于创建包含变量的字符串。如果你在使用%操作符进行格式化时遇到了%d format: a number is required, not str的错误,这意味着…

当前主流的App开发技术综述

一、引言 随着移动互联网的蓬勃发展,App(应用程序)已经成为人们日常生活中不可或缺的一部分。无论是社交、购物、娱乐还是工作学习,App都以其便捷、高效和个性化的特点深受用户喜爱。而在这一过程中,App开发技术也在不…

3D39无人机摇杆电位器食用指南

这个摇杆精度会非常的不错,虚位只在后面有一点,当然价格也比较贵。最便宜某宝上也得 ¥15 一个。 使用这个摇杆和使用2块钱一个的 PS 写的代码都一样,只是注意下接线上的一些问题就行。 需要注意两个ADC引脚最好不要挨着&#xf…

加热炉钢坯温度计算传热学应用

非常感谢“计算传热学大叔”,大家了解更多,请移步前期文章:https://blog.csdn.net/weixin_37928884/article/details/127709215 第一类边界条件 clc clear close all %直接在此修改参数 length 0.135; %长度 Tb 930; %初始…

记录一次springboot、ruoyi若依前后端不分离项目和vue项目的合并整合问题,搞了一天总结

项目场景: 因为此功能只做为客户方一个小模块,客户方使用的是springboot前后端不分离的架构。而我们的项目是使用前后端分离springbootvue的架构。在接项目前,项目已经存在,所以不存在设计架构的前提。实际是在原有基础上修改的。…

计算机二级Access操作题总结——简单应用

查询设计 创建一个查询,能够在客人每次结账时根据客人的姓名提示统计这个客人已住天数和应交金额,并显示“姓名”、“房间号”、“已住天数”和“应交金额”,所建查询命名为“qT2”。 注:输入姓名时应提示“请输入姓名”。已住天…