逻辑复制的架构与物理流复制类似(参见 第 26.2.5 节)。它由 walsender
和 apply
进程实现。walsender 进程启动 WAL 的逻辑解码(参见 第 47 章)并加载标准的逻辑解码输出插件(pgoutput
)。该插件将从 WAL 读取的更改转换为逻辑复制协议(参见 第 54.5 节),并根据发布规范过滤数据。然后,数据通过流复制协议连续传输到 apply 工作进程,该工作进程将数据映射到本地表,并按照正确的事务顺序应用接收到的各个更改。
订阅数据库上的 apply 进程始终以 session_replication_role
设置为 replica
来运行。这意味着,默认情况下,触发器和规则在订阅者上不会触发。用户可以选择使用 ALTER TABLE
命令和 ENABLE TRIGGER
和 ENABLE RULE
子句来启用表上的触发器和规则。
逻辑复制 apply 进程目前仅触发行级触发器,而不触发语句级触发器。但是,初始表同步的实现类似于 COPY
命令,因此对于 INSERT
会触发行级和语句级触发器。
现有已订阅表中的初始数据将被快照化,并以特殊 apply 进程的并行实例进行复制。这些特殊的 apply 进程是专用的表同步工作进程,为每个要同步的表而生成。每个表同步进程将创建自己的复制槽并复制现有数据。复制完成后,表内容将对其他后端可见。一旦现有数据被复制,工作进程将进入同步模式,该模式通过流式传输初始数据复制期间发生的任何更改(使用标准逻辑复制)来确保表与主 apply 进程同步。在此同步阶段,更改的顺序与它们在发布者上发生的顺序相同。同步完成后,表的复制控制权将交还给主 apply 进程,复制将照常继续。
发布(publish
)参数仅影响哪些 DML 操作将被复制。在复制现有表数据时,初始数据同步不考虑此参数。
如果在复制过程中表同步工作进程失败,apply 工作进程将检测到失败并重新生成表同步工作进程以继续同步过程。此行为可确保瞬时错误不会永久中断复制设置。另请参见 wal_retrieve_retry_interval
。
如果您在文档中发现任何不正确、与您对特定功能的实际体验不符或需要进一步澄清的内容,请使用 此表单 报告文档问题。