Skip to content

55.5. 逻辑流复制协议#

55.5.1. 逻辑流复制参数
55.5.2. 逻辑复制协议消息
55.5.3. 逻辑复制协议消息流

本节介绍逻辑复制协议,该协议是通过START_REPLICATION``SLOTslot_nameLOGICAL复制命令启动的消息流。

逻辑流复制协议建立在物理流复制协议的基础之上。

PostgreSQL逻辑解码支持输出插件。pgoutput是用于内置逻辑复制的标准插件。

55.5.1. 逻辑流复制参数#

使用START_REPLICATION命令,pgoutput接受以下选项

proto_version

协议版本。目前支持版本 1234。需要有效的版本。

版本 2 仅支持服务器版本 14 及更高版本,它允许流式传输正在进行的大事务。

版本 3 仅支持服务器版本 15 及更高版本,它允许流式传输两阶段提交。

版本 4 仅支持服务器版本 16 及更高版本,它允许并行应用正在进行的大事务的流。

publication_names

要订阅(接收更改)的发布名称的逗号分隔列表。各个发布名称被视为标准对象名称,并且可以根据需要以相同的方式引用。至少需要一个发布名称。

binary

使用二进制传输模式的布尔选项。二进制模式比文本模式更快,但稍不健壮。

messages

启用发送由 pg_logical_emit_message 编写的消息的布尔选项。

streaming

启用正在进行的事务的流式传输的布尔选项。它接受一个附加值“parallel”以启用发送额外信息,其中一些消息用于并行化。需要最低协议版本 2 才能启用它。对于“parallel”选项,需要最低协议版本 4。

two_phase

启用两阶段事务的布尔选项。需要最低协议版本 3 才能启用它。

origin

按其来源发送更改的选项。可能的值为“none”,仅发送没有关联来源的更改,或“any”,无论其来源如何都发送更改。这可用于避免复制节点之间的循环(同一数据的无限复制)。

55.5.2. 逻辑复制协议消息#

各个协议消息在以下小节中讨论。各个消息在第 55.9 节中描述。

所有顶级协议消息都以消息类型字节开头。虽然在代码中表示为字符,但这是一个带符号的字节,没有关联的编码。

由于流复制协议提供消息长度,因此不需要顶级协议消息在它们的标头中嵌入长度。

55.5.3. 逻辑复制协议消息流#

除了START_REPLICATION命令和重放进度消息之外,所有信息仅从后端流向前端。

逻辑复制协议逐个发送各个事务。这意味着 Begin 和 Commit 消息对之间的所有消息都属于同一事务。类似地,Begin Prepare 和 Prepare 消息对之间的所有消息都属于同一事务。它还发送 Stream Start 和 Stream Stop 消息对之间正在进行的大型事务的更改。此类事务的最后一个流包含 Stream Commit 或 Stream Abort 消息。

每个已发送事务都包含零个或多个 DML 消息(插入、更新、删除)。在级联设置的情况下,它还可以包含 Origin 消息。Origin 消息表示事务起源于不同的复制节点。由于逻辑复制协议范围内的复制节点可以是任何内容,因此唯一的标识符是 Origin 名称。下游负责根据需要(如果需要)处理此问题。Origin 消息始终在事务中的任何 DML 消息之前发送。

每个 DML 消息都包含一个关系 OID,用于标识已执行操作的发行者关系。在针对给定关系 OID 的第一个 DML 消息之前,将发送一个 Relation 消息,描述该关系的架构。随后,如果关系的定义自上次为其发送 Relation 消息后发生更改,则将发送新的 Relation 消息。(该协议假定客户端能够根据需要记住任意多个关系的元数据。)

Relation 消息通过其 OID 标识列类型。如果是内置类型,则假定客户端可以在本地查找该类型 OID,因此不需要其他数据。对于非内置类型 OID,将在 Relation 消息之前发送 Type 消息,以提供与该 OID 关联的类型名称。因此,需要专门标识关系列类型的客户端应缓存 Type 消息的内容,并首先查阅该缓存以查看是否在那里定义了类型 OID。如果没有,则在本地查找类型 OID。