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

53.9. 逻辑复制消息格式 #

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

开始 #
字节 1('B')

将消息标识为开始消息。

Int64 (XLogRecPtr)

事务的最终 LSN。

Int64 (TimestampTz)

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

Int32 (TransactionId)

事务的 Xid。

消息 #
字节 1('M')

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

Int32 (TransactionId)

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

Int8

标志;要么为 0 表示无标志,要么为 1 表示逻辑解码消息是事务性的。

Int64 (XLogRecPtr)

逻辑解码消息的 LSN。

字符串

逻辑解码消息的前缀。

Int32

内容的长度。

字节n

逻辑解码消息的内容。

提交 #
字节 1('C')

将消息标识为提交消息。

Int8(0)

标志;当前未使用。

Int64 (XLogRecPtr)

提交的 LSN。

Int64 (XLogRecPtr)

事务的结束 LSN。

Int64 (TimestampTz)

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

来源 #
字节 1('O')

将消息标识为来源消息。

Int64 (XLogRecPtr)

源服务器上提交的 LSN。

字符串

来源的名称。

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

关系 #
字节 1('R')

将消息标识为关系消息。

Int32 (TransactionId)

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

Int32 (Oid)

关系的 OID。

字符串

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

字符串

关系名称。

Int8

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

Int16

列数。

接下来,以下消息部分将显示在发布中包含的每个列(生成的列除外)

Int8

列的标志。当前可以是 0 表示无标志,或者 1 表示该列是键的一部分。

字符串

列的名称。

Int32 (Oid)

列的数据类型的 OID。

Int32

列的类型修饰符(atttypmod)。

类型 #
字节 1('Y')

将消息标识为类型消息。

Int32 (TransactionId)

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

Int32 (Oid)

数据类型的 OID。

字符串

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

字符串

数据类型的名称。

插入 #
字节 1('I')

将消息标识为插入消息。

Int32 (TransactionId)

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

Int32 (Oid)

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

字节 1('N')

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

TupleData

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

更新 #
字节 1('U')

将消息标识为更新消息。

Int32 (TransactionId)

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

Int32 (Oid)

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

字节 1('K')

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

字节 1('O')

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

TupleData

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

字节 1('N')

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

TupleData

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

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

删除 #
字节 1('D')

将消息标识为删除消息。

Int32 (TransactionId)

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

Int32 (Oid)

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

字节 1('K')

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

字节 1('O')

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

TupleData

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

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

截断 #
字节 1('T')

将消息标识为截断消息。

Int32 (TransactionId)

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

Int32

关系数

Int8

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

Int32 (Oid)

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

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

流开始 #
字节 1('S')

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

Int32 (TransactionId)

事务的 Xid。

Int8

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

流停止 #
字节 1('E')

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

流提交 #
字节 1('c')

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

Int32 (TransactionId)

事务的 Xid。

Int8(0)

标志;当前未使用。

Int64 (XLogRecPtr)

提交的 LSN。

Int64 (XLogRecPtr)

事务的结束 LSN。

Int64 (TimestampTz)

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

流中止 #
字节 1('A')

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

Int32 (TransactionId)

事务的 Xid。

Int32 (TransactionId)

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

Int64 (XLogRecPtr)

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

Int64 (TimestampTz)

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

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

开始准备 #
字节 1('b')

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

Int64 (XLogRecPtr)

准备的 LSN。

Int64 (XLogRecPtr)

准备的事务的结束 LSN。

Int64 (TimestampTz)

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

Int32 (TransactionId)

事务的 Xid。

字符串

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

准备 #
字节 1('P')

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

Int8(0)

标志;当前未使用。

Int64 (XLogRecPtr)

准备的 LSN。

Int64 (XLogRecPtr)

准备的事务的结束 LSN。

Int64 (TimestampTz)

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

Int32 (TransactionId)

事务的 Xid。

字符串

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

提交准备 #
字节 1('K')

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

Int8(0)

标志;当前未使用。

Int64 (XLogRecPtr)

准备的事务的提交 LSN。

Int64 (XLogRecPtr)

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

Int64 (TimestampTz)

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

Int32 (TransactionId)

事务的 Xid。

字符串

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

回滚准备 #
字节 1('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。

流准备 #
字节 1('p')

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

Int8(0)

标志;当前未使用。

Int64 (XLogRecPtr)

准备的 LSN。

Int64 (XLogRecPtr)

准备的事务的结束 LSN。

Int64 (TimestampTz)

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

Int32 (TransactionId)

事务的 Xid。

字符串

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

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

TupleData #
Int16

列数。

接下来,以下子消息将显示在每个列(生成的列除外)

字节 1('n')

将数据标识为 NULL 值。

字节 1('u')

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

字节 1('t')

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

字节 1('b')

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

Int32

列值的长度。

字节n

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

提交更正

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