★PostgreSQLカンファレンス2024 12月6日開催/チケット販売中★
他のバージョンの文書 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

31.2. サブスクリプション

サブスクリプションは論理レプリケーションの下流側です。 サブスクリプションが定義されたノードはサブスクライバーとして参照されます。 サブスクリプションは他のデータベースへの接続と、サブスクリプション対象の一つ以上のパブリケーションの集合を定義します。

サブスクライバーのデータベースは、他のPostgreSQLインスタンスと同様に振る舞い、自分用のパブリケーションを定義することにより、他のデータベースに対するパブリッシャーとして利用できます。

サブスクライバーノードは、必要ならば複数のサブスクリプションを持つことができます。 一組のパブリッシャーとサブスクライバーの間で複数のサブスクリプションを定義することもできますが、サブスクライブしたパブリケーションオブジェクトが重複しないように注意が必要です。

各々のサブスクリプションは、一つのレプリケーションスロット(26.2.6を参照)を通じて更新が通知されます。 既存のテーブルデータを初期同期するために、追加で一時的なレプリケーションスロットが必要になることもあります。

論理レプリケーションのサブスクリプションは、同期レプリケーション(26.2.8参照)のスタンバイであっても構いません。 スタンバイ名称はデフォルトではサブスクリプション名となります。 サブスクリプションのコネクション情報の中のapplication_nameを別の名前として指定することもできます。

現在のユーザがスーパーユーザーならば、サブスクリプションはpg_dumpでダンプできます。 そうでない場合には、警告が出力され、サブスクリプションはスキップされます。 非スーパーユーザーはすべてのサブスクリプション情報を、pg_subscriptionカタログから読み出せないからです。

サブスクリプションはCREATE SUBSCRIPTIONで追加し、ALTER SUBSCRIPTIONを使って、いつでも停止、再開でき、そしてDROP SUBSCRIPTIONで削除できます。

サブスクリプションが削除され、そして再作成されると、同期情報は失われます。 このことは、後でデータを再同期しなければならないことを意味します。

スキーマ定義情報はレプリケーションされないので、パブリッシュするテーブルはサブスクライバーに存在しなければなりません。 通常のテーブルだけがレプリケーションの対象です。 たとえば、ビューはレプリケーションできません。

パブリッシャーとサブスクライバーの間でのテーブルの照合は、完全修飾されたテーブル名に基づいて行われます。 サブスクライバーで異なる名前になっているテーブルに対するレプリケーションは、サポートされていません。

テーブルの列も名前で照合されます。 対象となるテーブルの列の順序が異なるのは許されますが、列の型は一致していなければなりません。 対象となるテーブルには、パブリッシュされたテーブルにない追加の列を持つことができます。 そうした列はデフォルト値が挿入されます。

31.2.1. レプリケーションスロットの管理

前述のように、各々の(有効な)サブスクリプションは、リモート(パブリッシュしている)側のレプリケーションスロットに対する変更を受信します。 通常、リモートのレプリケーションスロットは、CREATE SUBSCRIPTIONによりサブスクリプションが作られた時に自動的に作られ、DROP SUBSCRIPTIONによりサブスクリプションが削除された時に自動的に削除されます。 しかし、状況によっては、サブスクリプションとそれが依拠しているレプリケーションスロットを別々に操作する方が良かったり、あるいはそうした必要性が出てくることもあるかもしれません。 そうしたシナリオを示します。

  • サブスクリプションを作る際、レプリケーションスロットがすでに存在しています。 この場合、create_slot = falseオプションを使ってサブスクリプションを作成し、既存のスロットと関連付けることができます。

  • サブスクリプションを作成する際に、リモートホストが接続できない状態にあるか、不明な状況にあります。 こうした時は、connect = falseを使ってサブスクリプションを作成することができます。 リモートホストにはまったく接続しません。 これは、pg_dumpが使っている方法です。 サブスクリプションを有効にする前に、リモートホストのレプリケーションスロットを手動で作成しなければなりません。

  • サブスクリプションを削除する際に、レプリケーションスロットを維持する必要があります。 サブスクライバーのデータベースが別のホストに移動中で、移動後にそこからデータベースを起動するときに有効です。 この場合、サブスクリプションを削除する前に、ALTER SUBSCRIPTIONでそのスロットを切り離します。

  • サブスクリプションを削除する際に、リモートホストに接続できません。 この場合、サブスクリプションを削除する前に、ALTER SUBSCRIPTIONでそのスロットを切り離しを試みます。 リモートデータベースインスタンスが存在しない場合は、これ以上の操作は必要ありません。 しかし、単にリモートデータベースに接続できない状態ならば、レプリケーションスロットを手動で削除する必要があります。 そうでなければ、WALが保存され続け、いずれディスクを埋め尽くすかもしれません。 そのような状態は注意深く調査する必要があります。