↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10
预发布版本文档。 PostgreSQL 19beta4 为测试版本,最终发布内容可能有所不同。

54.9. 逻辑复制消息格式 #

本节描述了每个逻辑复制消息的详细格式。这些消息要么由复制槽 SQL 接口返回,要么由 WAL 发送进程发送。对于 WAL 发送进程,它们被封装在复制协议 WAL 消息中,如第 54.4 节所述,并且通常遵循与物理复制相同的消息流程。

Begin #
Byte1('B') #

将该消息标识为 Begin 消息。

Int64 (XLogRecPtr) #

事务的最终 LSN。

Int64 (TimestampTz) #

事务的提交时间戳。其值为自 PostgreSQL 纪元(2000-01-01)起经过的微秒数。

Int32 (TransactionId) #

事务的 Xid。

Message #
Byte1('M') #

将消息标识为逻辑解码消息。

Int32 (TransactionId) #

事务的 Xid(仅在流式传输的事务中出现)。此字段从协议版本 2 起可用。

Int8 #

标志:0 表示没有标志;1 表示该逻辑解码消息是事务性的。

Int64 (XLogRecPtr) #

逻辑解码消息的 LSN。

String #

逻辑解码消息的前缀。

Int32 #

内容的长度。

Byten #

逻辑解码消息的内容。

Commit #
Byte1('C') #

将该消息标识为 Commit 消息。

Int8(0) #

标志;目前未使用。

Int64 (XLogRecPtr) #

提交的 LSN。

Int64 (XLogRecPtr) #

事务的结束 LSN。

Int64 (TimestampTz) #

事务的提交时间戳。其值为自 PostgreSQL 纪元(2000-01-01)起经过的微秒数。

Origin #
Byte1('O') #

将该消息标识为 Origin 消息。

Int64 (XLogRecPtr) #

源服务器上提交的 LSN。

String #

复制源的名称。

注意,单个事务中可能有多条 Origin 消息。

Relation #
Byte1('R') #

将该消息标识为 Relation 消息。

Int32 (TransactionId) #

事务的 Xid(仅在流式传输的事务中出现)。此字段从协议版本 2 起可用。

Int32 (Oid) #

关系的 OID。

String #

命名空间(对于 pg_catalog 为空字符串)。

String #

关系名称。

Int8 #

关系的复制标识设置(与 pg_class 中的 relreplident 相同)。

Int16 #

列数。

接下来,发布中包含的每一列都会出现以下消息部分:

Int8 #

列的标志。目前可以为 0,表示没有标志;或为 1,标记该列是键的一部分。

String #

列的名称。

Int32 (Oid) #

列数据类型的 OID。

Int32 #

列的类型修饰符(atttypmod)。

Type #
Byte1('Y') #

将该消息标识为 Type 消息。

Int32 (TransactionId) #

事务的 Xid(仅在流式传输的事务中出现)。此字段从协议版本 2 起可用。

Int32 (Oid) #

数据类型的 OID。

String #

命名空间(对于 pg_catalog 为空字符串)。

String #

数据类型的名称。

Insert #
Byte1('I') #

将该消息标识为 Insert 消息。

Int32 (TransactionId) #

事务的 Xid(仅在流式传输的事务中出现)。此字段从协议版本 2 起可用。

Int32 (Oid) #

关系的 OID,与 Relation 消息中的 ID 对应。

Byte1('N') #

将后续 TupleData 消息标识为新元组。

TupleData #

表示新元组内容的 TupleData 消息部分。

Update #
Byte1('U') #

将该消息标识为 Update 消息。

Int32 (TransactionId) #

事务的 Xid(仅在流式传输的事务中出现)。此字段从协议版本 2 起可用。

Int32 (Oid) #

关系的 OID,与 Relation 消息中的 ID 对应。

Byte1('K') #

将后续 TupleData 子消息标识为键。此字段可选,仅在更新更改了属于 REPLICA IDENTITY 索引的某一列或多列的数据时出现。

Byte1('O') #

将后续 TupleData 子消息标识为旧元组。此字段可选,仅在发生更新的表将 REPLICA IDENTITY 设为 FULL 时出现。

TupleData #

表示旧元组或主键内容的 TupleData 消息部分。仅在前面的'O'或'K'部分存在时出现。

Byte1('N') #

将后续 TupleData 消息标识为新元组。

TupleData #

表示新元组内容的 TupleData 消息部分。

Update 消息可以包含 'K' 消息部分或 'O' 消息部分,也可以两者都不包含,但绝不会同时包含两者。

Delete #
Byte1('D') #

将该消息标识为 Delete 消息。

Int32 (TransactionId) #

事务的 Xid(仅在流式传输的事务中出现)。此字段从协议版本 2 起可用。

Int32 (Oid) #

关系的 OID,与 Relation 消息中的 ID 对应。

Byte1('K') #

将后续 TupleData 子消息标识为键。如果发生删除的表使用索引作为 REPLICA IDENTITY,则出现此字段。

Byte1('O') #

将后续 TupleData 消息标识为旧元组。如果发生删除的表将 REPLICA IDENTITY 设为 FULL,则出现此字段。

TupleData #

表示旧元组或主键内容的 TupleData 消息部分,具体取决于前一个字段。

Delete 消息可以包含 'K' 消息部分或 'O' 消息部分,但绝不会同时包含两者。

Truncate #
Byte1('T') #

将该消息标识为 Truncate 消息。

Int32 (TransactionId) #

