PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

54.9. 逻辑复制具体消息格式 #

本节描述每条逻辑复制消息的详细格式。 这些消息或者由复制槽 SQL 接口返回, 或者由 walsender 发送。就 walsender 而言, 它们被封装在 Section 54.4 中描述的复制协议 WAL 消息内, 并且通常遵循与物理复制相同的消息流。

Begin #
Byte1('B')

把该消息标识为一条 begin 消息。

Int64 (XLogRecPtr)

该事务的最终 LSN。

Int64 (TimestampTz)

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

Int32 (TransactionId)

事务的 Xid。

Message #
Byte1('M')

把该消息标识为一条逻辑解码消息。

Int32 (TransactionId)

事务的 Xid(仅对流式传输的事务存在)。 该字段自协议版本 2 起可用。

Int8

标志;0 表示没有标志,1 表示该逻辑解码消息是事务性的。

Int64 (XLogRecPtr)

该逻辑解码消息的 LSN。

String

该逻辑解码消息的前缀。

Int32

内容的长度。

Byten

该逻辑解码消息的内容。

Commit #
Byte1('C')

把该消息标识为一条 commit 消息。

Int8(0)

Flags; currently unused.

Int64 (XLogRecPtr)

该提交的 LSN。

Int64 (XLogRecPtr)

该事务的结束 LSN。

Int64 (TimestampTz)

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

Origin #
Byte1('O')

把该消息标识为一条 origin 消息。

Int64 (XLogRecPtr)

来源服务器上该提交的 LSN。

String

来源的名称。

注意,在单个事务内部可以有多条 Origin 消息。

Relation #
Byte1('R')

把该消息标识为一条 relation 消息。

Int32 (TransactionId)

事务的 Xid(仅对流式传输的事务存在)。 该字段自协议版本 2 起可用。

Int32 (Oid)

该关系的 OID。

String

命名空间(对 pg_catalog 为空字符串)。

String

Relation name.

Int8

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

Int16

Number of columns.

接下来,发布中包含的每一列都会出现以下消息部分:

Int8

该列的标志。目前可以是 0(表示没有标志), 或 1(表示该列是键的一部分)。

String

该列的名称。

Int32 (Oid)

该列数据类型的 OID。

Int32

该列的类型修饰符(atttypmod)。

Type #
Byte1('Y')

把该消息标识为一条 type 消息。

Int32 (TransactionId)

事务的 Xid(仅对流式传输的事务存在)。 该字段自协议版本 2 起可用。

Int32 (Oid)

该数据类型的 OID。

String

命名空间(对 pg_catalog 为空字符串)。

String

该数据类型的名称。

Insert #
Byte1('I')

把该消息标识为一条 insert 消息。

Int32 (TransactionId)

事务的 Xid(仅对流式传输的事务存在)。 该字段自协议版本 2 起可用。

Int32 (Oid)

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

Byte1('N')

把后面的 TupleData 消息标识为一个新元组。

TupleData

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

Update #
Byte1('U')

把该消息标识为一条 update 消息。

Int32 (TransactionId)

事务的 Xid(仅对流式传输的事务存在)。 该字段自协议版本 2 起可用。

Int32 (Oid)

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

Byte1('K')

把后面的 TupleData 子消息标识为一个键(key)。 该字段是可选的,只有当更新更改了 属于 REPLICA IDENTITY 索引的任何列中的数据时才会出现。

Byte1('O')

把后面的 TupleData 子消息标识为一个旧元组(old tuple)。 该字段是可选的,只有当发生更新的表 的 REPLICA IDENTITY 被设置为 FULL 时才会出现。

TupleData

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

Byte1('N')

把后面的 TupleData 消息标识为一个新元组。

TupleData

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

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

Delete #
Byte1('D')

把该消息标识为一条 delete 消息。

Int32 (TransactionId)

事务的 Xid(仅对流式传输的事务存在)。 该字段自协议版本 2 起可用。

Int32 (Oid)

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

Byte1('K')

把后面的 TupleData 子消息标识为一个键(key)。 如果发生删除的表使用一个索引作为 REPLICA IDENTITY, 则该字段会出现。

Byte1('O')

把后面的 TupleData 消息标识为一个旧元组。 如果发生删除的表的 REPLICA IDENTITY 被设置为 FULL, 则该字段会出现。

TupleData

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

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

Truncate #
Byte1('T')

