PostgreSQL - PUBLICATION 尝试复制另一个数据库中已存在的数据?

Dej*_*jan 1 postgresql replication master-slave-replication postgresql-11

我在一台服务器上有数据库和表 collection_city 。它有 21 行。我在第二台服务器上有数据库和表 collection_city 。它也有 21 行。

他们都有这一行:

tinker=# table collection_city;
 id |     name      |    alias     | postal_code | region_id 
----+---------------+--------------+-------------+-----------
  2 | Obrenovac     | obrenovac    |             |         1
Run Code Online (Sandbox Code Playgroud)

id 列是主键。

我在第一台服务器上创建了发布:

CREATE PUBLICATION tinkerpub FOR ALL TABLES;

tinker=# \dRp[+]
                      Publication tinkerpub
  Owner   | All tables | Inserts | Updates | Deletes | Truncates 
----------+------------+---------+---------+---------+-----------
 postgres | t          | t       | t       | t       | t
(1 row)
Run Code Online (Sandbox Code Playgroud)

我在第二台服务器上创建了订阅:

CREATE SUBSCRIPTION tinkersub CONNECTION 'dbname=tinker host=192.168.150.5 user=postgres password=test port=5432' PUBLICATION tinkerpub;
Run Code Online (Sandbox Code Playgroud)

但我看到这样的错误(它试图再次复制 id 2 的行???):

2019-06-25 15:51:37.178 CEST [2270] ERROR:  duplicate key value violates unique constraint "collection_city_pkey"
2019-06-25 15:51:37.178 CEST [2270] DETAIL:  Key (id)=(2) already exists.
2019-06-25 15:51:37.178 CEST [2270] CONTEXT:  COPY collection_city, line 1
2019-06-25 15:51:37.181 CEST [21905] LOG:  background worker "logical replication worker" (PID 2270) exited with exit code 1
Run Code Online (Sandbox Code Playgroud)

为什么系统试图用完全相同的数据复制已经存在的数据?我看到所有表都有错误。我们如何解决这个问题?在订阅过程之前,第二个表是否应该完全为空?但这没有任何意义...为什么我不应该填充两个表,然后立即开始复制过程?

Lau*_*lbe 5

默认情况下,CREATE SUBSCRIPTION将首先从源表复制所有现有数据。这个想法是,您通常从使用类似pg_restore -s.

如果您不想拥有初始数据副本,请像这样创建订阅:

CREATE SUBSCRIPTION ...
WITH (copy_data = false);
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅文档。