9.3 9.4 9.5 9.6 10 11 12 13 14 15 Current(16) 17
问题报告 纠错本页面

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

47.8.1. 概述
47.8.2. 警告

47.8.1. 概述 #

逻辑解码可以被用来构建 同步复制方案,该方案具有和流复制的同步复制相同的用户接口。 要这样做,流复制接口(见Section 47.3)必须被用来流式传出数据。 正如流复制客户端所作的一样,逻辑解码的客户端必须发出 后备机状态更新 (F)(见Section 53.4)消息。

Note

一个通过逻辑解码接收更改的同步复制机将工作在一个单一数据库的范围内。 因为与之相反,synchronous_standby_names 当前是服务器范围的,这意味着如果有多于一个数据库被活跃地使用,这种技术将无法正常工作。

47.8.2. 警告 #

在同步复制设置中,如果事务对[user]目录表加了排他锁,可能会发生死锁。 详情请参见Section 47.6.2,了解用户目录表。 这是因为事务的逻辑解码可能会锁定目录表以访问它们。为避免此情况,用户必须 避免对[user]目录表加排他锁。死锁可能通过以下方式发生:

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

  • 在事务中对CLUSTER pg_class执行操作。

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

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

  • 在事务中对[user]目录表执行TRUNCATE操作。

注意,这些命令不仅会导致上述系统目录表死锁,也可能导致其他目录表死锁。