↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

百科 / 逻辑解码插件 / 核心复制

pgoutput

Core replication

PostgreSQL 逻辑复制使用的内置输出插件。

当前查看 PostgreSQL 18.6。

说明

PostgreSQL 逻辑复制使用的内置输出插件。

接口类别
逻辑解码输出插件
处理函数或例程
_PG_output_plugin_init
记录的回调
20
LOGICALREP_PROTO_MIN_VERSION_NUM
1
LOGICALREP_PROTO_VERSION_NUM
1
LOGICALREP_PROTO_STREAM_VERSION_NUM
2
LOGICALREP_PROTO_TWOPHASE_VERSION_NUM
3
LOGICALREP_PROTO_STREAM_PARALLEL_VERSION_NUM
4

接口与能力边界

矩阵记录此源码构建实际注册的回调。注册表明实现了相应接口钩子;操作是否允许还取决于选项、查询形式、权限和提供方规则。

下方保留同版本完整手册,包括配置、约束和示例。不声称已进行运行时能力测试。

输出与协议边界

回调是否存在、协议版本、客户端协商及已启用的插件选项分别记录。流式处理和两阶段处理需要匹配的协议与配置。

test_decoding 是示例/测试输出格式,pgoutput 实现逻辑复制协议,两者的输出约定不可互换。

核心源码中注册的实现

{
	cb->startup_cb = pgoutput_startup;
	cb->begin_cb = pgoutput_begin_txn;
	cb->change_cb = pgoutput_change;
	cb->truncate_cb = pgoutput_truncate;
	cb->message_cb = pgoutput_message;
	cb->commit_cb = pgoutput_commit_txn;

	cb->begin_prepare_cb = pgoutput_begin_prepare_txn;
	cb->prepare_cb = pgoutput_prepare_txn;
	cb->commit_prepared_cb = pgoutput_commit_prepared_txn;
	cb->rollback_prepared_cb = pgoutput_rollback_prepared_txn;
	cb->filter_by_origin_cb = pgoutput_origin_filter;
	cb->shutdown_cb = pgoutput_shutdown;

	/* transaction streaming */
	cb->stream_start_cb = pgoutput_stream_start;
	cb->stream_stop_cb = pgoutput_stream_stop;
	cb->stream_abort_cb = pgoutput_stream_abort;
	cb->stream_commit_cb = pgoutput_stream_commit;
	cb->stream_change_cb = pgoutput_change;
	cb->stream_message_cb = pgoutput_message;
	cb->stream_truncate_cb = pgoutput_truncate;
	/* transaction streaming - two-phase commit */
	cb->stream_prepare_cb = pgoutput_stream_prepare_txn;
}

注册的接口处理函数

接口操作源码观察回调实现
开始事务已注册处理函数;适用条件限制begin_cbpgoutput_begin_txn
行变更已注册处理函数;适用条件限制change_cbpgoutput_change
Commit已注册处理函数;适用条件限制commit_cbpgoutput_commit_txn
TRUNCATE已注册处理函数;适用条件限制truncate_cbpgoutput_truncate
逻辑消息已注册处理函数;适用条件限制message_cbpgoutput_message
开始流式事务已注册处理函数;适用条件限制stream_start_cbpgoutput_stream_start
流式行变更已注册处理函数;适用条件限制stream_change_cbpgoutput_change
准备事务已注册处理函数;适用条件限制prepare_cbpgoutput_prepare_txn
提交已准备事务已注册处理函数;适用条件限制commit_prepared_cbpgoutput_commit_prepared_txn
回滚已准备事务已注册处理函数;适用条件限制rollback_prepared_cbpgoutput_rollback_prepared_txn

手册中的选项

选项同版本定义
proto_version协议版本。目前支持版本 1、2、3 和 4,必须指定有效版本。版本 2 仅在服务器版本 14 及以上支持,可流式传输进行中的大型事务。版本 3 仅在服务器版本 15 及以上支持,可流式传输两阶段提交。版本 4 仅在服务器版本 16 及以上支持,可并行应用进行中的大型事务流。
publication_names要订阅(接收变更)的发布名称列表,以逗号分隔。各个发布名称按标准对象名处理,可按需加引号。至少需要一个发布名称。
二进制使用二进制传输模式的布尔选项。二进制模式比文本模式更快,但稳健性略差。
messages布尔选项,用于启用发送由 pg_logical_emit_message 写入的消息。
streaming启用进行中事务流式传输的选项。可选值为 off (默认)、 on 和 parallel 。 parallel 会在部分消息中附带用于并行化的额外信息。设置为 on 需要最低协议版本 2;设置为 parallel 需要最低协议版本 4。
two_phase启用两阶段事务的布尔选项,要求协议版本至少为 3。
origin按来源发送变更的选项。可选值为 none (仅发送无来源信息的变更)或 any (无论来源均发送)。该选项可用于避免复制节点之间形成循环(同一数据无限复制)。

本构建识别的插件选项名

从选项解析器中提取;仅凭名称无法确定默认值、可接受的取值或协议要求。

源码选项名
二进制
messages
origin
proto_version
publication_names
streaming
two_phase

手册定义

54.5. 逻辑流复制协议

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

