9.3 9.4 9.5 9.6 10 11 12 13 14 15 Current(16) 17
问题报告 纠错本页面

55.5. 逻辑流复制协议 #

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

这一节介绍逻辑复制协议,它是一种以复制命令START_REPLICATION SLOT slot_name LOGICAL开始的消息流。

逻辑流复制协议建立在物理流复制协议的原始积累之上。

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消息总是在事务中任何DML消息之前被发送。

每个DML消息都包含一个关系OID,用于标识被操作的发布者关系。在给定关系OID的第一个DML消息之前, 将发送一个Relation消息,描述该关系的模式。随后,如果关系的定义自上次为其发送Relation消息以来发生了变化, 将发送一个新的Relation消息。(协议假定客户端能够记住所需关系的元数据。)

关系消息通过它们的OID标识列类型。对于内置类型,假定客户端可以在本地查找该类型的OID,因此不需要额外的数据。 对于非内置类型OID,在关系消息之前将发送一个Type消息,以提供与该OID关联的类型名称。 因此,需要明确识别关系列类型的客户端应缓存Type消息的内容,并首先查看该缓存以查看类型OID是否在其中定义。 如果没有,请在本地查找类型OID。