Skip to content

55.9. 逻辑复制消息格式#

本节介绍每条逻辑复制消息的详细格式。这些消息由复制槽 SQL 接口返回,或由 walsender 发送。对于 walsender,它们封装在复制协议 WAL 消息中,如第 55.4 节所述,并且通常遵循与物理复制相同的消息流。

开始 #
Byte1('B')

将消息标识为开始消息。

Int64 (XLogRecPtr)

事务的最终 LSN。

Int64 (TimestampTz)

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

Int32 (TransactionId)

事务的 Xid。

消息 #
Byte1('M')

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

Int32 (TransactionId)

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

Int8

标志;无标志时为 0,逻辑解码消息为事务性时为 1。

Int64 (XLogRecPtr)

逻辑解码消息的 LSN。

字符串

逻辑解码消息的前缀。

Int32

内容长度。

Byten

逻辑解码消息的内容。

提交 #
Byte1('C')

将消息标识为提交消息。

Int8(0)

标志;当前未使用。

Int64 (XLogRecPtr)

提交的 LSN。

Int64 (XLogRecPtr)

事务的结束 LSN。

Int64 (TimestampTz)

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

来源 #
Byte1('O')

将消息标识为来源消息。

Int64 (XLogRecPtr)

来源服务器上提交的 LSN。

字符串

来源名称。

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

关系 #
Byte1('R')

将消息标识为关系消息。

Int32 (TransactionId)

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

Int32 (Oid)

关系的 Oid。

字符串

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

字符串

关系名称。

Int8

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

Int16

列数。

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

Int8

列的标志。当前可以是 0(表示没有标志)或 1(将列标记为键的一部分)。

字符串

列名称。

Int32 (Oid)

列数据类型的 Oid。

Int32

列的类型修饰符(atttypmod)。

类型 #
Byte1('Y')

将消息标识为类型消息。

Int32 (TransactionId)

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

Int32 (Oid)

数据类型的 Oid。

字符串

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

字符串

数据类型名称。

插入 #
Byte1('I')

将消息标识为插入消息。

Int32 (TransactionId)

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

Int32 (Oid)

与关系消息中 ID 对应的关系的 Oid。

Byte1('N')

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

TupleData

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

更新 #
Byte1('U')

将消息标识为更新消息。

Int32 (TransactionId)

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

Int32 (Oid)

与关系消息中 ID 对应的关系的 Oid。

Byte1('K')

将以下 TupleData 子消息标识为键。此字段是可选的,仅当更新更改了 REPLICA IDENTITY 索引中任何列中的数据时才存在。

Byte1('O')

将以下 TupleData 子消息标识为旧元组。此字段是可选的,仅当发生更新的表将 REPLICA IDENTITY 设置为 FULL 时才存在。

TupleData

TupleData 消息部分表示旧元组或主键的内容。仅当存在前面的“O”或“K”部分时才存在。

Byte1('N')

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

TupleData

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

更新消息可能包含“K”消息部分或“O”消息部分,或两者都不包含,但绝不会同时包含两者。

删除 #
Byte1('D')

将消息标识为删除消息。

Int32 (TransactionId)

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

Int32 (Oid)

与关系消息中 ID 对应的关系的 Oid。

Byte1('K')

将以下 TupleData 子消息标识为键。如果发生删除的表使用索引作为 REPLICA IDENTITY,则此字段存在。

Byte1('O')

将以下 TupleData 消息标识为旧元组。如果发生删除的表将 REPLICA IDENTITY 设置为 FULL,则此字段存在。

TupleData

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

删除消息可能包含“K”消息部分或“O”消息部分,但绝不会同时包含两者。

截断 #
Byte1('T')

将消息标识为截断消息。

Int32 (TransactionId)

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

Int32

关系数

Int8

用于 TRUNCATE 的选项位:CASCADE 为 1,RESTART IDENTITY 为 2

Int32 (Oid)

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

以下消息(流开始、流停止、流提交和流中止)自协议版本 2 起可用。

流开始 #
Byte1('S')

将消息标识为流开始消息。

Int32 (TransactionId)

事务的 Xid。

Int8

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

流停止 #
Byte1('E')

将消息标识为流停止消息。

流提交 #
Byte1('c')

将消息标识为流提交消息。

Int32 (TransactionId)

事务的 Xid。

Int8(0)

标志;当前未使用。

Int64 (XLogRecPtr)

提交的 LSN。

Int64 (XLogRecPtr)

事务的结束 LSN。

Int64 (TimestampTz)

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

流中止 #
Byte1('A')

将消息标识为流中止消息。

Int32 (TransactionId)

事务的 Xid。

Int32 (TransactionId)

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

Int64 (XLogRecPtr)

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

Int64 (TimestampTz)

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

以下消息(开始准备、准备、提交已准备、回滚已准备、流准备)自协议版本 3 起可用。

开始准备 #
Byte1('b')

将消息标识为已准备事务消息的开头。

Int64 (XLogRecPtr)

准备的 LSN。

Int64 (XLogRecPtr)

已准备事务的结束 LSN。

Int64 (TimestampTz)

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

Int32 (TransactionId)

事务的 Xid。

字符串

已准备事务的用户定义 GID。

准备 #
Byte1('P')

将消息标识为已准备事务消息。

Int8(0)

标志;当前未使用。

Int64 (XLogRecPtr)

准备的 LSN。

Int64 (XLogRecPtr)

已准备事务的结束 LSN。

Int64 (TimestampTz)

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

Int32 (TransactionId)

事务的 Xid。

字符串

已准备事务的用户定义 GID。

提交已准备 #
Byte1('K')

将消息标识为已准备事务消息的提交。

Int8(0)

标志;当前未使用。

Int64 (XLogRecPtr)

已准备事务提交的 LSN。

Int64 (XLogRecPtr)

已准备事务提交的结束 LSN。

Int64 (TimestampTz)

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

Int32 (TransactionId)

事务的 Xid。

字符串

已准备事务的用户定义 GID。

回滚已准备 #
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。

流准备 #
Byte1('p')

将消息标识为流准备事务消息。

Int8(0)

标志;当前未使用。

Int64 (XLogRecPtr)

准备的 LSN。

Int64 (XLogRecPtr)

已准备事务的结束 LSN。

Int64 (TimestampTz)

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

Int32 (TransactionId)

事务的 Xid。

字符串

已准备事务的用户定义 GID。

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

元组数据 #
Int16

列数。

接下来,对于每一列(生成的列除外),将显示以下子消息之一

Byte1('n')

将数据标识为 NULL 值。

Byte1('u')

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

Byte1('t')

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

Byte1('b')

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

Int32

列值长度。

Byten

列值,采用二进制或文本格式。(如前一个格式字节中指定)。n 为上述长度。