55.9. 論理レプリケーションのメッセージ書式 #

本節では論理レプリケーションの各メッセージの書式の詳細について説明します。 これらのメッセージはレプリケーションスロットのSQLインタフェースから返されるか、あるいはwalsenderから送信されるかのいずれかです。 walsenderの場合は、55.4で説明されているようにレプリケーションプロトコルのWALメッセージ内でカプセル化され、通常は物理レプリケーションと同じメッセージフローに従います。

Begin #
Byte1('B')

メッセージが開始メッセージであることを識別します。

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)

フラグ。 現在は使用されていません。

Int64 (XLogRecPtr)

コミットのLSNです。

Int64 (XLogRecPtr)

トランザクションの終了LSNです。

Int64 (TimestampTz)

トランザクションのコミット時刻です。 その値はPostgreSQLのエポック(2000-01-01)からのマイクロ秒数です。

Origin #
Byte1('O')

メッセージがOriginメッセージであることを識別します。

Int64 (XLogRecPtr)

Originサーバ上のコミットのLSNです。

String

Originの名前です。

一つのトランザクション内で複数のOriginメッセージがあり得ることに注意してください。

Relation #
Byte1('R')

メッセージがRelationメッセージであることを識別します。

Int32 (TransactionId)

トランザクションのxid(ストリームトランザクションのためにのみ存在します)。 このフィールドはプロトコルバージョン2以降で利用可能です。

Int32 (Oid)

リレーションのOID。

String

名前空間(pg_catalogの場合は空文字列)。

String

リレーション名。

Int8

リレーションのレプリカ識別子の設定(pg_classrelreplidentと同じ)。

Int16

列数。

次に、パブリケーションを含む各列について以下のメッセージ部分があります。(生成列を除く)

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副メッセージがキーであることを識別します。 このフィールドはオプションで、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メッセージ中のIDに対応するリレーションのOID。

Byte1('K')

これに続くTupleData副メッセージがキーであることを識別します。 このフィールドはDELETEが発生したテーブルがインデックスをREPLICA IDENTITYとして使用している場合にのみ存在します。

Byte1('O')

これに続くTupleDataメッセージが古いタプルであることを識別します。 このフィールドはDELETEが発生したテーブルでREPLICA IDENTITYがFULLに設定されている場合にのみ存在します。

TupleData

直前のフィールドに従って、古いタプルまたは主キーの内容を表すTupleDataメッセージ部分です。

Deleteメッセージは'K'メッセージ部分と'O'メッセージ部分のいずれかを含みますが、両方を含むことはできません。

Truncate #
Byte1('T')

メッセージをTruncateメッセージと識別します。

Int32 (TransactionId)

トランザクションのxid(ストリームトランザクションのためにのみ存在します)。 このフィールドはプロトコルバージョン2以降で利用可能です。

Int32

リレーション数

Int8

TRUNCATEに対するオプションビット。1はCASCADE、2はRESTART IDENTITY

Int32 (Oid)

リレーションメッセージのIDに一致するリレーションのOID。 このフィールドは各リレーション毎に繰り返されます。

次のメッセージ(Stream Start、Stream Stop、Stream Commit、Stream Abort)はプロトコルバージョン2以降で利用可能です。

Stream Start #
Byte1('S')

メッセージがストリーム開始メッセージであることを識別します。

Int32 (TransactionId)

トランザクションのXIDです。

Int8

値が1ならこのXIDの最初のストリームセグメントであることを、0なら他のストリームセグメントであることを識別します。

Stream Stop #
Byte1('E')

メッセージがストリーム停止メッセージであることを識別します。

Stream Commit #
Byte1('c')

メッセージがストリームコミットメッセージであることを識別します。

Int32 (TransactionId)

トランザクションのXIDです。

Int8(0)

フラグ。 現在は使用されていません。

Int64 (XLogRecPtr)

コミットのLSNです。

Int64 (XLogRecPtr)

トランザクションの終了LSNです。

Int64 (TimestampTz)

トランザクションのコミット時刻です。 その値はPostgreSQLのエポック(2000-01-01)からのマイクロ秒数です。

