支持的版本: 当前 (17) / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 11 / 10

53.9. 逻辑复制消息格式 #

本节描述每个逻辑复制消息的详细格式。这些消息要么由复制槽 SQL 接口返回,要么由 walsender 发送。在 walsender 的情况下,它们被封装在复制协议 WAL 消息中,如 第 53.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。

字符串

逻辑解码消息的前缀。

Int32

内容的长度。

Byten

逻辑解码消息的内容。

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。

字符串

origin 的名称。

请注意,在单个事务中可以有多个 Origin 消息。

Relation #
Byte1('R')

标识消息为 relation 消息。

Int32 (TransactionId)

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

Int32 (Oid)

关系的 OID。

字符串

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

字符串

关系名称。

Int8

关系的副本标识设置 (与 relreplidentpg_class 中相同)。

Int16

列数。

接下来,对于发布中包含的每一列(除了生成的列),会出现以下消息部分

Int8

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

字符串

列的名称。

Int32 (Oid)

列的数据类型的 OID。

Int32

列的类型修饰符 (atttypmod)。

Type #
Byte1('Y')

标识消息为 type 消息。

Int32 (TransactionId)

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

Int32 (Oid)

数据类型的 OID。

字符串

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

字符串

数据类型的名称。

Insert #
Byte1('I')

标识消息为 insert 消息。

Int32 (TransactionId)

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

Int32 (Oid)

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

Byte1('N')

标识以下 TupleData 消息为新元组。

TupleData

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

Update #
Byte1('U')

标识消息为 update 消息。

Int32 (TransactionId)

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

Int32 (Oid)

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

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)

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

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)

与 relation 消息中的 ID 对应的关系的 OID。此字段针对每个关系重复。

以下消息(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)

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)

中止的 LSN。此字段自协议版本 4 起可用。

Int64 (TimestampTz)

事务的中止时间戳。该值是自 PostgreSQL 纪元 (2000-01-01) 以来的微秒数。此字段自协议版本 4 起可用。

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

Begin Prepare #
Byte1('b')

标识消息为预备事务消息的开始。

Int64 (XLogRecPtr)

准备的 LSN。

Int64 (XLogRecPtr)

预备事务的结束 LSN。

Int64 (TimestampTz)

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

Int32 (TransactionId)

事务的 Xid。

字符串

预备事务的用户定义 GID。

Prepare #
Byte1('P')

标识消息为预备事务消息。

Int8(0)

标志;当前未使用。

Int64 (XLogRecPtr)

准备的 LSN。

Int64 (XLogRecPtr)

预备事务的结束 LSN。

Int64 (TimestampTz)

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

Int32 (TransactionId)

事务的 Xid。

字符串

预备事务的用户定义 GID。

Commit Prepared #
Byte1('K')

标识消息为预备事务消息的提交。

Int8(0)

标志;当前未使用。

Int64 (XLogRecPtr)

预备事务提交的 LSN。

Int64 (XLogRecPtr)

预备事务提交的结束 LSN。

Int64 (TimestampTz)

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

Int32 (TransactionId)

事务的 Xid。

字符串

预备事务的用户定义 GID。

Rollback Prepared #
Byte1('r')

标识消息为预备事务消息的回滚。

Int8(0)

标志;当前未使用。

Int64 (XLogRecPtr)

预备事务的结束 LSN。

Int64 (XLogRecPtr)

预备事务回滚的结束 LSN。

Int64 (TimestampTz)

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

Int64 (TimestampTz)

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

Int32 (TransactionId)

事务的 Xid。

字符串

预备事务的用户定义 GID。

Stream Prepare #
Byte1('p')

标识消息为流式预备事务消息。

Int8(0)

标志;当前未使用。

Int64 (XLogRecPtr)

准备的 LSN。

Int64 (XLogRecPtr)

预备事务的结束 LSN。

Int64 (TimestampTz)

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

Int32 (TransactionId)

事务的 Xid。

字符串

预备事务的用户定义 GID。

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

TupleData #
Int16

列数。

接下来,对于每一列(除了生成的列),会出现以下子消息之一

Byte1('n')

标识数据为 NULL 值。

Byte1('u')

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

Byte1('t')

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

Byte1('b')

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

Int32

列值的长度。

Byten

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

提交更正

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