52.9. 逻辑复制消息格式

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

Begin

Byte1('B')

将消息标识为开始消息。

Int64

事务的结束LSN。

Int64

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

Int32

事务的Xid。

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

关系的ID。

String

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

String

关系名称。

Int8

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

Int16

列数。

接下来,每列显示以下消息部分:

Int8

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

String

列的名称。

Int32

列的数据类型的ID。

Int32

列的类型修饰符(atttypmod).

Type

Byte1('Y')

将消息标识为类型消息。

Int32

数据类型的ID。

String

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

String

数据类型的名称。

Insert

Byte1('I')

将消息标识为插入消息。

Int32

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

Byte1('N')

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

TupleData

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

Update

Byte1('U')

将消息标识为更新消息。

Int32

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

Byte1('K')

将以下TupleData子消息标识为键。该字段是可选的, 并且只有在更新改变了REPLICA IDENTITY索引一部分的任何一列中的数据时才存在。

Byte1('O')

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

TupleData

TupleData消息部分表示旧元组或主键的内容。 只有在前面的'O'或'K'部分存在时才存在。

Byte1('N')

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

TupleData

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

更新消息可以包含'K'消息部分或者'O'消息部分或者都不包含它们,但不同时包括它们两者。

Delete

Byte1('D')

将消息标识为删除消息。

Int32

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

Byte1('K')

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

Byte1('O')

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

TupleData

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

删除消息可能包含'K'消息部分或'O'消息部分,但不会同时包含这两个部分。

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

TupleData

Int16

列数。

接下来,为每列显示以下子消息之一:

Byte1('n')

将数据标识为NULL值。

或者

Byte1('u')

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

或者

Byte1('t')

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

Int32

列值的长度。

Byten

该列的值,以文本格式显示。(未来版本可能支持其他格式。) n是上面的长度。