逻辑解码可以被用来构建 同步复制方案,该方案具有和流复制的同步复制相同的用户接口。
要这样做,流复制接口(见第 49.3 节)必须被用来流式传出数据。
正如流复制客户端所作的一样,逻辑解码的客户端必须发出 后备机状态更新 (F)
(见第 53.4 节)消息。
一个通过逻辑解码接收更改的同步复制机将工作在一个单一数据库的范围内。
因为与之相反,synchronous_standby_names
当前是服务器范围的,这意味着如果有多于一个数据库被活跃地使用,这种技术将无法正常工作。
在同步复制设置中,死锁可能发生,如果事务排它地锁定了[user]目录表的话。 有关用户目录表的信息,参见第 49.6.2 节。 这是因为事务的逻辑解码可以锁定目录表以便访问它们。 为了避免这种情况,用户必须避免对[user]目录表执行排它锁。 这可以通过以下方式发生:
在事务中,在pg_class
上发出显式LOCK
。
在事务中,在pg_class
上执行 CLUSTER
。
在pg_class
上LOCK
命令之后的PREPARE TRANSACTION
,并且允许对两阶段事务的逻辑解码。
在pg_trigger
上的CLUSTER
命令之后的PREPARE TRANSACTION
,并且允许对两阶段事务的逻辑解码。
只有在发布的表有触发器时,这将会导致死锁。
在事务中,在[user]目录表上执行TRUNCATE
。
注意,这些可能导致死锁的命令,不仅适用于上面显式标示的系统目录表,而且还适用于任何其他[user]目录表。