一、逻辑复制部署
主机信息:
IP:Port | 版本号 | 角色 |
---|---|---|
197.0.193.198:26000 | 3.0.0 | 发布端 |
197.0.194.194:26000 | 3.0.0 | 订阅端 |
要求: 迁移dbpaasstoredb库下,schema为cust1的表db2_tbs
1. 修改配置文件
发布节点:
$ vi postgresql.conf
wal_level = logical
max_replication_slots = 8
wal_level:设置成logical才支持逻辑复制
max_replication_slots>=每个节点所需的(物理流复制槽数+逻辑复制槽数)
订阅节点:
$ vi postgresql.conf
wal_level = logical
max_replication_slots = 8
2. 发布节点创建逻辑复制用户
必须具有**REPLICATION,SYSADMIN/OPRADMIN** 权限
openGauss=# CREATE USER repl REPLICATION OPRADMIN LOGIN ENCRYPTED PASSWORD 'xxxxx';
3. 发布节点修改pg_hba.conf文件
host replication repl 0.0.0.0/0 md5
4. 发布节点使用gs_dump导出表结构
openGauss=# gs_dump -p 26000 dbpaasstoredb -t cust1.db2_tbs -s -f db2_tbs.sql -F p
注:逻辑复制不会同步DDL操作和原有数据,需要先将发布端表结构和原有数据迁移到订阅端
5. 发布节点创建发布
dbpaasstoredb=# CREATE PUBLICATION pub1 FOR TABLE db2_tbs ;
CREATE PUBLICATION
查询发布信息
openGauss=# select * from pg_publication;
pubname | pubowner | puballtables | pubinsert | pubupdate | pubdelete
---------+----------+--------------+-----------+-----------+-----------
pub1 | 10 | f | t | t | t
(1 row)
6. 订阅节点上导入表结构
$ gsql -p 26000 -d dbpaasstoredb -f db2_tbs.sql
7. 订阅节点创建加密文件
gs_guc generate -S xxxxx -D $GAUSSHOME/bin -o subscription
8. 订阅节点创建订阅
端口号不能使用主端口,应该使用主端口+1端口,否则会与线程池冲突
CREATE SUBSCRIPTION sub1 CONNECTION 'host=197.0.193.198 port=26001 dbname=dbpaasstoredb user=repl password=xxxxx' PUBLICATION pub1;
9. 查看发布订阅相关信息
发布节点查看发布信息
dbpaasstoredb=# select * from pg_publication;
发布节点上查看复制槽
dbpaasstoredb=# SELECT slot_name,plugin,slot_type,database,active,restart_lsn FROM pg_replication_slots where slot_name='sub1';
订阅节点上查看订阅信息
dbpaasstoredb=# select * from pg_subscription;
订阅节点已经在同步数据
二、逻辑复制添加表、删除表
添加表
1. 发布端和订阅端分别创建同名表表结构
openGauss=# CREATE TABLE TEST2(id int,name varchar);
CREATE TABLE
2. 发布端添加test2表至pub2
openGauss=# ALTER PUBLICATION pub2 ADD TABLE TEST2;
3. 发布端添加数据
openGauss=# INSERT INTO test2 VALUES(1,'A');
INSERT 0 1
openGauss=# INSERT INTO test2 VALUES(2,'B');
INSERT 0 1
openGauss=# SELECT * FROM test2;
id | name
----+------
1 | A
2 | B
(2 rows)
4. 订阅端查看数据
删除表
1. 查看此时pub2中发布的表
openGauss=# select * from pg_publication_tables where pubname='pub2';
2. 如果test2表不需要逻辑同步,只需要在发布节点将test2表从发布pub2中去掉即可
# ALTER PUBLICATION pub2 DROP TABLE test2;
此时两个节点的test2表为独立的表
数据不会同步
发布端插入一条数据:
订阅端未同步:
三、逻辑复制激活、停止
激活
1. 创建一个订阅,并且不开始复制直到稍后启用复制。
openGauss=# CREATE SUBSCRIPTION sub3 CONNECTION 'host=197.0.193.198 port=26001 dbname=postgres user=repl password=xxxxx' PUBLICATION pub2 WITH (enabled = false);
2. 发布端插入数据
3. 订阅端查看数据并未同步
4. 订阅端激活订阅
openGauss=# ALTER SUBSCRIPTION sub3 SET(enabled=true);
5. 发布端插入数据
6. 订阅端同步新增数据
停止
未提供此功能,因为停止后会导致发布端逻辑复制槽无法推进,导致xlog堆积,风险较大,所以暂不提供此功能
四、分区表测试
范围分区
1. 分别在发布端,订阅端创建Range分区表表结构
CREATE TABLE staffS_p1
(
staff_ID NUMBER(6) not null,
HIRE_DATE DATE
)
PARTITION BY RANGE (HIRE_DATE)
(
PARTITION HIRE_19950501 VALUES LESS THAN ('1995-05-01 00:00:00'),
PARTITION HIRE_19950502 VALUES LESS THAN ('1995-05-02 00:00:00'),
PARTITION HIRE_19950503 VALUES LESS THAN ('1995-05-03 00:00:00')
);
2. 发布端将staffS_p1表添加至已有的part发布中
openGauss=# alter publication part add table staffs_p1 ;
ALTER PUBLICATION
3. 发布端插入数据
openGauss=# insert into staffS_p1 values (1,'1995-04-01 00:00:00');
INSERT 0 1
4. 订阅端查看,数据已同步
5. 发布端添加分区
openGauss=# alter table staffS_p1 add PARTITION HIRE_19950504 VALUES LESS THAN ('1995-05-04 00:00:00');
6. 订阅端查看
新添加的分区不会同步
间隔分区
1. 分别在发布端,订阅端创建Interval分区表表结构
CREATE TABLE sales
(prod_id NUMBER(6),
time_id DATE
)
PARTITION BY RANGE (time_id)
INTERVAL('1 day')
( PARTITION p1 VALUES LESS THAN ('2019-02-01 00:00:00'),
PARTITION p2 VALUES LESS THAN ('2019-02-02 00:00:00')
);
2. 发布端将staffS_p1表添加至已有的part发布中
openGauss=# alter publication part add table sales ;
ALTER PUBLICATION
3. 发布端插入数据
openGauss=# insert into sales values (1,'1995-04-01 00:00:00');
INSERT 0 1
openGauss=# insert into sales values (2,'2000-04-01 00:00:00');
INSERT 0 1
4. 订阅端查看(只能同步不超过创建的分区范围的数据)
官方手册显示,目前不支持interval partition表复制
列表分区
1. 分别在发布端,订阅端创建List分区表表结构
CREATE TABLE test_list (col1 int, col2 int)
partition by list(col1)
(
partition p1 values (2000),
partition p2 values (3000),
partition p3 values (4000),
partition p4 values (5000)
);
2. 发布端将test_list表添加至已有的part发布中
openGauss=# alter publication part add table test_list ;
ALTER PUBLICATION
3. 发布端插入数据
openGauss=# insert into test_list values (2000,2000);
INSERT 0 1
openGauss=# insert into test_list values (3000,3000);
INSERT 0 1
4. 订阅端查看,数据已同步
5. 发布端添加分区
openGauss=# alter table test_list add PARTITION p5 VALUES (6000);
6. 订阅端查看
哈希分区
1. 分别在发布端,订阅端创建Hash分区表表结构
CREATE TABLE test_hash (col1 int, col2 int)
partition by hash(col1)
(
partition p1,
partition p2
);
2. 发布端将test_hash表添加至已有的part发布中
openGauss=# alter publication part add table test_hash ;
ALTER PUBLICATION
3. 发布端插入数据
4. 订阅端查看
数据已同步
五、注意事项
摘自官方手册:
- 不支持DDL语句解码,在执行特定的DDL语句(如普通表truncate或分区表exchange)时,可能造成解码数据丢失。
- 不支持列存、数据页复制的解码。
- 不支持级联备机进行逻辑解码。
- 当执行DDL语句(如alter table)后,该DDL语句前尚未解码的物理日志可能会丢失。单条元组大小不超过1GB,考虑解码结果可能大于插入数据,因此建议单条元组大小不超过500MB。
- openGauss支持解码的数据类型为:INTEGER、BIGINT、SMALLINT、TINYINT、SERIAL、SMALLSERIAL、BIGSERIAL、FLOAT、DOUBLE PRECISION、DATE、TIME[WITHOUT TIME ZONE]、TIMESTAMP[WITHOUT TIME ZONE]、CHAR(n)、VARCHAR(n)、TEXT。
- 如果需要ssl连接需要保证前置条件GUC参数ssl=on。
- 逻辑复制槽名称必须小于64个字符,且只包含小写字母、数字或者下划线中的一种或几种。
- 当前逻辑复制不支持MOT特性。
- 当逻辑复制槽所在数据库被删除后,这些复制槽变为不可用状态,需要用户手动删除。
- 仅支持utf-8字符集。
- 对多库的解码需要分别在库内创建流复制槽并开始解码,每个库的解码都需要单独扫一遍日志。
- 不支持强起,强起后需要重新全量导出数据。
- 备机解码时,switchover和failover时可能出现解码数据变多,需用户手动过滤。Quorum协议下,switchover和failover选择升主的备机,需要与当前主机日志同步。不允许主备,多个备机同时使用同一个复制槽解码,否则会产生数据不一致。
- 只支持主机创建删除复制槽。
- 数据库故障重启或逻辑复制进程重启后,解码数据存在重复,用户需自己过滤。
- 计算机内核故障后,解码存在乱码,需手动或自动过滤。
- 当前备机逻辑解码,不支持开启极致RTO。
- 请确保在创建逻辑复制槽过程中长事务未启动,启动长事务会阻塞逻辑复制槽的创建。
- 不支持interval partition表复制。
- 不支持全局临时表。
- 在事务中执行DDL语句后,该DDL语句与之后的语句不会被解码。
- 如需进行备机解码,需在对应主机上设置guc参数enable_slot_log = on。
- 禁止在使用逻辑复制槽时在其他节点对该复制槽进行操作,删除复制槽的操作需在该复制槽停止解码后执行。