論理レプリケーションには、以下の制限事項とサポートされていない機能があります。 将来のリリースでは、これらは対処されるかもしれません。
データベーススキーマおよびDDLコマンドはレプリケーションされません。
初期スキーマは、pg_dump --schema-only
を使ってコピーすることができます。
以後のスキーマ変更の同期は手動で行ないます。
(なお、両者でスキーマ名は完全に同じである必要はないことに留意してください。)
稼働中のスキーマ定義変更に対して、論理レプリケーションは頑健です。
スキーマがパブリッシャー側で変更され、複製データがサブスクライバー側に到着し始めたものの、データがテーブルスキーマに合致しない場合は、スキーマが変更されるまではレプリケーションはエラーとなります。
多くの場合、間欠的なエラーは、サブスクライバーに先に追加的なスキーマ変更を行うことで避けることができます。
シーケンスデータはレプリケーションされません。
シーケンスによって裏付けされたSERIAL型や識別列のデータは、もちろんテーブルの一部としてレプリケーションされます。
しかし、シーケンス自体は、サブスクライバーがスタートした時の値のままです。
サブスクライバーが読み取り専用のデータベースとして使われているなら、通常は問題になりません。
しかし、サブスクライバーのデータベースをスイッチオーバーやフェイルオーバーするつもりなら、パブリッシャーから現在のデータをコピーするか(おそらくpg_dump
を使います)、テーブル自身から十分に大きな値を決定し、シーケンスを最新の値に更新しなければなりません。
TRUNCATE
コマンドのレプリケーションはサポートされますが、外部キーで結びついたテーブル群を削除する場合には注意が必要です。
削除処理をレプリケーションするとき、サブスクライバーはパブリッシャーで明示的に指定され削除された、もしくはCASCADE
により暗黙的に削除されたテーブル群から、サブスクリプションの一部ではないテーブルを除いたテーブル群を削除します。
この処理は、外部キーで関連付けられた全てのテーブルが同一のサブスクリプションの一部であれば、正常に動作します。
しかし、サブスクライバーで削除されるテーブルが同一のサブスクリプションの一部でないテーブルと外部キーで接続されていた場合、サブスクライバー上の削除処理は失敗します。
ラージオブジェクト(第34章参照)はレプリケーションされません。 通常のテーブルにデータを格納する以外に回避方法はありません。
レプリケーションは基底テーブルから基底テーブルのみに行われます。 つまり、パブリッシャー側とサブスクリプション側のテーブルは、通常のテーブルでなければならず、ビュー、マテリアライズドビュー、パーティションのルートテーブル、外部テーブルであってはいけません。 パーティションの場合は、パーティションの階層を一つずつレプリケーションできますが、今のところ異なるやり方でパーティションされたテーブルにはレプリケーションできません。 基底テーブル以外をレプリケーションしようとすると、エラーになります。