我在一台服务器上有数据库和表 collection_city。它有 21 行。我在第二台服务器上有数据库和表 collection_city。它也有 21 行。
他们都有这一行:
tinker=# table collection_city;
id | name | alias | postal_code | region_id
----+---------------+--------------+-------------+-----------
2 | Obrenovac | obrenovac | | 1
id 列是主键。
我在第一台服务器上创建了 Publication:
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)
我在第二台服务器上创建了订阅:
CREATE SUBSCRIPTION tinkersub CONNECTION 'dbname=tinker host=192.168.150.5 user=postgres password=test port=5432' PUBLICATION tinkerpub;
但是我看到这样的错误(它试图再次复制 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
为什么系统试图用完全相同的数据复制已经存在的数据?我看到所有表的错误。我们如何解决这个问题?在订阅过程之前,第二个表是否应该完全为空?但它没有任何意义......为什么我不应该同时填充两个表然后开始复制过程?
默认情况下,
CREATE SUBSCRIPTION
将首先从源表中复制所有现有数据。这个想法是,您通常从一个空的目标数据库开始,该数据库是用pg_restore -s
.如果您不想拥有初始数据副本,请像这样创建订阅:
有关详细信息,请参阅文档。