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