2024年9月26日: PostgreSQL 17 发布!
支持版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不支持的版本:11 / 10

53.5. 逻辑流式复制协议 #

本节介绍逻辑复制协议,它是通过 START_REPLICATION SLOT slot_name LOGICAL 复制命令启动的消息流。

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

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

53.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 的协议才能启用它。需要至少版本 4 的协议才能启用“parallel”选项。

two_phase

布尔选项,用于启用两阶段事务。需要至少版本 3 的协议才能启用它。

origin

选项,用于通过其来源发送更改。可能的值是“none”,只发送没有关联来源的更改,或者“any”,发送所有更改,无论其来源。这可以用来避免复制节点之间的循环(同一数据的无限复制)。

53.5.2. 逻辑复制协议消息 #

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

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

由于流式复制协议提供了一个消息长度,因此顶级协议消息不需要在其头文件中嵌入长度。

53.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。

提交更正

如果您在文档中看到任何不正确的内容、与您对特定功能的体验不符或需要进一步澄清,请使用 此表格 报告文档问题。