Skip to content

49.8. 逻辑解码的同步复制支持#

49.8.1. 概览
49.8.2. 注意事项

49.8.1. 概览#

逻辑解码可用于构建同步复制解决方案,其用户界面与流复制的同步复制相同。要做到这一点,必须使用流复制接口(参见第 49.3 节)来流出数据。客户端必须发送备用状态更新 (F)(参见第 55.4 节)消息,就像流复制客户端所做的那样。

注意

通过逻辑解码接收更改的同步副本将在单个数据库的范围内工作。由于与之相反,*synchronous_standby_names*目前在服务器范围内,这意味着如果多个数据库正在活动使用,则此技术将无法正常工作。

49.8.2. 注意事项#

在同步复制设置中,如果事务已独占锁定 [用户] 目录表,则可能会发生死锁。有关用户目录表的详细信息,请参见第 49.6.2 节。这是因为事务的逻辑解码可以锁定目录表以访问它们。为避免这种情况,用户必须避免独占锁定 [用户] 目录表。这可以通过以下方式实现

  • 在事务中对 pg_class 发出显式 LOCK

  • 在事务中对 pg_class 执行 CLUSTER

  • 在对 pg_class 执行 LOCK 命令后 PREPARE TRANSACTION,并允许对两阶段事务进行逻辑解码。

  • 在对 pg_trigger 执行 CLUSTER 命令后 PREPARE TRANSACTION,并允许对两阶段事务进行逻辑解码。仅当已发布的表具有触发器时,才会导致死锁。

  • 在事务中对 [用户] 目录表执行 TRUNCATE

请注意,这些可能导致死锁的命令不仅适用于上述明确指示的系统目录表,还适用于任何其他 [用户] 目录表。