0

注意:有人问过类似的问题,但这里没有回答:如何在 postgresql 中复制单个模式?

我正在尝试使用 pglogical 将 postgresql (13) 数据库中的一个模式复制到另一台服务器。

在提供程序节点上的测试设置中,我有 2 个模式“共享”和“非共享”。

在订阅者节点上,我有一个名为“not_shared”的现有模式。

我想将“共享”从提供者复制到订阅者,我已经在两台服务器上设置了节点。

在提供者上,我为名为“shared_repl”的“共享”模式(理论上)创建了一个复制集:

select pglogical.create_replication_set('shared_repl', true, true, true, true );
SELECT pglogical.replication_set_add_all_tables('shared_repl', '{shared}'::text[]);

在订阅者上,我创建了对“shared_repl”复制集的订阅:

SELECT pglogical.create_subscription(
    subscription_name := 'shared',
    provider_dsn := 'host=providerhost port=5432 dbname=db user=myuser password=mypassword',
    replication_sets := '{shared_repl}'::text[], synchronize_structure := TRUE
);

查看此订阅显示为“关闭”的状态:

select * from pglogical.show_subscription_status();

查看日志,我看到如下内容:

pg_restore: while PROCESSING TOC:
pg_restore: from TOC entry 5; 2615 16863 SCHEMA not_shared myuser
pg_restore: error: could not execute query: ERROR:  schema "not_shared" already exists
Command was: CREATE SCHEMA not_shared;

那么,当我专门只选择了“共享”模式时,为什么要尝试复制“not_shared”模式呢?

我在这里做错了什么还是 pglogical 不能只复制一个模式?

如果 pglogical 不允许这样做,是否还有其他选项可以复制,包括结构,postgresql 中的一个模式?

谢谢。

4

1 回答 1

1

synchronize_structure 只是不做你想做的事。您可以自己将一个模式的结构从提供者复制到订阅者,例如使用,然后在创建订阅时pg_dump -n shared -s不要指定。synchronize_structure := TRUE

于 2020-12-05T02:16:57.460 回答