逻辑流复制协议构建在物理流复制协议的基本机制之上。

PostgreSQL 的逻辑解码支持输出插件。pgoutput 是内置逻辑复制使用的标准插件。

使用START_REPLICATION命令,pgoutput接受以下选项:

proto_version

协议版本。目前支持的版本有 1、2、3 和 4。必须指定一个有效版本。

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

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

版本 4 仅在服务器版本 16 及以上受支持,允许并行应用进行中的大型事务流。

publication_names

要订阅(接收变更)的发布名称列表,以逗号分隔。各个发布名称按标准对象名处理,可按需加引号。至少需要一个发布名称。

二进制

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

messages

布尔选项,用于启用发送由 pg_logical_emit_message 写入的消息。

streaming

启用进行中事务流式传输的选项。可选值为 off(默认)、on 和 parallel。parallel 会在部分消息中附带用于并行化的额外信息。设置为 on 需要最低协议版本 2;设置为 parallel 需要最低协议版本 4。

two_phase

启用两阶段事务的布尔选项,要求协议版本至少为 3。

origin

按来源发送变更的选项。可选值为 none(仅发送无来源信息的变更)或 any(无论来源均发送)。该选项可用于避免复制节点之间形成循环(同一数据无限复制)。

各种协议消息将在后续小节中分别讨论。每种消息的具体格式见第 54.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 消息。(协议假定客户端能够缓存所需关系的元数据。)

Relation 消息通过 OID 标识列类型。对于内置类型,假定客户端可以在本地查找该类型的 OID,因此无需额外数据。对于非内置类型 OID,会在 Relation 消息之前发送一条 Type 消息,以提供与该 OID 关联的类型名称。因此,需要明确识别关系列类型的客户端应缓存 Type 消息内容,并先检查该缓存中是否已经定义了对应的类型 OID;若没有,再在本地查找该类型 OID。

相关条目

文档与源码

来源构建
版本
18.6
构建
PostgreSQL 18.6 source archive
来源指纹
555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f

版本比较

PostgreSQL 14 → 15: 属性变化。

以下差异保留原始字段名与英文源描述。

--- PostgreSQL 14
+++ PostgreSQL 15
@@ -1,16 +1,21 @@
 {
   "callbacks": {
     "begin_cb": "pgoutput_begin_txn",
+    "begin_prepare_cb": "pgoutput_begin_prepare_txn",
     "change_cb": "pgoutput_change",
     "commit_cb": "pgoutput_commit_txn",
+    "commit_prepared_cb": "pgoutput_commit_prepared_txn",
     "filter_by_origin_cb": "pgoutput_origin_filter",
     "message_cb": "pgoutput_message",
+    "prepare_cb": "pgoutput_prepare_txn",
+    "rollback_prepared_cb": "pgoutput_rollback_prepared_txn",
     "shutdown_cb": "pgoutput_shutdown",
     "startup_cb": "pgoutput_startup",
     "stream_abort_cb": "pgoutput_stream_abort",
     "stream_change_cb": "pgoutput_change",
     "stream_commit_cb": "pgoutput_stream_commit",
     "stream_message_cb": "pgoutput_message",
+    "stream_prepare_cb": "pgoutput_stream_prepare_txn",
     "stream_start_cb": "pgoutput_stream_start",
     "stream_stop_cb": "pgoutput_stream_stop",
     "stream_truncate_cb": "pgoutput_truncate",
@@ -18,7 +23,7 @@
   },
   "options": [
     {
-      "definition": "Protocol version. Currently versions 1 and 2 are supported. A valid version is required. The version 2 is supported only for server version 14 and above, and it allows streaming of large in-progress transactions.",
+      "definition": "Protocol version. Currently versions 1 , 2 , and 3 are supported. A valid version is required. Version 2 is supported only for server version 14 and above, and it allows streaming of large in-progress transactions. Version 3 is supported only for server version 15 and above, and it allows streaming of two-phase commits.",
       "name": "proto_version"
     },
     {
@@ -36,11 +41,16 @@
     {
       "definition": "Boolean option to enable streaming of in-progress transactions. Minimum protocol version 2 is required to turn it on.",
       "name": "streaming"
+    },
+    {
+      "definition": "Boolean option to enable two-phase transactions. Minimum protocol version 3 is required to turn it on.",
+      "name": "two_phase"
     }
   ],
   "protocol_versions": {
     "LOGICALREP_PROTO_MIN_VERSION_NUM": "1",
     "LOGICALREP_PROTO_STREAM_VERSION_NUM": "2",
+    "LOGICALREP_PROTO_TWOPHASE_VERSION_NUM": "3",
     "LOGICALREP_PROTO_VERSION_NUM": "1"
   },
   "source_options": [
@@ -48,6 +58,7 @@
     "messages",
     "proto_version",
     "publication_names",
-    "streaming"
+    "streaming",
+    "two_phase"
   ]
 }

比较已记录的接口与属性,排除来源指纹和构建元数据。某个样本中没有记录,不能据此判断实际引入或移除的版本。

导出 JSON · 返回逻辑解码插件 · 收录范围为 PostgreSQL 10 至 20;最早采样版本不一定是实际引入版本。