本節では論理レプリケーションの各メッセージの書式の詳細について説明します。 これらのメッセージはレプリケーションスロットのSQLインタフェースから返されるか、あるいはwalsenderから送信されるかのいずれかです。 walsenderの場合は、55.4で説明されているようにレプリケーションプロトコルのWALメッセージ内でカプセル化され、通常は物理レプリケーションと同じメッセージフローに従います。
メッセージが開始メッセージであることを識別します。
トランザクションの最後のLSNです。
トランザクションのコミット時刻です。 その値はPostgreSQLのエポック(2000-01-01)からのマイクロ秒数です。
トランザクションのXIDです。
ロジカルデコーディングメッセージであることを識別します。
トランザクションのxid(ストリームトランザクションのためにのみ存在します)。 このフィールドはプロトコルバージョン2以降で利用可能です。
フラグ。0はフラグなし、ロジカルデコーディングメッセージがトランザクションであれば1です。
ロジカルデコーディングメッセージのLSN。
ロジカルデコーディングメッセージの接頭辞。
内容の長さ。
n
ロジカルデコーディングメッセージの内容。
メッセージがCommitメッセージであることを識別します。
フラグ。 現在は使用されていません。
コミットのLSNです。
トランザクションの終了LSNです。
トランザクションのコミット時刻です。 その値はPostgreSQLのエポック(2000-01-01)からのマイクロ秒数です。
メッセージがOriginメッセージであることを識別します。
Originサーバ上のコミットのLSNです。
Originの名前です。
一つのトランザクション内で複数のOriginメッセージがあり得ることに注意してください。
メッセージがRelationメッセージであることを識別します。
トランザクションのxid(ストリームトランザクションのためにのみ存在します)。 このフィールドはプロトコルバージョン2以降で利用可能です。
リレーションのOID。
名前空間(pg_catalog
の場合は空文字列)。
リレーション名。
リレーションのレプリカ識別子の設定(pg_class
のrelreplident
と同じ)。
列数。
次に、パブリケーションを含む各列について以下のメッセージ部分があります。(生成列を除く)
列のフラグ。 現在は、フラグがないことを示す0か、列がキーの一部であることを示す1のいずれかにできます。
列名。
列のデータ型のOID。
列の型修飾子(atttypmod
)。
メッセージがTypeメッセージであることを識別します。
トランザクションのxid(ストリームトランザクションのためにのみ存在します)。 このフィールドはプロトコルバージョン2以降で利用可能です。
データ型のOID。
名前空間(pg_catalog
の場合は空文字列)。
データ型の名前。
メッセージがInsertメッセージであることを識別します。
トランザクションのxid(ストリームトランザクションのためにのみ存在します)。 このフィールドはプロトコルバージョン2以降で利用可能です。
Relationメッセージ中のIDに対応するリレーションのOID。
以下のTupleDataメッセージが新しいタプルであることを識別します。
新しいタプルの内容を表すTupleDataメッセージ部分です。
メッセージがUpdateメッセージであることを識別します。
トランザクションのxid(ストリームトランザクションのためにのみ存在します)。 このフィールドはプロトコルバージョン2以降で利用可能です。
Relationメッセージ中のIDに対応するリレーションのOID。
これに続くTupleData副メッセージがキーであることを識別します。 このフィールドはオプションで、UPDATEがREPLICA IDENTITYインデックスの一部となっている列のどれかを変更したときにのみ存在します。
これに続くTupleData副メッセージが古いタプルであることを識別します。 このフィールドはオプションで、UPDATEが発生したテーブルでREPLICA IDENTITYがFULLに設定されている場合にのみ存在します。
古いタプルまたは主キーの内容を表すTupleDataメッセージ部分です。 この前に'O'または'K'の部分が存在するときにのみ存在します。
以下のTupleDataメッセージが新しいタプルであることを識別します。
新しいタプルの内容を表すTupleDataメッセージ部分です。
Updateメッセージは'K'メッセージ部分と'O'メッセージ部分のいずれかを含むか、どちらも含まないかであり、その両方を含むことはできません。
メッセージがDeleteメッセージであることを識別します。
トランザクションのxid(ストリームトランザクションのためにのみ存在します)。 このフィールドはプロトコルバージョン2以降で利用可能です。
Relationメッセージ中のIDに対応するリレーションのOID。
これに続くTupleData副メッセージがキーであることを識別します。 このフィールドはDELETEが発生したテーブルがインデックスをREPLICA IDENTITYとして使用している場合にのみ存在します。
これに続くTupleDataメッセージが古いタプルであることを識別します。 このフィールドはDELETEが発生したテーブルでREPLICA IDENTITYがFULLに設定されている場合にのみ存在します。
直前のフィールドに従って、古いタプルまたは主キーの内容を表すTupleDataメッセージ部分です。
Deleteメッセージは'K'メッセージ部分と'O'メッセージ部分のいずれかを含みますが、両方を含むことはできません。
メッセージをTruncateメッセージと識別します。
トランザクションのxid(ストリームトランザクションのためにのみ存在します)。 このフィールドはプロトコルバージョン2以降で利用可能です。
リレーション数
TRUNCATE
に対するオプションビット。1はCASCADE
、2はRESTART IDENTITY
リレーションメッセージのIDに一致するリレーションのOID。 このフィールドは各リレーション毎に繰り返されます。
次のメッセージ(Stream Start、Stream Stop、Stream Commit、Stream Abort)はプロトコルバージョン2以降で利用可能です。
メッセージがストリーム開始メッセージであることを識別します。
トランザクションのXIDです。
値が1ならこのXIDの最初のストリームセグメントであることを、0なら他のストリームセグメントであることを識別します。
メッセージがストリーム停止メッセージであることを識別します。
メッセージがストリームコミットメッセージであることを識別します。
トランザクションのXIDです。
フラグ。 現在は使用されていません。
コミットのLSNです。
トランザクションの終了LSNです。
トランザクションのコミット時刻です。 その値はPostgreSQLのエポック(2000-01-01)からのマイクロ秒数です。
メッセージがストリームアボートメッセージであることを識別します。
トランザクションのXIDです。
サブトランザクションxid(トップレベルのトランザクションのxidと同じものになるでしょう)。
LSNのアボート。 このフィールドはプロトコルバージョン4以降で使用できます。
トランザクションのアボート時刻です。 その値はPostgreSQLのエポック(2000-01-01)からのマイクロ秒数です。 このフィールドはプロトコルバージョン4以降で使用可能です。
次のメッセージ(Begin Prepare、Prepare、 Commit Prepared、Rollback Prepared、Stream Prepare)はプロトコルバージョン3以降で利用可能です。
メッセージがプリペアドトランザクションメッセージの先頭であることを識別します。
プリペアドのLSNです。
プリペアドトランザクションの終了LSNです。
トランザクションのプリペアド(準備された)時刻です。 その値はPostgreSQLのエポック(2000-01-01)からのマイクロ秒数です。
トランザクションのXIDです。
プリペアドトランザクションのユーザ定義GIDです。
メッセージがプリペアドトランザクションメッセージであることを識別します。
フラグ。 現在は使用されていません。
プリペアドのLSNです。
プリペアドトランザクションの終了LSNです。
トランザクションのプリペアド(準備された)時刻です。 その値はPostgreSQLのエポック(2000-01-01)からのマイクロ秒数です。
トランザクションのXIDです。
プリペアドトランザクションのユーザ定義GIDです。
メッセージがプリペアドトランザクションメッセージのコミットであることを識別します。
フラグ。 現在は使用されていません。
プリペアドトランザクションのコミットのLSNです。
プリペアドトランザクションのコミットの終了LSNです。
トランザクションのコミット時刻です。 その値はPostgreSQLのエポック(2000-01-01)からのマイクロ秒数です。
トランザクションのXIDです。
プリペアドトランザクションのユーザ定義GIDです。
メッセージがプリペアドトランザクションメッセージのロールバックであることを識別します。
フラグ。 現在は使用されていません。
プリペアドトランザクションの終了LSNです。
プリペアドトランザクションのロールバックの終了LSNです。
トランザクションのプリペアド(準備された)時刻です。 その値はPostgreSQLのエポック(2000-01-01)からのマイクロ秒数です。
トランザクションのロールバック時刻です。 その値はPostgreSQLのエポック(2000-01-01)からのマイクロ秒数です。
トランザクションのXIDです。
プリペアドトランザクションのユーザ定義GIDです。
メッセージがストリーム準備トランザクションメッセージであることを識別します。
フラグ。 現在は使用されていません。
プリペアドのLSNです。
プリペアドトランザクションの終了LSNです。
トランザクションのプリペアド(準備された)時刻です。 その値はPostgreSQLのエポック(2000-01-01)からのマイクロ秒数です。
トランザクションのXIDです。
プリペアドトランザクションのユーザ定義GIDです。
以下のメッセージ部分は上記のメッセージに共通です。
列数。
次に、各カラム(生成されたカラムを除く)に対して、以下のサブメッセージのいずれかが表示されます。
データをNULL値として識別します。
Or
TOAST値が変更されないことを識別します(実際の値は送信されません)。
Or
データがテキスト形式の値であることを識別します。
Or
データがバイナリフォーマット値であることを識別します。
列値の長さ。
n
テキスト形式あるいはバイナリ形式での列の値。
(先行するフォーマットバイトで指定されます。)
n
は上記の長さです。