适用范围
openGauss5.0 / MogDB 5.0
问题概述
逻辑复制从openGauss 3.0开始支持,但双向订阅发布下会存在循环复制的问题。
PostgreSQL 16可以区分数据变化是由用户的SQL语句或replication复制引起,在创建订阅时可设置发布端不发布replication复制源,从而避免陷入复制循环。参考语法如下:
B节点:
create subscription... publication... with(origin='none');
A节点:
create subscription... publication... with(origin='none',copy_data=false);
而openGauss 5.0也直接解决了循环复制的问题,不需要设置任何参数。
循环复制问题验证
在openGauss 5.0单机环境下使用两个不同的端口号模拟两个节点。
initdb -D pgdata1610 -W
initdb -D pgdata1620 -W
上面初始化了1610节点和1620节点,配置参数如下:
wal_level=logical
password_policy = 0
password_encryption_type = 0
port=1610/1620
pg_hba.conf文件增加如下设置:
host replication all 127.0.0.1/32 md5
同时创建repuser如下:
CREATE USER repuser REPLICATION SYSADMIN PASSWORD 'XXX';
1610节点发布数据到1620节点
1610节点创建表结构及发布
create table public.tab1(id int primary key,info varchar);
create publication mypub_in_1610 for table public.tab1;
1620节点创建表结构及订阅
create table public.tab1(id int primary key,info varchar);
create subscription mysub_in_1620
connection 'host=127.0.0.1 port=1611 user=repuser password=XXX dbname=postgres' publication mypub_in_1610 ;
注意上面的端口需要使用replication加1端口1611(1610+1),否则使用1610主端口会出现如下错误:
WARNING: apply worker could not connect to the remote server
ERROR: Failed to connect to publisher.
1620节点发布数据到1610节点
1620节点发布
create publication mypub_in_1620 for table public.tab1;
1610节点创建订阅
create subscription mysub_in_1610
connection 'host=127.0.0.1 port=1621 user=repuser password=XXX dbname=postgres' publication mypub_in_1620 ;
同样需要注意端口需要使用replication加1端口1621(1620+1)。
并且需要配置完双向订阅与发布后,再进行数据操作。