49.8. ロジカルデコーディングにおける同期レプリケーションのサポート #

49.8.1. 概要 #

ストリーミングレプリケーションにおける同期レプリケーションと同じユーザインタフェースで、ロジカルデコーディングを使って同期レプリケーションソリューションを構築することができます。 そのためには、ストリーミングレプリケーションインタフェース(49.3参照)を使ってデータをストリーム出力します。 ストリーミングレプリケーションクライアントが行っているのと同じように、状態の更新(55.4参照)メッセージを送信しなければなりません。

注記

synchronous_standby_namesがサーバ全体に適用されるのに対し、ロジカルデコーディングを通じて変更データを受け取る同期レプリカは、単一のデータベースのスコープの範囲で動作します。 このことにより、複数のデータベースが同時に使用される環境では、ロジカルデコーディングを使った同期レプリケーションはうまく動きません。

49.8.2. 警告 #

同期レプリケーション設定では、トランザクションが[user]カタログテーブルを排他的にロックした場合、デッドロックが発生する可能性があります。 ユーザカタログテーブルに関する情報については49.6.2を参照してください。 これは、トランザクションの論理的なデコードがカタログテーブルをロックしてアクセスできるためです。 これを回避するために、ユーザは[user]カタログテーブルに対する排他ロックの取得を控える必要があります。 これは以下の方法で発生します。

  • トランザクションのpg_classに対する明示的なLOCKの発行。

  • トランザクション内のpg_classに対してCLUSTERを実行。

  • pg_class上のLOCKコマンドの後にPREPARE TRANSACTIONを実行し、2相トランザクションのロジカルデコーディングを可能にする。

  • pg_trigger上のCLUSTERコマンドの後にPREPARE TRANSACTIONを実行し、2相トランザクションのロジカルデコーディングを可能にする。 これにより、発行されたテーブルにトリガがある場合にのみデッドロックが発生します。

  • トランザクションの[user]カタログテーブルに対してTRUNCATEを実行。

デッドロックの原因となるこれらのコマンドは、上記の明示的に指定されたシステムカタログテーブルだけでなく、他の[user]カタログテーブルにも適用されることに注意してください。