受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: devel

29.7. 架构 #

逻辑复制采用了与物理流复制类似的架构(见 Section 26.2.5)。它由 walsenderapply 进程实现。walsender 进程会对 WAL 执行逻辑解码(见 Chapter 47),并装载标准逻辑解码输出插件 (pgoutput)。该插件会把从 WAL 中读取到的变更转换为逻辑复制协议 (见 Section 53.5),并按照发布规范过滤数据。 然后,数据会通过流复制协议持续传输给应用工作进程,由它把数据映射到本地表, 并在收到时按正确的事务顺序应用各项变更。

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

逻辑复制应用进程目前只会触发行触发器,不会触发语句触发器。不过,初始表同步的 实现方式类似于 COPY 命令,因此会为 INSERT 同时触发行触发器和语句触发器。

29.7.1. 初始快照 #

对现有订阅表中的初始数据,会取快照并由一种特殊应用进程的并行实例来复制。 这些特殊的应用进程是为每张待同步表启动的专用表同步工作者。每个表同步进程 都会创建自己的复制槽,并复制现有数据。复制一完成,该表内容就会对其他后端可见。 现有数据复制完成后,工作者会进入同步模式,通过标准逻辑复制流式发送在初始数据 复制期间发生的任何变更,使该表与主应用进程达到同步状态。在这一同步阶段, 变更会按照它们在发布端发生的顺序被应用和提交。同步完成后,该表的复制控制权 会交还给主应用进程,之后复制将照常继续。

Note

发布的 publish 参数只影响哪些 DML 操作会被复制。初始数据同步在复制现有表数据时不会考虑该参数。

Note

如果表同步工作者在复制期间失败,应用工作者会检测到这一失败,并重新启动表同步 工作者以继续同步过程。这种行为确保了瞬时错误不会永久破坏复制配置。另见 wal_retrieve_retry_interval

提交更正

如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。