2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 11 / 10

29.9. 架构 #

逻辑复制的架构与物理流复制类似(参见 第 26.2.5 节)。它由 walsenderapply 进程实现。walsender 进程启动 WAL 的逻辑解码(参见 第 47 章)并加载标准的逻辑解码输出插件(pgoutput)。该插件将从 WAL 读取的更改转换为逻辑复制协议(参见 第 54.5 节),并根据发布规范过滤数据。然后,数据通过流复制协议连续传输到 apply 工作进程,该工作进程将数据映射到本地表,并按照正确的事务顺序应用接收到的各个更改。

订阅数据库上的 apply 进程始终以 session_replication_role 设置为 replica 来运行。这意味着,默认情况下,触发器和规则在订阅者上不会触发。用户可以选择使用 ALTER TABLE 命令和 ENABLE TRIGGERENABLE RULE 子句来启用表上的触发器和规则。

逻辑复制 apply 进程目前仅触发行级触发器,而不触发语句级触发器。但是,初始表同步的实现类似于 COPY 命令,因此对于 INSERT 会触发行级和语句级触发器。

29.9.1. 初始快照 #

现有已订阅表中的初始数据将被快照化,并以特殊 apply 进程的并行实例进行复制。这些特殊的 apply 进程是专用的表同步工作进程,为每个要同步的表而生成。每个表同步进程将创建自己的复制槽并复制现有数据。复制完成后,表内容将对其他后端可见。一旦现有数据被复制,工作进程将进入同步模式,该模式通过流式传输初始数据复制期间发生的任何更改(使用标准逻辑复制)来确保表与主 apply 进程同步。在此同步阶段,更改的顺序与它们在发布者上发生的顺序相同。同步完成后,表的复制控制权将交还给主 apply 进程,复制将照常继续。

注意

发布(publish)参数仅影响哪些 DML 操作将被复制。在复制现有表数据时,初始数据同步不考虑此参数。

注意

如果在复制过程中表同步工作进程失败,apply 工作进程将检测到失败并重新生成表同步工作进程以继续同步过程。此行为可确保瞬时错误不会永久中断复制设置。另请参见 wal_retrieve_retry_interval

提交更正

如果您在文档中发现任何不正确、与您对特定功能的实际体验不符或需要进一步澄清的内容,请使用 此表单 报告文档问题。