他のバージョンの文書 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インスタンスと同様に振る舞い、自分用のパブリケーションを定義することにより、他のデータベースに対するパブリッシャーとして利用できます。

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

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

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

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

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

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

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

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

テーブルの列も名前で照合されます。 サブスクライバーのテーブルでの列の順序はパブリッシャーと一致している必要はありません。 データのテキスト表現列が対象の型に変換可能である限り、列のデータ型も一致している必要がありません。 例えば、integer型の列からbigint型の列にレプリケーションすることができます。 対象テーブルはパブリッシュされたテーブルにない追加の列を持つこともできます。 そうした列には対象テーブルの定義の指定に従ってデフォルト値が挿入されます。

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

前述のように、各々の(有効な)サブスクリプションは、リモート(パブリッシュしている)側のレプリケーションスロットに対する変更を受信します。

追加的なテーブル同期スロットは通常一時的なもので、初期テーブル同期を実行するために内部的に作成され、不要になった時に自動的に削除されます。 これらのテーブル同期スロットにはpg_%u_sync_%u_%llu(パラメータは、サブスクリプションoid、テーブルrelid、システム識別子sysid)という名前が生成されます。

通常、リモートのレプリケーションスロットはCREATE SUBSCRIPTIONでサブスクリプションが作成されるときに自動的に作成され、サブスクリプションがDROP SUBSCRIPTIONで削除されるときに自動的に削除されます。 しかしながら、状況によっては、サブスクリプションとその下にあるレプリケーションスロットを別々に操作することが有用であったり必要であったりします。 以下にいくつかシナリオを示します。

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

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

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

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