本节描述逻辑复制协议,这是由 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
写入的消息的布尔选项。
启用进行中事务流式传输的选项。有效值为 off
(默认)、on
和 parallel
。parallel
设置可启用为某些消息发送额外信息以供并行化使用。启用 on
需要最低协议版本 2。对于 parallel
值,需要最低协议版本 4。
启用两阶段提交事务的布尔选项。启用它需要最低协议版本 3。
通过其源发送更改的选项。可能的值为 none
,仅发送没有关联源的更改;或 any
,无论源如何都发送更改。这可用于避免复制节点之间出现循环(同一数据的无限复制)。
各个协议消息将在以下子节中讨论。各个消息在 第 54.9 节 中进行了描述。
所有顶层协议消息都以一个消息类型字节开始。虽然在代码中表示为字符,但这是一个有符号字节,没有相关的编码。
由于流复制协议提供了消息长度,因此不需要顶层协议消息在其头部嵌入长度。
除了 START_REPLICATION
命令和重放进度消息外,所有信息都只从后端流向前端。
逻辑复制协议逐个发送事务。这意味着一对 Begin 和 Commit 消息之间的所有消息都属于同一个事务。同样,一对 Begin Prepare 和 Prepare 消息之间的所有消息也属于同一个事务。它还会在一对 Stream Start 和 Stream Stop 消息之间发送大型进行中事务的更改。此类事务的最后一个流包含 Stream Commit 或 Stream Abort 消息。
每个发送的事务都包含零个或多个 DML 消息(Insert、Update、Delete)。在级联设置的情况下,它还可以包含 Origin 消息。Origin 消息指示事务起源于不同的复制节点。由于在逻辑复制协议的范围内,复制节点几乎可以是任何东西,因此唯一的标识符是 origin 名称。下游负责根据需要(如果需要)处理此信息。Origin 消息始终在事务中的任何 DML 消息之前发送。
每个 DML 消息都包含一个 relation OID,用于标识所操作的发布者的关系。在给定 relation OID 的第一个 DML 消息之前,将发送一个 Relation 消息,描述该关系的模式。之后,如果关系的定义自上次为此关系发送 Relation 消息以来发生了变化,将发送一个新的 Relation 消息。(协议假定客户端能够为所需数量的关系记住此元数据。)
Relation 消息通过 OID 标识列类型。对于内置类型,假定客户端可以在本地查找该类型 OID,因此不需要额外数据。对于非内置类型的 OID,将在 Relation 消息之前发送一个 Type 消息,以提供与该 OID关联的类型名称。因此,需要专门识别关系列类型的客户端应该缓存 Type 消息的内容,并首先查阅该缓存以查看类型 OID 是否已在此定义。如果没有,则在本地查找类型 OID。
如果您在文档中发现任何不正确、与您在使用特定功能时的体验不符或需要进一步说明的内容,请使用 此表格 报告文档问题。