PostgreSQL 13: 邏輯復制支持分區表
PostgreSQL 10 版本開始支持邏輯復制,在12版本之前邏輯復制僅支持普通表,不支持分區表,如果需要對分區表進行邏輯復制,需單獨對所有分區進行邏輯復制。
PostgreSQL 13 版本的邏輯復制新增了對分區表的支持,如下:
- 可以顯式地發布分區表,自動發布所有分區。
- 從分區表中添加/刪除分區將自動從發布中添加/刪除。
發行說明的解釋如下:
發行說明
Allow partitioned tables to be logically replicated via publications (Amit Langote)
Previously, partitions had to be replicated individually. Now partitioned tables can be published explicitly causing all partitions to be automatically published. Addition/removal of partitions from partitioned tables are automatically added/removed from publications. The CREATE PUBLICATION option publish_via_partition_root controls whether changes to partitions are published as their own or their ancestors.
Allow logical replication into partitioned tables on subscribers (Amit Langote)
Previously, subscribers could only receive rows into non-partitioned tables.
關於邏輯復制之前博客有介紹,詳見PostgreSQL10:邏輯復制(Logical Replication)之一,本文僅做簡單演示。
環境規划
環境規划,如下:
節點 | 數據庫版本 | IP | 端口 |
---|---|---|---|
源庫 | PostgreSQL 13beta1 | 192.168.2.11 | 1922 |
目標庫 | PostgreSQL 13beta1 | 192.168.2.13 | 1924 |
環境准備
在源庫、目標庫安裝 PostgreSQL 13beta1軟件並初始化數據庫,本文略。
部署mydb數據庫
在源庫和目標庫上均部署 mydb 數據庫,如下:
1 |
--建用戶 |
創建分區表
在源庫和目標庫上創建分區表,如下:
1 |
--創建父表 |
部署邏輯復制
源庫執行以下操作,如下:
1 |
--創建復制用戶 |
以上有個步驟是給源庫上的repuser用戶賦相關權限,如果不給repuser用戶賦權,創建訂閱后目標庫無法初始化同步源庫數據。
目標庫創建訂閱,如下:
1 |
mydb=# CREATE SUBSCRIPTION sub1 CONNECTION 'host=192.168.2.11 port=1922 dbname=mydb user=repuser' PUBLICATION pub1; |
注意配置好源庫的pg_hba.conf
和.pgpass
文件,否則創建訂閱會報相關的連接不上錯誤。
數據驗證
源庫批量插入數據,如下:
1 |
INSERT INTO tbl_log(user_id,create_time) |
源庫查看數據,如下:
1 |
[pg13@ydtf01 ~]$ psql mydb pguser -p 1922 |
目標庫驗證數據,如下:
1 |
[pg13@ydtf03 ~]$ psql mydb pguser -p 1924 |
可見分區表的數據已從源庫同步到目標庫。