ari*_*ang 2 postgresql subscription logical-replication
我是 PostgreSQL 逻辑复制的新手。我做了测试,在我向发布添加新表后,我发现复制不起作用,直到我重新创建订阅,我确定重新创建订阅不是最佳做法,请您告知如何制作订阅者为新表应用事务?
测试如下:
在主端和复制端创建第一个表:
create table rep_test (a int primary key, b int);
Run Code Online (Sandbox Code Playgroud)
在主端创建发布:
CREATE PUBLICATION rep_test_pub FOR table public.rep_test;
Run Code Online (Sandbox Code Playgroud)
在复制端创建订阅:
CREATE SUBSCRIPTION rep_test_sub CONNECTION 'host=XXX port=5432 dbname=rocket user=XXX password=XXX' PUBLICATION rep_test_pub WITH (copy_data = false);
Run Code Online (Sandbox Code Playgroud)
测试复制,复制有效。初级侧:
insert into rep_test values (1, 1); insert into rep_test values (2, 1);
Run Code Online (Sandbox Code Playgroud)
复制:
select * from rep_test;
*---*---*
| a | b |
*---*---*
| 1 | 1 |
| 2 | 1 |
*---*---*
Run Code Online (Sandbox Code Playgroud)
在主端和复制端创建一个新表
create table rep_test (a int primary key, b text);
Run Code Online (Sandbox Code Playgroud)
将新表添加到主端的发布
alter publication rep_test_pub add table public.rep_test2;
Run Code Online (Sandbox Code Playgroud)
测试复制,复制不起作用。基本的:
insert into rep_test values (3, 1); insert into rep_test2 values (1,'text');
Run Code Online (Sandbox Code Playgroud)
复制:
select * from rep_test;
*---*---*
| a | b |
*---*---*
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
*---*---*
select * from rep_test2;
Run Code Online (Sandbox Code Playgroud)
注意: 中没有数据rep_test2,复制没有复制rep_test2。
重新启动复制 postgres,复制仍然不起作用。
删除并重新创建订阅,复制工作。
基本的:
truncate table rep_test; truncate table rep_test2;
Run Code Online (Sandbox Code Playgroud)
复制:
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);
Run Code Online (Sandbox Code Playgroud)
基本的:
insert into rep_test values (1, 1); insert into rep_test2 values (1, 'text');
Run Code Online (Sandbox Code Playgroud)
复制:
select * from rep_test;select * from rep_test2;
*---*---*
| a | b |
*---*---*
| 1 | 1 |
*---*---*
(1 row)
*---*-----*
| a | b |
*---*-----*
| 1 | text|
*---*-----*
(1 row)
Run Code Online (Sandbox Code Playgroud)
重新创建订阅后复制工作。
您能否告知是否有另一种方法可以使订阅者将交易应用于新表?
顺便说一句,我的版本:
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 以来添加到订阅发布的表。
| 归档时间: |
|
| 查看次数: |
2638 次 |
| 最近记录: |