51.5. 逻辑流复制协议

51.5.1. 逻辑流复制参数
51.5.2. 逻辑复制协议消息
51.5.3. 逻辑复制协议的消息流

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

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

51.5.1. 逻辑流复制参数

逻辑复制命令START_REPLICATION接受下列参数:

proto_version

协议版本。当前支持版本1

publication_names

要订阅(接收更改)的publication名称列表,用逗号分隔。每一个publication名称个体都被当作一个标准的对象名称,并且可以根据需要加上引号。

51.5.2. 逻辑复制协议消息

协议消息的个体在接下来的小节中讨论。个体的消息在Section 51.9中介绍。

所有的顶层协议消息都以一个消息类型字节开头。虽然被表示为字符代码,但这是一个没有相关编码的有符号字节。

由于流复制协议提供了一个消息长度,因此不需要顶层协议消息在其头部嵌入长度。

51.5.3. 逻辑复制协议的消息流

START_REPLICATION命令和重放进度消息之外,所有信息流的方向都是从后端到前端。

逻辑复制协议会逐个发送事务个体。这意味着在一对Begin消息和Commit消息之间的所有消息都属于同一个事务。

每一个被发送的事务都包含零个或者多个DML消息(插入、更新、删除)。在级联设置的情况下,它还包括Origin消息。Origin消息表示该事务是在不同的复制节点上产生的。由于逻辑复制协议范围内的复制节点可以是任何东西,所以唯一的标识符是源头的名称。其下游的责任是根据需要处理这一信息(如果需要处理)。Origin消息总是在事务中任何DML消息之前被发送。

每个DML消息中都包含一个任意的关系ID,它可以被映射到Relation消息中的一个ID。Relation消息描述给定关系的模式。为一个给定的关系发送Relation消息的时机是:在当前会话中第一次为该关系发送DML消息,或者从上一次该关系的Relation消息以后该关系的定义发生改变。协议假定客户端有能力缓存够用的关系元数据。

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