[英]PostgreSQL logical replication not working after added a new table to publication
我是 PostgreSQL 邏輯復制的新手。 我做了測試,在我向發布添加新表后,我發現復制不起作用,直到我重新創建訂閱,我確定重新創建訂閱不是最佳做法,請您告知如何制作訂閱者為新表應用事務?
測試如下:
在主端和復制端創建第一個表:
create table rep_test (a int primary key, b int);
在主端創建發布:
CREATE PUBLICATION rep_test_pub FOR table public.rep_test;
在復制端創建訂閱:
CREATE SUBSCRIPTION rep_test_sub CONNECTION 'host=XXX port=5432 dbname=rocket user=XXX password=XXX' PUBLICATION rep_test_pub WITH (copy_data = false);
測試復制,復制有效。 初級側:
insert into rep_test values (1, 1); insert into rep_test values (2, 1);
復制:
select * from rep_test; *---*---* | a | b | *---*---* | 1 | 1 | | 2 | 1 | *---*---*
在主端和復制端創建一個新表
create table rep_test (a int primary key, b text);
將新表添加到主端的發布
alter publication rep_test_pub add table public.rep_test2;
測試復制,復制不起作用。 基本的:
insert into rep_test values (3, 1); insert into rep_test2 values (1,'text');
復制:
select * from rep_test;
*---*---*
| a | b |
*---*---*
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
*---*---*
select * from rep_test2;
注意: rep_test2
沒有數據,復制沒有復制rep_test2
。
重新啟動復制 postgres,復制仍然不起作用。
刪除並重新創建訂閱,復制工作。
基本的:
truncate table rep_test; truncate table rep_test2;
復制:
drop subscription rep_test_sub;
CREATE SUBSCRIPTION rep_test_sub CONNECTION 'host=XXX port=5432 dbname=rocket user=XXX password=XXX' PUBLICATION rep_test_pub WITH (copy_data = false);
基本的:
insert into rep_test values (1, 1); insert into rep_test2 values (1, 'text');
復制:
select * from rep_test;select * from rep_test2;
*---*---*
| a | b |
*---*---*
| 1 | 1 |
*---*---*
(1 row)
*---*-----*
| a | b |
*---*-----*
| 1 | text|
*---*-----*
(1 row)
重新創建訂閱后復制工作。
您能否告知是否有另一種方法可以使訂閱者將交易應用於新表?
順便說一句,我的版本:
x86_64-pc-linux-gnu 上的 PostgreSQL 12.2,由 gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39) 編譯,64 位
謝謝
在您對訂閱執行 REFRESH PUBLICATION 之前,不會復制新表。
https://www.postgresql.org/docs/current/sql-altersubscription.html
REFRESH PUBLICATION 從發布者獲取丟失的表信息。 這將開始復制自上次調用 REFRESH PUBLICATION 或自 CREATE SUBSCRIPTION 以來添加到訂閱發布的表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.