Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将新表添加到发布后,PostgreSQL逻辑复制无法工作_Postgresql_Subscription_Logical Replication - Fatal编程技术网

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

将新表添加到发布后,PostgreSQL逻辑复制无法工作,postgresql,subscription,logical-replication,Postgresql,Subscription,Logical Replication,我不熟悉PostgreSQL逻辑复制。 我做了测试,在我向发布添加了一个新表之后,我发现复制不起作用,直到我重新创建订阅,我确信重新创建订阅不是最佳做法,您能否建议如何让订阅服务器为新表应用事务 测试如下: 在主端和复制端创建第一个表: create table rep_test (a int primary key, b int); CREATE SUBSCRIPTION rep_test_sub CONNECTION 'host=XXX port=5432 dbname=rocket

我不熟悉PostgreSQL逻辑复制。 我做了测试,在我向发布添加了一个新表之后,我发现复制不起作用,直到我重新创建订阅,我确信重新创建订阅不是最佳做法,您能否建议如何让订阅服务器为新表应用事务

测试如下:

  • 在主端和复制端创建第一个表:

     create table rep_test (a int primary key, b int);
    
     CREATE SUBSCRIPTION rep_test_sub CONNECTION 'host=XXX port=5432 dbname=rocket user=XXX password=XXX' PUBLICATION rep_test_pub WITH (copy_data = false);
    
  • 在主端创建发布:

     CREATE PUBLICATION rep_test_pub FOR table public.rep_test;
    
     insert into rep_test values (1, 1); insert into rep_test values (2, 1);
    
  • 在复制端创建订阅:

     create table rep_test (a int primary key, b int);
    
     CREATE SUBSCRIPTION rep_test_sub CONNECTION 'host=XXX port=5432 dbname=rocket user=XXX password=XXX' PUBLICATION rep_test_pub WITH (copy_data = false);
    
  • 测试复制,复制工作正常。 一次侧:

     CREATE PUBLICATION rep_test_pub FOR table public.rep_test;
    
     insert into rep_test values (1, 1); insert into rep_test values (2, 1);
    
    复制:

     select * from rep_test;
    
     *---*---*
     | a | b |
     *---*---*
     | 1 | 1 |
     | 2 | 1 |
     *---*---*
    
        select * from rep_test;
    
        *---*---*
        | a | b |
        *---*---*
        | 1 | 1 |
        | 2 | 1 |
        | 3 | 1 |
        *---*---*
    
        select * from 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);
    
    select * from rep_test;select * from rep_test2;
     
    *---*---*
    | a | b |
    *---*---*
    | 1 | 1 |
    *---*---*
    (1 row)
    
    *---*-----*
    | a | b   | 
    *---*-----*
    | 1 | text|
    *---*-----*
    (1 row)
    
  • 在主端和复制端创建一个新表

     create table rep_test (a int primary key, b text);
    
  • 将新表添加到主端的发布中

     alter publication rep_test_pub add table public.rep_test2;
    
  • 测试复制,复制不工作。 主要:

  • 复制:

     select * from rep_test;
    
     *---*---*
     | a | b |
     *---*---*
     | 1 | 1 |
     | 2 | 1 |
     *---*---*
    
        select * from rep_test;
    
        *---*---*
        | a | b |
        *---*---*
        | 1 | 1 |
        | 2 | 1 |
        | 3 | 1 |
        *---*---*
    
        select * from 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);
    
    select * from rep_test;select * from rep_test2;
     
    *---*---*
    | a | b |
    *---*---*
    | 1 | 1 |
    *---*---*
    (1 row)
    
    *---*-----*
    | a | b   | 
    *---*-----*
    | 1 | text|
    *---*-----*
    (1 row)
    
    注意:
    rep_test2
    中没有数据,复制没有复制
    rep_test2

  • 重新启动复制postgres,复制仍不工作

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

  • 主要:

    truncate table rep_test; truncate table rep_test2;
    
    insert into rep_test values (1, 1); insert into rep_test2 values (1, 'text');
    
    复制:

     select * from rep_test;
    
     *---*---*
     | a | b |
     *---*---*
     | 1 | 1 |
     | 2 | 1 |
     *---*---*
    
        select * from rep_test;
    
        *---*---*
        | a | b |
        *---*---*
        | 1 | 1 |
        | 2 | 1 |
        | 3 | 1 |
        *---*---*
    
        select * from 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);
    
    select * from rep_test;select * from rep_test2;
     
    *---*---*
    | a | b |
    *---*---*
    | 1 | 1 |
    *---*---*
    (1 row)
    
    *---*-----*
    | a | b   | 
    *---*-----*
    | 1 | text|
    *---*-----*
    (1 row)
    
    主要:

    truncate table rep_test; truncate table rep_test2;
    
    insert into rep_test values (1, 1); insert into rep_test2 values (1, 'text');
    
    复制:

     select * from rep_test;
    
     *---*---*
     | a | b |
     *---*---*
     | 1 | 1 |
     | 2 | 1 |
     *---*---*
    
        select * from rep_test;
    
        *---*---*
        | a | b |
        *---*---*
        | 1 | 1 |
        | 2 | 1 |
        | 3 | 1 |
        *---*---*
    
        select * from 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);
    
    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位


    谢谢

    在您刷新订阅上的发布之前,不会复制新表

    刷新发布从发布服务器获取缺少的表信息。 这将启动已添加到的表的复制 自上次调用刷新后订阅的发布 发布或自创建订阅以来


    在对订阅执行刷新发布之前,不会复制新表

    刷新发布从发布服务器获取缺少的表信息。 这将启动已添加到的表的复制 自上次调用刷新后订阅的发布 发布或自创建订阅以来


    非常感谢你,我错过了。刷新不适用于我我不知道为什么,只删除所有数据并重新创建订阅谢谢你,我错过了。刷新不适用于我我不知道为什么,只删除所有数据并重新创建订阅