在向发布添加新表后,PostgreSQL逻辑复制无法工作

3

我是PostgreSQL逻辑复制的新手。

我进行了测试,当我向发布中添加一个新表后,我发现复制不起作用,直到我重新创建订阅,我确定重新创建订阅不是最佳实践,请问如何使订阅者应用新表的事务?

以下是测试内容:

  1. Create the first table on primary and replicate side:

     create table rep_test (a int primary key, b int);
    
  2. Create publication on primary side:

     CREATE PUBLICATION rep_test_pub FOR table public.rep_test;
    
  3. Create subscription on replicate side:

     CREATE SUBSCRIPTION rep_test_sub CONNECTION 'host=XXX port=5432 dbname=rocket user=XXX password=XXX' PUBLICATION rep_test_pub WITH (copy_data = false);
    
  4. Test the replication, the replication works. Primary side:

     insert into rep_test values (1, 1); insert into rep_test values (2, 1);
    

    Replicate:

     select * from rep_test;
    
     *---*---*
     | a | b |
     *---*---*
     | 1 | 1 |
     | 2 | 1 |
     *---*---*
    
  5. Create a new table on both primary and replicate side

     create table rep_test (a int primary key, b text);
    
  6. Add new table to publication on primary side

     alter publication rep_test_pub add table public.rep_test2;
    
  7. Test the replication, the replication is not working. Primary:

     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

  1. 重启复制postgres,复制仍然不起作用。

  2. 删除并重新创建订阅,复制正常工作。

主数据库:

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)

重新创建订阅后,复制功能将正常工作。

请问是否有其他方法可以使订阅者将事务应用于新表?

顺便提一下,我的版本是:

PostgreSQL 12.2 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39), 64-bit

谢谢!

1个回答

11
只有在执行“REFRESH PUBLICATION”命令后,新表才会被复制到订阅服务器上。
参考链接:https://www.postgresql.org/docs/current/sql-altersubscription.html

REFRESH PUBLICATION:从发布服务器获取缺失的表信息。这将启动对自上次调用“REFRESH PUBLICATION”或“CREATE SUBSCRIPTION”以来添加到所订阅出版物的表的复制。


非常感谢,我错过了那个。 - aris yang
刷新对我不起作用,我不知道为什么,只能删除所有数据并重新创建订阅。 - Sultan Zhumatayev
@arisyang 如果这个回答解决了你的问题,请接受答案。 - AATHITH RAJENDRAN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接