这一节介绍逻辑复制协议,它是一种以复制命令START_REPLICATION
SLOT
slot_name
LOGICAL
开始的消息流。
逻辑流复制协议建立在物理流复制协议的原始积累之上。
逻辑复制命令START_REPLICATION
接受下列参数:
协议版本。当前支持版本1
。
要订阅(接收更改)的publication名称列表,用逗号分隔。每一个publication名称个体都被当作一个标准的对象名称,并且可以根据需要加上引号。
协议消息的个体在接下来的小节中讨论。个体的消息在Section 51.9中介绍。
所有的顶层协议消息都以一个消息类型字节开头。虽然被表示为字符代码,但这是一个没有相关编码的有符号字节。
由于流复制协议提供了一个消息长度,因此不需要顶层协议消息在其头部嵌入长度。
除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。