一、邏輯復制部署
主機信息:
| 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。
- 禁止在使用邏輯復制槽時在其他節點對該復制槽進行操作,刪除復制槽的操作需在該復制槽停止解碼后執行。




