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)
为什么系统试图用完全相同的数据复制已经存在的数据?我看到所有表都有错误。我们如何解决这个问题?在订阅过程之前,第二个表是否应该完全为空?但这没有任何意义...为什么我不应该填充两个表,然后立即开始复制过程?
默认情况下,CREATE SUBSCRIPTION将首先从源表复制所有现有数据。这个想法是,您通常从使用类似pg_restore -s.
如果您不想拥有初始数据副本,请像这样创建订阅:
CREATE SUBSCRIPTION ...
WITH (copy_data = false);
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅文档。
| 归档时间: |
|
| 查看次数: |
2603 次 |
| 最近记录: |