PostgreSQL 逻辑复制消息格式
这一节介绍每一种逻辑复制消息的详细格式。这些消息会通过复制槽的SQL接口返回或者由walsender发送。在由walsender发送的情况下,它们被封装在第 52.4 节中所述的复制协议WAL消息中,并且通常服从和物理复制相同的消息流。
- 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消息部分表示旧元组或主键的内容。仅当之前的'0'或'K'部分存在时才存在。
- Byte1('N')
-
标识接下来的TupleData消息是一个新元组。
- TupleData
-
TupleData消息部分表示一个新元组的内容。
Update消息可能包含一个'K'消息部分或者一个'O'消息部分,或者两者都不包含,但是绝不会同时包含两者。
- Delete
-
- Byte1('D')
-
标识该消息是一个删除消息。
- Int32
-
对应于关系消息中的ID的关系的ID。
- Byte1('K')
-
标识接下来的TupleData子消息是一个键。如果发生删除的表正好用一个索引作为REPLICA IDENTITY,那么就会存在这个字段。
- Byte1('O')
-
标识接下来的TupleData子消息为一个旧元组。这个字段是可选的并且仅当发生删除的表的REPLICA IDENTITY被设置为FULL时才存在。
- TupleData
-
TupleData消息部分表示旧元组或主键的内容,取决于前面的字段。
Delete消息可能包含一个'K'消息部分或者一个'O'消息部分,或者两者都不包含,但是绝不会同时包含两者。
- Truncate
-
- Byte1('T')
-
标识该消息是一个截断消息。
- Int32
-
关系的数目。
- Int8
-
TRUNCATE
的选项位:1表示CASCADE
,2表示RESTART IDENTITY
- Int32
-
对应于关系消息中的ID的关系的ID。这个字段会为每个关系重复出现。
下面的消息部分由上面的消息共享。
- TupleData
-
- Int16
-
列数。
接下来,为每一列会有下列子消息之一出现(生成的列除外):
- Byte1('n')
-
标识该数据为NULL值。
或者
- Byte1('u')
-
标识未更改的被TOAST过的值(实际值没有被发送)。
或者
- Byte1('t')
-
标识数据为文本格式化的值。
- Int32
-
列值的长度。
-
Byte
n
-
该列的值的文本格式(未来的发行可能会支持额外的格式)。
n
是上面的长度。