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
内容长度。
- Byte
n
逻辑解码消息的内容。
- 提交 #
- 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
列值长度。
- Byte
n
列值,采用二进制或文本格式。(如前一个格式字节中指定)。
n
为上述长度。