把该消息标识为一条 truncate 消息。

Int32 (TransactionId)

事务的 Xid(仅对流式传输的事务存在)。 该字段自协议版本 2 起可用。

Int32

Number of relations

Int8

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

Int32 (Oid)

与 relation 消息中的 ID 对应的关系的 OID。 每个关系都会重复一次该字段。

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

Stream Start #
Byte1('S')

把该消息标识为一条 stream start 消息。

Int32 (TransactionId)

事务的 Xid。

Int8

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

Stream Stop #
Byte1('E')

把该消息标识为一条 stream stop 消息。

Stream Commit #
Byte1('c')

把该消息标识为一条 stream commit 消息。

Int32 (TransactionId)

事务的 Xid。

Int8(0)

Flags; currently unused.

Int64 (XLogRecPtr)

该提交的 LSN。

Int64 (XLogRecPtr)

该事务的结束 LSN。

Int64 (TimestampTz)

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

Stream Abort #
Byte1('A')

把该消息标识为一条 stream abort 消息。

Int32 (TransactionId)

事务的 Xid。

Int32 (TransactionId)

子事务的 Xid(对于顶层事务, 它将与该事务的 xid 相同)。

Int64 (XLogRecPtr)

中止操作的 LSN,只有当 streaming 被设置为 parallel 时才会出现。 该字段自协议版本 4 起可用。

Int64 (TimestampTz)

事务的中止时间戳,只有当 streaming 被设置为 parallel 时才会出现。 该值是自 PostgreSQL 纪元(2000-01-01)以来的微秒数。 该字段自协议版本 4 起可用。

以下消息(Begin Prepare、Prepare、Commit Prepared、Rollback Prepared、 Stream Prepare)自协议版本 3 起可用。

Begin Prepare #
Byte1('b')

把该消息标识为一条两阶段提交消息的开始。

Int64 (XLogRecPtr)

该准备的 LSN。

Int64 (XLogRecPtr)

该两阶段提交事务的结束 LSN。

Int64 (TimestampTz)

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

Int32 (TransactionId)

事务的 Xid。

String

该两阶段提交事务的用户定义 GID。

Prepare #
Byte1('P')

把该消息标识为一条两阶段提交消息。

Int8(0)

Flags; currently unused.

Int64 (XLogRecPtr)

该准备的 LSN。

Int64 (XLogRecPtr)

该两阶段提交事务的结束 LSN。

Int64 (TimestampTz)

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

Int32 (TransactionId)

事务的 Xid。

String

该两阶段提交事务的用户定义 GID。

Commit Prepared #
Byte1('K')

把该消息标识为一条两阶段提交事务的提交消息。

Int8(0)

Flags; currently unused.

Int64 (XLogRecPtr)

该两阶段提交事务提交的 LSN。

Int64 (XLogRecPtr)

该两阶段提交事务提交的结束 LSN。

Int64 (TimestampTz)

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

Int32 (TransactionId)

事务的 Xid。

String

该两阶段提交事务的用户定义 GID。

Rollback Prepared #
Byte1('r')

把该消息标识为一条两阶段提交事务的回滚消息。

Int8(0)

Flags; currently unused.

Int64 (XLogRecPtr)

该两阶段提交事务的结束 LSN。

Int64 (XLogRecPtr)

该两阶段提交事务回滚的结束 LSN。

Int64 (TimestampTz)

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

Int64 (TimestampTz)

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

Int32 (TransactionId)

事务的 Xid。

String

该两阶段提交事务的用户定义 GID。

Stream Prepare #
Byte1('p')

把该消息标识为一条两阶段提交事务的流式传输消息。

Int8(0)

Flags; currently unused.

Int64 (XLogRecPtr)

该准备的 LSN。

Int64 (XLogRecPtr)

该两阶段提交事务的结束 LSN。

Int64 (TimestampTz)

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

Int32 (TransactionId)

事务的 Xid。

String

该两阶段提交事务的用户定义 GID。

以下消息部分由上述消息共同使用。

TupleData #
Int16

Number of columns.

接下来,对每个被发布的列都会出现以下子消息之一:

Byte1('n')

把该数据标识为 NULL 值。

Or

Byte1('u')

标识一个未更改的 TOAST 值(实际值不会被发送)。

Or

Byte1('t')

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

Or

Byte1('b')

把该数据标识为二进制格式的值。

Int32

列值的长度。

Byten

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