本节介绍逻辑复制协议,该协议是通过 START_REPLICATION
SLOT
slot_name
LOGICAL
复制命令启动的消息流程。
逻辑流复制协议建立在物理流复制协议的原语之上。
PostgreSQL 逻辑解码支持输出插件。 pgoutput
是用于内置逻辑复制的标准插件。
使用 START_REPLICATION
命令,pgoutput
接受以下选项
协议版本。目前支持版本 1
、2
、3
和 4
。需要有效的版本。
版本 2
仅适用于服务器版本 14 及更高版本,它允许流式传输大型正在进行的事务。
版本 3
仅适用于服务器版本 15 及更高版本,它允许流式传输两阶段提交。
版本 4
仅适用于服务器版本 16 及更高版本,它允许并行应用大型正在进行的事务的流。
要订阅(接收更改)的发布名称用逗号分隔的列表。各个发布名称被视为标准对象名称,并且可以根据需要以相同的方式引用。至少需要一个发布名称。
使用二进制传输模式的布尔选项。二进制模式比文本模式更快,但鲁棒性略差。
启用发送 pg_logical_emit_message
编写的消息的布尔选项。
启用正在进行的事务流的布尔选项。它接受附加值“parallel”以启用发送额外信息,以及用于并行化的一些消息。需要最低协议版本 2 才能启用它。“parallel”选项需要最低协议版本 4。
启用两阶段事务的布尔选项。需要最低协议版本 3 才能启用它。
通过它们的来源发送更改的选项。可能的值是“none”,仅发送没有关联的来源的更改,或者“any”,无论其来源如何都发送更改。这可用于避免复制节点之间的循环(相同数据的无限复制)。
各个协议消息将在以下小节中进行讨论。各个消息在 53.9 节 中进行描述。
所有顶级协议消息都以消息类型字节开头。尽管在代码中表示为字符,但这实际上是一个带符号的字节,不带任何关联的编码。
因为流复制协议提供消息长度,所以顶级协议消息不需要在其头文件中嵌入长度。
除了 START_REPLICATION
命令和重放进度消息,所有信息都仅从后端流向前端。
逻辑复制协议逐个发送独立事务。这意味着一个开始和提交消息对之间所有的消息都属于同一事务。同样地,一个开始准备和准备消息对之间所有的消息都属于同一事务。它还在一个流开始和一个流结束消息对之间发送正在处理的大事务的更改。此类事务的最后一个流包含一个流提交或流中止消息。
每个已发送事务包含 0 个以上的 DML 消息(插入、更新、删除)。在级联设置的情况下,它还可能包含来源消息。来源消息表明事务从不同的复制节点发起。由于在逻辑复制协议的范围内复制节点可能是任意内容,因此唯一标识符就是来源名称。由下游负责根据需要(如果需要)处理此问题。来源消息总是先于事务中的任何 DML 消息发送。
每个 DML 消息都包含一个关系 OID,用于标识被操作的发布者的关系。对于给定关系 OID 的第一个 DML 消息之前,将发送一个关系消息,其中描述了该关系的架构。随后,如果该关系的定义自上次发送关系消息以来已更改,则将发送新的关系消息。(该协议假设客户端能够为主 relations as needed 记住这些元数据。)
关系消息通过其 OID 标识列类型。对于内置类型,假定客户端可以在本地查找该类型 OID,因此不需要其他数据。对于非内置类型 OID,将先于关系消息发送类型消息,提供与此 OID 关联的类型名称。因此,需要专门标识关系列类型的客户端应该缓存类型消息的内容,并首先咨询该缓存,以查看是否在此处定义了类型 OID。如果没有,则在本地查找类型 OID。