Stream Abort #
Byte1('A')

メッセージがストリームアボートメッセージであることを識別します。

Int32 (TransactionId)

トランザクションのXIDです。

Int32 (TransactionId)

サブトラクションxid(トップレベルのトランザクションのxidと同じものになるでしょう)。

Int64 (XLogRecPtr)

LSNのアボート。 このフィールドはプロトコルバージョン4以降で使用できます。

Int64 (TimestampTz)

トランザクションのアボート時刻です。 その値は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)

トランザクションのプリペアド(準備された)時刻です。 その値はPostgreSQLのエポック(2000-01-01)からのマイクロ秒数です。

Int32 (TransactionId)

トランザクションのXIDです。

String

プリペアドトランザクションのユーザ定義GIDです。

Prepare #
Byte1('P')

メッセージがプリペアドトランザクションメッセージであることを識別します。

Int8(0)

フラグ。 現在は使用されていません。

Int64 (XLogRecPtr)

プリペアドのLSNです。

Int64 (XLogRecPtr)

プリペアドトランザクションの終了LSNです。

Int64 (TimestampTz)

トランザクションのプリペアド(準備された)時刻です。 その値はPostgreSQLのエポック(2000-01-01)からのマイクロ秒数です。

Int32 (TransactionId)

トランザクションのXIDです。

String

プリペアドトランザクションのユーザ定義GIDです。

Commit Prepared #
Byte1('K')

メッセージがプリペアドトランザクションメッセージのコミットであることを識別します。

Int8(0)

フラグ。 現在は使用されていません。

Int64 (XLogRecPtr)

プリペアドトランザクションのコミットのLSNです。

Int64 (XLogRecPtr)

プリペアドトランザクションのコミットの終了LSNです。

Int64 (TimestampTz)

トランザクションのコミット時刻です。 その値はPostgreSQLのエポック(2000-01-01)からのマイクロ秒数です。

Int32 (TransactionId)

トランザクションのXIDです。

String

プリペアドトランザクションのユーザ定義GIDです。

Rollback Prepared #
Byte1('r')

メッセージがプリペアドトランザクションメッセージのロールバックであることを識別します。

Int8(0)

フラグ。 現在は使用されていません。

Int64 (XLogRecPtr)

プリペアドトランザクションの終了LSNです。

Int64 (XLogRecPtr)

プリペアドトランザクションのロールバックの終了LSNです。

Int64 (TimestampTz)

トランザクションのプリペアド(準備された)時刻です。 その値はPostgreSQLのエポック(2000-01-01)からのマイクロ秒数です。

Int64 (TimestampTz)

トランザクションのロールバック時刻です。 その値はPostgreSQLのエポック(2000-01-01)からのマイクロ秒数です。

Int32 (TransactionId)

トランザクションのXIDです。

String

プリペアドトランザクションのユーザ定義GIDです。

Stream Prepare #
Byte1('p')

メッセージがストリーム準備トランザクションメッセージであることを識別します。

Int8(0)

フラグ。 現在は使用されていません。

Int64 (XLogRecPtr)

プリペアドのLSNです。

Int64 (XLogRecPtr)

プリペアドトランザクションの終了LSNです。

Int64 (TimestampTz)

トランザクションのプリペアド(準備された)時刻です。 その値はPostgreSQLのエポック(2000-01-01)からのマイクロ秒数です。

Int32 (TransactionId)

トランザクションのXIDです。

String

プリペアドトランザクションのユーザ定義GIDです。

以下のメッセージ部分は上記のメッセージに共通です。

TupleData #
Int16

列数。

次に、各カラム(生成されたカラムを除く)に対して、以下のサブメッセージのいずれかが表示されます。

Byte1('n')

データをNULL値として識別します。

Or

Byte1('u')

TOAST値が変更されないことを識別します(実際の値は送信されません)。

Or

Byte1('t')

データがテキスト形式の値であることを識別します。

Or

Byte1('b')

データがバイナリフォーマット値であることを識別します。

Int32

列値の長さ。

Byten

テキスト形式あるいはバイナリ形式での列の値。 (先行するフォーマットバイトで指定されます。) nは上記の長さです。