9.3 9.4 9.5 9.6 10 11 12 13 14 Current(15)
阿里云PostgreSQL 问题报告 纠错本页面

53.9. 逻辑复制消息格式

这一节介绍每一种逻辑复制消息的详细格式。这些消息会通过复制槽的SQL接口返回或者由walsender发送。在由walsender发送的情况下,它们被封装在第 53.4 节中所述的复制协议WAL消息中,并且通常服从和物理复制相同的消息流。

Begin

Byte1('B')

标识该消息是一个开始消息。

Int64

该事务的最终LSN。

Int64

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

Int32

事务的XID。

Message

Byte1('M')

逻辑解码消息的标识符。

Int32

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

Int8

标识:逻辑解码消息的flags。它可以是0表示没有flags,或者1表示逻辑解码消息是事务性的。

Int64

逻辑解码消息的LSN。

String

逻辑解码消息的前缀。

Int32

内容的长度。

Byten

逻辑解码消息的内容。

Commit

Byte1('C')

标识该消息是一个提交消息。

Int8

标志,当前未使用(必须为0)。

Int64

提交的LSN。

Int64

该事务的结束LSN。

Int64

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

Origin

Byte1('O')

标识该消息是一个源头消息。

Int64

源头服务器上的提交LSN。

String

源头的名称。

注意在一个单一事务中可能有多个Origin消息。

Relation

Byte1('R')

标识该消息是一个关系消息。

Int32

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

Int32

关系的ID。

String

名字空间(pg_catalog是空字符串)。

String

关系名。

Int8

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

Int16

列数。

接下来,会为每一列出现下面的消息部分(生成的列除外):

Int8

该列的标志。当前可以是0(无标志)或者1(标记该列为键的一部分)。

String

列的名称。

Int32

列的数据类型的ID。

Int32

列的类型修饰符(atttypmod)。

Type

Byte1('Y')

标识该消息是一个类型消息。

Int32

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

Int32

数据类型的ID。

String

名字空间(pg_catalog的是空字符串)。

String

数据类型的名称。

Insert

Byte1('I')

标识该消息是一个插入消息。

Int32

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

Int32

对应于关系消息中的ID的关系的ID。

Byte1('N')

标识接下来的TupleData消息是一个新元组。

TupleData

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

Update

Byte1('U')

标识该消息是一个更新消息。

Int32

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

Int32

对应于关系消息中的ID的关系的ID。

Byte1('K')

标识接下来的TupleData子消息为一个键。这个字段是可选的并且仅当任意列中被更新更改的数据是REPLICA IDENTITY索引的一部分时才存在。

Byte1('O')

标识接下来的TupleData子消息为一个旧元组。这个字段是可选的并且仅当发生更新的表的REPLICA IDENTITY被设置为FULL时才存在。

TupleData

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

Byte1('N')

标识接下来的TupleData消息是一个新元组。

TupleData

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

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

Delete

Byte1('D')

标识该消息是一个删除消息。

Int32

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

Int32

对应于关系消息中的ID的关系的ID。

Byte1('K')

标识接下来的TupleData子消息是一个键。如果发生删除的表正好用一个索引作为REPLICA IDENTITY,那么就会存在这个字段。

Byte1('O')

标识接下来的TupleData子消息为一个旧元组。这个字段是可选的并且仅当发生删除的表的REPLICA IDENTITY被设置为FULL时才存在。

TupleData

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

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

Truncate

Byte1('T')

标识该消息是一个截断消息。

Int32

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

Int32

关系的数目。

Int8

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

Int32

对应于关系消息中的ID的关系的ID。这个字段会为每个关系重复出现。

以下的消息(Stream Start、Stream Stop、Stream Commit 和 Stream Abort)可用于协议版本 2 以后。

Stream Start

Byte1('S')

将消息标识为流启动消息。

Int32

该事务的Xid。

Int8

数值为1表示这是该XID的第一个流段,数值为0表示其他流段。

Stream Stop

Byte1('E')

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

Stream Commit

Byte1('c')

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

Int32

该事务的Xid。

Int8

标识; 当前未使用(必须为0)。

Int64

该提交的LSN 。

Int64

该事务的结束LSN。

Int64

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

Stream Abort

Byte1('A')

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

Int32

事务的 Xid。

Int32

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

下面的消息部分由上面的消息共享。

TupleData

Int16

列数。

接下来,为每一列会有下列子消息之一出现(生成的列除外):

Byte1('n')

标识该数据为NULL值。

或者

Byte1('u')

标识未更改的被TOAST过的值(实际值没有被发送)。

或者

Byte1('t')

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

Int32

列值的长度。

Byten

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