本节描述逻辑复制协议,它是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
命令和重放进度消息之外,所有信息都仅从后端流向前端。
逻辑复制协议逐个发送单个事务。这意味着一对 Begin 和 Commit 消息之间的所有消息都属于同一事务。类似地,一对 Begin Prepare 和 Prepare 消息之间的所有消息都属于同一事务。它还在一对 Stream Start 和 Stream Stop 消息之间发送大型进行中事务的更改。此类事务的最后一个流包含 Stream Commit 或 Stream Abort 消息。
每个发送的事务都包含零个或多个 DML 消息(Insert、Update、Delete)。在级联设置中,它还可以包含 Origin 消息。Origin 消息指示该事务起源于不同的复制节点。由于逻辑复制协议范围内的复制节点几乎可以是任何东西,因此唯一的标识符是源名称。下游有责任根据需要处理此信息(如果需要)。Origin 消息始终在事务中的任何 DML 消息之前发送。
每个 DML 消息都包含一个关系 OID,标识已对其执行操作的发布者的关系。在给定关系 OID 的第一个 DML 消息之前,将发送一个 Relation 消息,描述该关系的架构。随后,如果关系定义自上次发送该关系的 Relation 消息以来已更改,则将发送新的 Relation 消息。(该协议假设客户端能够记住尽可能多的关系的此元数据。)
Relation 消息通过其 OID 标识列类型。在内置类型的情况下,假定客户端可以在本地查找该类型 OID,因此不需要其他数据。对于非内置类型 OID,将在 Relation 消息之前发送 Type 消息,以提供与该 OID 关联的类型名称。因此,需要专门识别关系列类型的客户端应缓存 Type 消息的内容,并首先查阅该缓存以查看是否已在此处定义该类型 OID。如果没有,则在本地查找类型 OID。
如果您在文档中看到任何不正确的内容、与特定功能的体验不符或需要进一步澄清的内容,请使用此表单报告文档问题。