逻辑解码可用于构建 同步复制方案,其用户接口 与 流复制 的同步复制相同。要做到这一 点,必须使用流复制接口(见 Section 47.3)来流式传出数据。客户端必须像 流复制客户端一样发送 Standby status update (F) 消息(见 Section 54.4)。
通过逻辑解码接收更改的同步副本,只能在单个数据库范围内工作。而与此不同, synchronous_standby_names 当前是整个服务器范围 的,这意味着如果有多个数据库在被活跃使用,这种技术将无法正常工作。
在同步复制设置中,如果事务对 [user] 目录表持有排他锁,就可能发生死锁。 关于用户目录表的信息,见 Section 47.6.2。 这是因为事务的逻辑解码在访问这些目录表时也可能对其加锁。为了避免这种情 况,用户必须避免对 [user] 目录表获取排他锁。这可能通过以下方式发生:
在事务中显式发出 LOCK 命令来锁定 pg_class。
在事务中执行 CLUSTER 命令处理 pg_class。
在发出 PREPARE TRANSACTION 之前,先发出 LOCK 命令锁定 pg_class, 并允许对两阶段事务进行逻辑解码。
在发出 PREPARE TRANSACTION 之前,先用 CLUSTER 命令处理 pg_trigger,并允许对两阶段事务进行逻辑解码。 只有在已发布的表上存在触发器时,这才会导致死锁。
在事务中对 [user] 目录表执行 TRUNCATE。
请注意,这些命令不仅可能对上面列出的系统目录表造成死锁,也可能对其他目 录表造成死锁。
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。