这一节介绍逻辑复制协议,它是一种以复制命令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
写入的消息
的布尔选项。
启用进行中事务流式传输的布尔选项。它接受一个额外的值"parallel", 用于启用发送一些消息的额外信息以用于并行化。启用此选项需要 最低协议版本2。启用"parallel"选项需要最低协议版本4。
启用两阶段事务的布尔选项。启用此选项需要最低协议版本3。
按其来源发送更改的选项。可能的值为"none",仅发送没有关联来源 的更改,或"any",发送所有更改,无论其来源如何。这可以用于避免 复制节点之间的循环(无限复制相同数据)。
协议消息的个体在接下来的小节中讨论。个体的消息在第 55.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消息。(协议假定客户端能够记住所需关系的元数据。)
关系消息通过它们的OID标识列类型。对于内置类型,假定客户端可以在本地查找该类型的OID,因此不需要额外的数据。 对于非内置类型OID,在关系消息之前将发送一个Type消息,以提供与该OID关联的类型名称。 因此,需要明确识别关系列类型的客户端应缓存Type消息的内容,并首先查看该缓存以查看类型OID是否在其中定义。 如果没有,请在本地查找类型OID。