逻辑复制从拷贝发布者数据库上的数据库快照开始。拷贝一旦完成,发布者上的更改会在它们发生时实时传送给订阅者。订阅者按照数据在发布者上被提交的顺序应用数据,这样任意单一订阅中的publication的事务一致性才能得到保证。
逻辑复制被构建在一种类似于物理流复制(见Section 26.2.5)的架构上。它由“walsender”和“apply”进程实现。walsender进程开始对WAL的逻辑解码(在Chapter 49中描述)并且载入标准逻辑解码插件(pgoutput)。该插件把从WAL中读取的更改转换成逻辑复制协议(见Section 53.5)并且根据publication说明过滤数据。然后数据会被连续地使用流复制协议传输到应用工作者,应用工作者会把数据映射到本地表并且以正确的事务顺序应用它们接收到的更改。
订阅者数据库上的应用进程总是将session_replication_role
设置为replica
运行,这会产生触发器和约束上通常的效果。
逻辑复制应用进程当前仅会引发行触发器,而不会引发语句触发器。不过,初始的表同步是以类似一个COPY
命令的方式实现的,因此会引发INSERT
的行触发器和语句触发器。
已有的被订阅表中的初始数据会被快照并且以一种特殊类型的应用进程的并行实例进行拷贝。这种进程将创建自己的临时复制槽并且拷贝现有的数据。一旦现有的数据被拷贝完,工作者会进入到同步模式,主应用进程会流式传递在使用标准逻辑复制拷贝初始数据期间发生的任意改变,这会确保表被带到一种已同步的状态。一旦同步完成,该表的复制的控制权会被交回给主应用进程,其中复制会照常继续。