本节描述逻辑复制协议,这是由 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",发送所有更改,无论其来源如何。这可以用于避免复制节点之间的循环(相同数据的无限复制)。
各个协议消息将在以下小节中讨论。各个消息在 第 53.9 节中描述。
所有顶级协议消息都以消息类型字节开头。虽然在代码中表示为字符,但这是一个有符号字节,没有关联的编码。
由于流复制协议提供了消息长度,因此顶级协议消息无需在其头部嵌入长度。
除了 START_REPLICATION
命令和重放进度消息之外,所有信息都仅从后端流向前端。
逻辑复制协议逐个发送单独的事务。这意味着 Begin 和 Commit 消息对之间的所有消息都属于同一个事务。类似地,Begin Prepare 和 Prepare 消息对之间的所有消息都属于同一个事务。它还发送 Stream Start 和 Stream Stop 消息对之间的大型正在进行的事务的更改。此类事务的最后一个流包含 Stream Commit 或 Stream Abort 消息。
每个发送的事务都包含零个或多个 DML 消息(Insert、Update、Delete)。在级联设置中,它还可以包含 Origin 消息。Origin 消息表示事务起源于不同的复制节点。由于逻辑复制协议范围内的复制节点几乎可以是任何东西,因此唯一的标识符是源名称。下游有责任根据需要(如果需要)处理此问题。Origin 消息始终在事务中的任何 DML 消息之前发送。
每个 DML 消息都包含一个关系 OID,用于标识执行操作的发布者的关系。在给定关系 OID 的第一个 DML 消息之前,将发送一个 Relation 消息,描述该关系的模式。随后,如果自上次为该关系发送 Relation 消息以来该关系的定义发生了更改,则将发送一个新的 Relation 消息。(该协议假定客户端能够记住所需数量的关系的元数据。)
关系消息通过其 OID 标识列类型。对于内置类型,假定客户端可以在本地查找该类型 OID,因此不需要额外的数据。对于非内置类型 OID,将在 Relation 消息之前发送一个 Type 消息,以提供与该 OID 关联的类型名称。因此,需要专门标识关系列类型的客户端应缓存 Type 消息的内容,并首先查阅该缓存以查看是否在那里定义了类型 OID。如果没有,则在本地查找类型 OID。
如果您在文档中发现任何不正确、与特定功能的使用体验不符或需要进一步澄清的内容,请使用此表单报告文档问题。