53.9. 逻辑复制消息格式 #
本节描述了每个逻辑复制消息的详细格式。这些消息要么由复制槽 SQL 接口返回,要么由 WAL 发送进程发送。对于 WAL 发送进程,它们被封装在复制协议 WAL 消息中,如第 53.4 节所述,并且通常遵循与物理复制相同的消息流程。
- Begin
- Byte1('B')
将该消息标识为 Begin 消息。
- Int64
事务的最终 LSN。
- Int64
事务的提交时间戳。其值为自 PostgreSQL 纪元(2000-01-01)起经过的微秒数。
- Int32
事务的 Xid。
- Commit
- Byte1('C')
将该消息标识为 Commit 消息。
- Int8
标志;目前未使用(必须为 0)。
- Int64
提交的 LSN。
- Int64
事务的结束 LSN。
- Int64
事务的提交时间戳。其值为自 PostgreSQL 纪元(2000-01-01)起经过的微秒数。
- Origin
- Byte1('O')
将该消息标识为 Origin 消息。
- Int64
源服务器上提交的 LSN。
- String
复制源的名称。
注意,单个事务中可能有多条 Origin 消息。
- Relation
- Byte1('R')
将该消息标识为 Relation 消息。
- Int32
关系的 ID。
- String
命名空间(对于
pg_catalog为空字符串)。- String
关系名称。
- Int8
关系的复制标识设置(与
pg_class中的relreplident相同)。- Int16
列数。
接下来,每一列都会出现以下消息部分:
- Int8
列的标志。目前可以为 0,表示没有标志;或为 1,标记该列是键的一部分。
- String
列的名称。
- Int32
列的数据类型 ID。
- Int32
列的类型修饰符(
atttypmod)。
- Type
- Byte1('Y')
将该消息标识为 Type 消息。
- Int32
数据类型的 ID。
- String
命名空间(对于
pg_catalog为空字符串)。- String
数据类型的名称。
- Insert
- Byte1('I')
将该消息标识为 Insert 消息。
- Int32
关系的 ID,与 Relation 消息中的 ID 对应。
- Byte1('N')
将后续 TupleData 消息标识为新元组。
- TupleData
表示新元组内容的 TupleData 消息部分。
- Update
- Byte1('U')
将该消息标识为 Update 消息。
- Int32
关系的 ID,与 Relation 消息中的 ID 对应。
- Byte1('K')
将后续 TupleData 子消息标识为键。此字段可选,仅在更新更改了属于 REPLICA IDENTITY 索引的某一列或多列的数据时出现。
- Byte1('O')
将后续 TupleData 子消息标识为旧元组。此字段可选,仅在发生更新的表将 REPLICA IDENTITY 设为 FULL 时出现。
- TupleData
表示旧元组或主键内容的 TupleData 消息部分。仅在前面的'O'或'K'部分存在时出现。
- Byte1('N')
将后续 TupleData 消息标识为新元组。
- TupleData
表示新元组内容的 TupleData 消息部分。
Update 消息可以包含 'K' 消息部分或 'O' 消息部分,也可以两者都不包含,但绝不会同时包含两者。
- Delete
- Byte1('D')
将该消息标识为 Delete 消息。
- Int32
关系的 ID,与 Relation 消息中的 ID 对应。
- Byte1('K')
将后续 TupleData 子消息标识为键。如果发生删除的表使用索引作为 REPLICA IDENTITY,则出现此字段。
- Byte1('O')
将后续 TupleData 消息标识为旧元组。如果发生删除的表将 REPLICA IDENTITY 设为 FULL,则出现此字段。
- TupleData
表示旧元组或主键内容的 TupleData 消息部分,具体取决于前一个字段。
Delete 消息可以包含 'K' 消息部分或 'O' 消息部分,但绝不会同时包含两者。
- Truncate
- Byte1('T')
将该消息标识为 Truncate 消息。
- Int32
关系数量
- Int8
选项位用于
TRUNCATE命令:1 表示CASCADE,2 表示RESTART IDENTITY- Int32
关系的 ID,与 Relation 消息中的 ID 对应。每个关系都重复出现此字段。
以上消息共享以下消息部分。
- TupleData
- Int16
列数。
接下来,每一列都会出现以下子消息之一:
- Byte1('n')
将该数据标识为 NULL 值。
或者
- Byte1('u')
标识经过 TOAST 处理且未更改的值(不发送实际值)。
或者
- Byte1('t')
将该数据标识为文本格式的值。
- Int32
列值的长度。
- Byte
n 列值,采用文本格式。(未来版本可能支持其他格式。)
n为上述长度。