2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 11 / 10

54.9. 逻辑复制消息格式 #

本节描述了每个逻辑复制消息的详细格式。这些消息由复制槽 SQL 接口返回,或由 walsender 发送。对于 walsender,它们被封装在复制协议 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

逻辑解码消息的 prefix。

Int32

content 的长度。

Byten

逻辑解码消息的 content。

Commit #
Byte1('C')

标识消息为 commit 消息。

Int8(0)

标志;目前未使用。

Int64 (XLogRecPtr)

commit 的 LSN。

Int64 (XLogRecPtr)

事务的结束 LSN。

Int64 (TimestampTz)

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

Origin #
Byte1('O')

标识消息为 origin 消息。

Int64 (XLogRecPtr)

源服务器上 commit 的 LSN。

String

源的名称。

请注意,一个事务中可能包含多个 Origin 消息。

Relation #
Byte1('R')

标识消息为 relation 消息。

Int32 (TransactionId)

事务的 Xid (仅当是流式事务时存在)。此字段自协议版本 2 起可用。

Int32 (Oid)

relation 的 OID。

String

Namespace (对于 pg_catalog 为空字符串)。

String

Relation 的名称。

Int8

relation 的 replica identity 设置 (与 pg_class 中的 relreplident 相同)。

Int16

列的数量。

接下来,对于发布中包含的每一列,将出现以下消息部分。

Int8

列的标志。目前可以是 0 (无标志) 或 1 (标记该列是 key 的一部分)。

String

列的名称。

Int32 (Oid)

列数据类型的 OID。

Int32

列的类型修饰符 (atttypmod)。

Type #
Byte1('Y')

标识消息为 type 消息。

Int32 (TransactionId)

事务的 Xid (仅当是流式事务时存在)。此字段自协议版本 2 起可用。

Int32 (Oid)

数据类型的 OID。

String

Namespace (对于 pg_catalog 为空字符串)。

String

数据类型的名称。

Insert #
Byte1('I')

标识消息为 insert 消息。

Int32 (TransactionId)

事务的 Xid (仅当是流式事务时存在)。此字段自协议版本 2 起可用。

Int32 (Oid)

relation 的 OID,对应 relation 消息中的 ID。

Byte1('N')

标识下面的 TupleData 消息为新元组。

TupleData

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

Update #
Byte1('U')

标识消息为 update 消息。

Int32 (TransactionId)

事务的 Xid (仅当是流式事务时存在)。此字段自协议版本 2 起可用。

Int32 (Oid)

relation 的 OID,对应 relation 消息中的 ID。

Byte1('K')

标识下面的 TupleData 子消息为 key。此字段是可选的,仅当 update 更改了 REPLICA IDENTITY 索引所包含的列中的任何数据时存在。

Byte1('O')

标识下面的 TupleData 子消息为旧元组。此字段是可选的,仅当发生 update 的表将 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)

relation 的 OID,对应 relation 消息中的 ID。

Byte1('K')

标识下面的 TupleData 子消息为 key。当发生 delete 的表使用索引作为 REPLICA IDENTITY 时,此字段存在。

Byte1('O')

标识下面的 TupleData 消息为旧元组。当发生 delete 的表将 REPLICA IDENTITY 设置为 FULL 时,此字段存在。

TupleData

根据前面的字段,表示旧元组或主键内容的 TupleData 消息部分。

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

Truncate #
Byte1('T')

标识消息为 truncate 消息。

Int32 (TransactionId)

事务的 Xid (仅当是流式事务时存在)。此字段自协议版本 2 起可用。

Int32

relation 的数量。

Int8

TRUNCATE 的选项位:1 表示 CASCADE,2 表示 RESTART IDENTITY

Int32 (Oid)

relation 的 OID,对应 relation 消息中的 ID。此字段对每个 relation 重复。

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

Stream Start #
Byte1('S')

标识消息为 stream start 消息。

Int32 (TransactionId)

事务的 Xid。

Int8

值为 1 表示这是此 XID 的第一个 stream 片段,0 表示其他 stream 片段。

Stream Stop #
Byte1('E')

标识消息为 stream stop 消息。

Stream Commit #
Byte1('c')

标识消息为 stream commit 消息。

Int32 (TransactionId)

事务的 Xid。

Int8(0)

标志;目前未使用。

Int64 (XLogRecPtr)

commit 的 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)

abort 操作的 LSN,仅当 streaming 设置为 parallel 时存在。此字段自协议版本 4 起可用。

Int64 (TimestampTz)

事务的 abort 时间戳,仅当 streaming 设置为 parallel 时存在。该值是以自 PostgreSQL 纪元 (2000-01-01) 以来的微秒数表示。此字段自协议版本 4 起可用。

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

Begin Prepare #
Byte1('b')

标识消息为 prepared transaction 消息的开始。

Int64 (XLogRecPtr)

prepare 的 LSN。

Int64 (XLogRecPtr)

prepared transaction 的结束 LSN。

Int64 (TimestampTz)

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

Int32 (TransactionId)

事务的 Xid。

String

事务的用户定义 GID。

Prepare #
Byte1('P')

标识消息为 prepared transaction 消息。

Int8(0)

标志;目前未使用。

Int64 (XLogRecPtr)

prepare 的 LSN。

Int64 (XLogRecPtr)

prepared transaction 的结束 LSN。

Int64 (TimestampTz)

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

Int32 (TransactionId)

事务的 Xid。

String

事务的用户定义 GID。

Commit Prepared #
Byte1('K')

标识消息为 prepared transaction commit 消息。

Int8(0)

标志;目前未使用。

Int64 (XLogRecPtr)

prepared transaction commit 的 LSN。

Int64 (XLogRecPtr)

prepared transaction commit 的结束 LSN。

Int64 (TimestampTz)

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

Int32 (TransactionId)

事务的 Xid。

String

事务的用户定义 GID。

Rollback Prepared #
Byte1('r')

标识消息为 prepared transaction rollback 消息。

Int8(0)

标志;目前未使用。

Int64 (XLogRecPtr)

prepared transaction 的结束 LSN。

Int64 (XLogRecPtr)

prepared transaction rollback 的结束 LSN。

Int64 (TimestampTz)

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

Int64 (TimestampTz)

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

Int32 (TransactionId)

事务的 Xid。

String

事务的用户定义 GID。

Stream Prepare #
Byte1('p')

标识消息为 stream prepared transaction 消息。

Int8(0)

标志;目前未使用。

Int64 (XLogRecPtr)

prepare 的 LSN。

Int64 (XLogRecPtr)

prepared transaction 的结束 LSN。

Int64 (TimestampTz)

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

Int32 (TransactionId)

事务的 Xid。

String

事务的用户定义 GID。

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

TupleData #
Int16

列的数量。

接下来,对于每个发布的列,将出现以下子消息之一。

Byte1('n')

标识数据为 NULL 值。

或者

Byte1('u')

标识未更改的 TOASTed 值 (实际值未发送)。

或者

Byte1('t')

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

或者

Byte1('b')

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

Int32

列值的长度。

Byten

列的值,可以是二进制格式或文本格式 (如前面格式字节指定)。n 是上述长度。

提交更正

如果您在文档中发现任何不正确、与您对特定功能的体验不符或需要进一步澄清的内容,请使用此表单报告文档问题。