9.3 9.4 9.5 9.6 10 11 12 13 14 Current(15)
阿里云PostgreSQL 问题报告 纠错本页面

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

协议版本。目前支持版本123。需要一个有效的版本。

版本2仅支持服务器版本14及以上,并允许流式传输大型进行中的事务。

版本3仅支持服务器版本15及以上,并允许流式传输两阶段提交。

publication_names

用于订阅(接收更改)的发布名称的逗号分隔列表。各个发布名称被视为标准对象名称,可以根据需要加引号。 至少需要一个发布名称。

binary

使用二进制传输模式的布尔选项。二进制模式比文本模式更快,但略微不够稳健。

messages

启用发送由pg_logical_emit_message编写的消息的布尔选项。

streaming

启用进行中事务的流式传输的布尔选项。需要最低协议版本2才能启用。

two_phase

启用两阶段事务的布尔选项。需要最低协议版本3才能启用。

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。