2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10

54.9. 邏輯複製訊息格式 #

本節描述了每個邏輯複製訊息的詳細格式。這些訊息由複製槽 SQL 介面返回,或由 walsender 傳送。對於 walsender,它們被封裝在複製協議 WAL 訊息中,如第 54.4 節所述,並且通常遵循與物理複製相同的訊息流。

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

邏輯解碼訊息的 prefix。

Int32

content 的長度。

Byten

邏輯解碼訊息的 content。

Commit #
Byte1('C')

標識訊息為 commit 訊息。

Int8(0)

標誌;目前未使用。

Int64 (XLogRecPtr)

commit 的 LSN。

Int64 (XLogRecPtr)

事務的結束 LSN。

Int64 (TimestampTz)

事務的提交時間戳。該值是以自 PostgreSQL 紀元 (2000-01-01) 以來的微秒數表示。

Origin #
Byte1('O')

標識訊息為 origin 訊息。

Int64 (XLogRecPtr)

源伺服器上 commit 的 LSN。

String

源的名稱。

請注意,一個事務中可能包含多個 Origin 訊息。

Relation #
Byte1('R')

標識訊息為 relation 訊息。

Int32 (TransactionId)

事務的 Xid (僅當是流式事務時存在)。此欄位自協議版本 2 起可用。

Int32 (Oid)

relation 的 OID。

String

Namespace (對於 pg_catalog 為空字串)。

String

Relation 的名稱。

Int8

relation 的 replica identity 設定 (與 pg_class 中的 relreplident 相同)。

Int16

列的數量。

接下來,對於釋出中包含的每一列,將出現以下訊息部分。

Int8

列的標誌。目前可以是 0 (無標誌) 或 1 (標記該列是 key 的一部分)。

String

列的名稱。

Int32 (Oid)

列資料型別的 OID。

Int32

列的型別修飾符 (atttypmod)。

Type #
Byte1('Y')

標識訊息為 type 訊息。

Int32 (TransactionId)

事務的 Xid (僅當是流式事務時存在)。此欄位自協議版本 2 起可用。

Int32 (Oid)

資料型別的 OID。

String

Namespace (對於 pg_catalog 為空字串)。

String

資料型別的名稱。

Insert #
Byte1('I')

標識訊息為 insert 訊息。

Int32 (TransactionId)

事務的 Xid (僅當是流式事務時存在)。此欄位自協議版本 2 起可用。

Int32 (Oid)

relation 的 OID,對應 relation 訊息中的 ID。

Byte1('N')

標識下面的 TupleData 訊息為新元組。

TupleData

代表新元組內容的 TupleData 訊息部分。

Update #
Byte1('U')

標識訊息為 update 訊息。

Int32 (TransactionId)

事務的 Xid (僅當是流式事務時存在)。此欄位自協議版本 2 起可用。

Int32 (Oid)

relation 的 OID,對應 relation 訊息中的 ID。

Byte1('K')

標識下面的 TupleData 子訊息為 key。此欄位是可選的,僅當 update 更改了 REPLICA IDENTITY 索引所包含的列中的任何資料時存在。

Byte1('O')

標識下面的 TupleData 子訊息為舊元組。此欄位是可選的,僅當發生 update 的表將 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 的 OID,對應 relation 訊息中的 ID。

Byte1('K')

標識下面的 TupleData 子訊息為 key。當發生 delete 的表使用索引作為 REPLICA IDENTITY 時,此欄位存在。

Byte1('O')

標識下面的 TupleData 訊息為舊元組。當發生 delete 的表將 REPLICA IDENTITY 設定為 FULL 時,此欄位存在。

TupleData

根據前面的欄位,表示舊元組或主鍵內容的 TupleData 訊息部分。

Delete 訊息可能包含 'K' 訊息部分或 'O' 訊息部分,但絕不會同時包含兩者。

Truncate #
Byte1('T')

標識訊息為 truncate 訊息。

Int32 (TransactionId)

事務的 Xid (僅當是流式事務時存在)。此欄位自協議版本 2 起可用。

Int32

relation 的數量。

Int8

TRUNCATE 的選項位:1 表示 CASCADE,2 表示 RESTART IDENTITY

Int32 (Oid)

relation 的 OID,對應 relation 訊息中的 ID。此欄位對每個 relation 重複。

以下訊息 (Stream Start, Stream Stop, Stream Commit, Stream Abort) 自協議版本 2 起可用。

Stream Start #
Byte1('S')

