我collection_city
在一台服务器上有数据库和表。它有 21 行。我collection_city
在第二台服务器上有数据库和表。它也有 21 行。
他们都有这一行:
tinker=# table collection_city;
id | name | alias | postal_code | region_id
----+---------------+--------------+-------------+-----------
2 | Obrenovac | obrenovac | | 1
该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)
我在第二台服务器上创建了一个订阅:
CREATE SUBSCRIPTION tinkersub CONNECTION 'dbname=tinker host=192.168.150.5 user=postgres password=test port=5432' PUBLICATION tinkerpub WITH (copy_data = false);
我的发布-订阅过程工作正常,但我在某处读到,在这种情况下,从属服务器应该只读用于手动更新。
但是如果我只在订阅服务器上INSERT
为表运行一个命令collection_city
,我可以看到在订阅服务器的表中添加了一个新行,当然它在发布服务器上不存在。
这是正确的行为吗?对于发布服务器以外的所有修改,订阅服务器不应该是只读的吗?
我当然知道发布服务器应该能够在订阅服务器上执行insert
,update
和delete
语句,但是是否也可以INSERT
在订阅服务器上执行手动语句?不应该以某种方式禁用它吗?
使用 PostgreSQL逻辑复制,备用服务器(订阅所在)上的表可用于数据修改。这与物理复制不同,其中备用数据库是主数据库的物理副本,不能直接修改。也许你的困惑起源于此。
虽然您可以修改备用数据库上的表,但这样做不一定是个好主意,因为它会导致复制冲突。但您有责任不执行任何此类操作。