逻辑复制首先复制发布者数据库上的数据快照。一旦完成, 发布者的变化就会实时发送给订阅者。订阅者按照发布者提交的顺序应用数据, 以确保任何单个订阅中的发布的事务一致性。
逻辑复制采用类似于物理流式复制的体系结构(请参见 第 26.2.5 节)。它是通过“walsender” 和“apply”进程实现的。walsender进程启动WAL的逻辑解码 (在第 48 章中描述),并加载标准的逻辑解码插件 (pgoutput)。该插件将从WAL读取的更改转换为逻辑复制协议 (请参阅第 52.5 节), 并根据发布规范过滤数据。然后使用流式复制协议将数据连续传输到应用工作人员, 应用工作人员将数据映射到本地表,并按照正确的事务顺序应用接收到的各个更改。
订阅者数据库上的应用程序始终以session_replication_role
设置为replica
运行,这会对触发器和约束产生通常的影响。
逻辑复制应用程序目前仅触发行触发器,不触发语句触发器。不过,
初始表同步像COPY
命令一样执行,
因此触发了INSERT
的行和语句触发器。
给现有订阅表中的初始数据做快照,并复制到特殊类型的应用程序的并行实例中。 此过程将创建自己的临时复制槽并复制现有数据。一旦现有数据复制完成, 工作人员进入同步模式,通过使用标准逻辑复制, 流式传输在初始数据复制过程中发生的任何变化, 确保表与主应用程序进入同步状态。一旦完成同步, 表的复制的控制权返回到复制继续正常进行的主应用进程。