事务的 Xid(仅在流式传输的事务中出现)。此字段从协议版本 2 起可用。

Int32 #

关系数量

Int8 #

选项位用于 TRUNCATE 命令:1 表示 CASCADE,2 表示 RESTART IDENTITY

Int32 (Oid) #

关系的 OID,与 Relation 消息中的 ID 对应。每个关系都重复出现此字段。

以下消息(Stream Start、Stream Stop、Stream Commit 和 Stream Abort)自协议版本 2 起可用。

Stream Start #
Byte1('S') #

将该消息标识为 Stream Start 消息。

Int32 (TransactionId) #

事务的 Xid。

Int8 #

值为 1 表示这是该 XID 的第一个流段,值为 0 表示其他任何流段。

Stream Stop #
Byte1('E') #

将该消息标识为 Stream Stop 消息。

Stream Commit #
Byte1('c') #

将该消息标识为 Stream Commit 消息。

Int32 (TransactionId) #

事务的 Xid。

Int8(0) #

标志;目前未使用。

Int64 (XLogRecPtr) #

提交的 LSN。

Int64 (XLogRecPtr) #

事务的结束 LSN。

Int64 (TimestampTz) #

事务的提交时间戳。其值为自 PostgreSQL 纪元(2000-01-01)起经过的微秒数。

Stream Abort #
Byte1('A') #

将该消息标识为 Stream Abort 消息。

Int32 (TransactionId) #

事务的 Xid。

Int32 (TransactionId) #

子事务的 Xid(对于顶层事务,将与事务的 xid 相同)。

Int64 (XLogRecPtr) #

中止操作的 LSN,仅当 streaming 设置为 parallel 时出现。此字段从协议版本 4 起可用。

Int64 (TimestampTz) #

事务的中止时间戳,仅当 streaming 设置为 parallel 时出现。该值为自 PostgreSQL 纪元(2000-01-01)以来的微秒数。此字段从协议版本 4 起可用。

以下消息(Begin Prepare、Prepare、Commit Prepared、Rollback Prepared、Stream Prepare)自协议版本 3 起可用。

Begin Prepare #
Byte1('b') #

将该消息标识为 Begin Prepare 消息。

Int64 (XLogRecPtr) #

PREPARE 的 LSN。

Int64 (XLogRecPtr) #

预备事务的结束 LSN。

Int64 (TimestampTz) #

事务进入预备状态的时间戳。其值为自 PostgreSQL 纪元(2000-01-01)起经过的微秒数。

Int32 (TransactionId) #

事务的 Xid。

String #

预备事务的用户定义 GID。

Prepare #
Byte1('P') #

将该消息标识为 Prepare 消息。

Int8(0) #

标志;目前未使用。

Int64 (XLogRecPtr) #

PREPARE 的 LSN。

Int64 (XLogRecPtr) #

预备事务的结束 LSN。

Int64 (TimestampTz) #

事务进入预备状态的时间戳。其值为自 PostgreSQL 纪元(2000-01-01)起经过的微秒数。

Int32 (TransactionId) #

事务的 Xid。

String #

预备事务的用户定义 GID。

Commit Prepared #
Byte1('K') #

将该消息标识为 Commit Prepared 消息。

Int8(0) #

标志;目前未使用。

Int64 (XLogRecPtr) #

预备事务提交的 LSN。

Int64 (XLogRecPtr) #

预备事务提交的结束 LSN。

Int64 (TimestampTz) #

事务的提交时间戳。其值为自 PostgreSQL 纪元(2000-01-01)起经过的微秒数。

Int32 (TransactionId) #

事务的 Xid。

String #

预备事务的用户定义 GID。

Rollback Prepared #
Byte1('r') #

将该消息标识为 Rollback Prepared 消息。

Int8(0) #

标志;目前未使用。

Int64 (XLogRecPtr) #

预备事务的结束 LSN。

Int64 (XLogRecPtr) #

回滚预备事务的结束 LSN。

Int64 (TimestampTz) #

事务进入预备状态的时间戳。其值为自 PostgreSQL 纪元(2000-01-01)起经过的微秒数。

Int64 (TimestampTz) #

事务的回滚时间戳。该值是自 PostgreSQL 纪元(2000-01-01)以来的微秒数。

Int32 (TransactionId) #

事务的 Xid。

String #

预备事务的用户定义 GID。

Stream Prepare #
Byte1('p') #

将该消息标识为 Stream Prepare 消息。

Int8(0) #

标志;目前未使用。

Int64 (XLogRecPtr) #

PREPARE 的 LSN。

Int64 (XLogRecPtr) #

预备事务的结束 LSN。

Int64 (TimestampTz) #

事务进入预备状态的时间戳。其值为自 PostgreSQL 纪元(2000-01-01)起经过的微秒数。

Int32 (TransactionId) #

事务的 Xid。

String #

预备事务的用户定义 GID。

以上消息共享以下消息部分。

TupleData #
Int16 #

列数。

接下来,每个已发布的列都会出现以下子消息之一:

Byte1('n') #

将该数据标识为 NULL 值。

或者

Byte1('u') #

标识经过 TOAST 处理且未更改的值(不发送实际值)。

或者

Byte1('t') #

将该数据标识为文本格式的值。

或者

Byte1('b') #

将该数据标识为二进制格式的值。

Int32 #

列值的长度。

Byten #

列值,采用二进制或文本格式(由前面的格式字节指定)。n 为上述长度。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.