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