標識訊息為 stream start 訊息。

Int32 (TransactionId)

事務的 Xid。

Int8

值為 1 表示這是此 XID 的第一個 stream 片段,0 表示其他 stream 片段。

Stream Stop #
Byte1('E')

標識訊息為 stream stop 訊息。

Stream Commit #
Byte1('c')

標識訊息為 stream commit 訊息。

Int32 (TransactionId)

事務的 Xid。

Int8(0)

標誌;目前未使用。

Int64 (XLogRecPtr)

commit 的 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)

abort 操作的 LSN,僅當 streaming 設定為 parallel 時存在。此欄位自協議版本 4 起可用。

Int64 (TimestampTz)

事務的 abort 時間戳,僅當 streaming 設定為 parallel 時存在。該值是以自 PostgreSQL 紀元 (2000-01-01) 以來的微秒數表示。此欄位自協議版本 4 起可用。

以下訊息 (Begin Prepare, Prepare, Commit Prepared, Rollback Prepared, Stream Prepare) 自協議版本 3 起可用。

Begin Prepare #
Byte1('b')

標識訊息為 prepared transaction 訊息的開始。

Int64 (XLogRecPtr)

prepare 的 LSN。

Int64 (XLogRecPtr)

prepared transaction 的結束 LSN。

Int64 (TimestampTz)

事務的 prepare 時間戳。該值是以自 PostgreSQL 紀元 (2000-01-01) 以來的微秒數表示。

Int32 (TransactionId)

事務的 Xid。

String

事務的使用者定義 GID。

Prepare #
Byte1('P')

標識訊息為 prepared transaction 訊息。

Int8(0)

標誌;目前未使用。

Int64 (XLogRecPtr)

prepare 的 LSN。

Int64 (XLogRecPtr)

prepared transaction 的結束 LSN。

Int64 (TimestampTz)

事務的 prepare 時間戳。該值是以自 PostgreSQL 紀元 (2000-01-01) 以來的微秒數表示。

Int32 (TransactionId)

事務的 Xid。

String

事務的使用者定義 GID。

Commit Prepared #
Byte1('K')

標識訊息為 prepared transaction commit 訊息。

Int8(0)

標誌;目前未使用。

Int64 (XLogRecPtr)

prepared transaction commit 的 LSN。

Int64 (XLogRecPtr)

prepared transaction commit 的結束 LSN。

Int64 (TimestampTz)

事務的提交時間戳。該值是以自 PostgreSQL 紀元 (2000-01-01) 以來的微秒數表示。

Int32 (TransactionId)

事務的 Xid。

String

事務的使用者定義 GID。

Rollback Prepared #
Byte1('r')

標識訊息為 prepared transaction rollback 訊息。

Int8(0)

標誌;目前未使用。

Int64 (XLogRecPtr)

prepared transaction 的結束 LSN。

Int64 (XLogRecPtr)

prepared transaction rollback 的結束 LSN。

Int64 (TimestampTz)

事務的 prepare 時間戳。該值是以自 PostgreSQL 紀元 (2000-01-01) 以來的微秒數表示。

Int64 (TimestampTz)

事務的 rollback 時間戳。該值是以自 PostgreSQL 紀元 (2000-01-01) 以來的微秒數表示。

Int32 (TransactionId)

事務的 Xid。

String

事務的使用者定義 GID。

Stream Prepare #
Byte1('p')

標識訊息為 stream prepared transaction 訊息。

Int8(0)

標誌;目前未使用。

Int64 (XLogRecPtr)

prepare 的 LSN。

Int64 (XLogRecPtr)

prepared transaction 的結束 LSN。

Int64 (TimestampTz)

事務的 prepare 時間戳。該值是以自 PostgreSQL 紀元 (2000-01-01) 以來的微秒數表示。

Int32 (TransactionId)

事務的 Xid。

String

事務的使用者定義 GID。

上述訊息共享以下訊息部分。

TupleData #
Int16

列的數量。

接下來,對於每個釋出的列,將出現以下子訊息之一。

Byte1('n')

標識資料為 NULL 值。

或者

Byte1('u')

標識未更改的 TOASTed 值 (實際值未傳送)。

或者

Byte1('t')

標識資料為文字格式的值。

或者

Byte1('b')

標識資料為二進位制格式的值。

Int32

列值的長度。

Byten

列的值,可以是二進位制格式或文字格式 (如前面格式位元組指定)。n 是上述長度。

提交更正

如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用此表單報告文件問題。