↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4

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

47.8.1. 概述 #

逻辑解码可用于构建同步复制方案,其用户接口与流复制的同步复制相同。要做到这一点,必须使用流复制接口(见第 47.3 节)来流式传出数据。客户端必须像流复制客户端一样发送 Standby status update (F) 消息(见第 54.4 节)。

注意

通过逻辑解码接收更改的同步副本,只能在单个数据库范围内工作。而与此不同,synchronous_standby_names 当前是整个服务器范围的,这意味着如果有多个数据库在被活跃使用,这种技术将无法正常工作。

47.8.2. 注意事项 #

在同步复制设置中,如果事务对目录表(包括用户目录表)持有排他锁,就可能发生死锁。关于用户目录表的信息,见第 47.6.2 节。这是因为事务的逻辑解码在访问这些目录表时也可能对其加锁。为了避免这种情况,用户必须避免对目录表(包括用户目录表)获取排他锁。这可能通过以下方式发生:

  • 在事务中显式发出 LOCK 命令来锁定 pg_class。

  • 在事务中执行 CLUSTER 命令处理 pg_class。

  • 在发出 PREPARE TRANSACTION 之前,先发出 LOCK 命令锁定 pg_class,并允许对两阶段事务进行逻辑解码。

  • 在发出 PREPARE TRANSACTION 之前,先用 CLUSTER 命令处理 pg_trigger,并允许对两阶段事务进行逻辑解码。只有在已发布的表上存在触发器时,这才会导致死锁。

  • 在事务中对目录表(包括用户目录表)执行 TRUNCATE。

请注意,这些命令不仅可能对上面列出的系统目录表造成死锁,也可能对其他目录表造成死锁。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。英文原文本身的问题请通过上游文档表单反馈给 PostgreSQL 文档维护者。