本节介绍逻辑复制协议,它是一种以复制命令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(无论来源均发送)。该选项可用于避免复制节点之间形成循环(同一数据无限复制)。
在上述命令中,若参数类型为 boolean,可省略 value 部分;省略等同于指定 TRUE。
各种协议消息将在后续小节中分别讨论。每种消息的具体格式见Section 53.9。
所有顶层协议消息都以一个消息类型字节开头。虽然它通常写作字符代码,但本质上它是一个与任何字符编码无关的有符号字节。
由于流复制协议本身提供了消息长度,因此顶层协议消息无需在其头部内嵌长度字段。
除 START_REPLICATION 命令和重放进度消息之外,所有信息流方向都是从后端到前端。
逻辑复制协议按事务逐个发送数据。这意味着,一对 Begin 与 Commit 消息之间的所有消息都属于同一事务。 同样,一对 Begin Prepare 与 Prepare 消息之间的所有消息也属于同一事务。 对于大型进行中事务,它还会在一对 Stream Start 与 Stream Stop 消息之间发送其更改。 这类事务的最后一个流会包含 Stream Commit 或 Stream Abort 消息。
每个被发送的事务都包含零条或多条 DML 消息(插入、更新、删除)。在级联场景下,它还会包含 Origin 消息。Origin 消息表示该事务产生于另一个复制节点。由于逻辑复制协议中的复制节点可以是任意实现,因此唯一标识符就是该源头的名称。下游是否以及如何处理这一信息,由其自行决定。Origin 消息总是在事务中的任何 DML 消息之前发送。
每条 DML 消息都包含一个关系 OID,用于标识被操作的发布者关系。在某个关系 OID 的第一条 DML 消息之前, 会先发送一条 Relation 消息,描述该关系的模式。之后,如果该关系的定义自上次发送 Relation 消息以来发生了变化, 就会再发送一条新的 Relation 消息。(协议假定客户端能够缓存所需关系的元数据。)
Relation 消息通过 OID 标识列类型。对于内置类型,假定客户端可以在本地查找该类型的 OID,因此无需额外数据。 对于非内置类型 OID,会在 Relation 消息之前发送一条 Type 消息,以提供与该 OID 关联的类型名称。 因此,需要明确识别关系列类型的客户端应缓存 Type 消息内容,并先检查该缓存中是否已经定义了对应的类型 OID; 若没有,再在本地查找该类型 OID。
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。