サブスクリプションは論理レプリケーションの下流側です。 サブスクリプションが定義されたノードはサブスクライバーとして参照されます。 サブスクリプションは他のデータベースへの接続と、サブスクリプション対象の一つ以上のパブリケーションの集合を定義します。
サブスクライバーのデータベースは、他のPostgreSQLインスタンスと同様に振る舞い、自分用のパブリケーションを定義することにより、他のデータベースに対するパブリッシャーとして利用できます。
サブスクライバーノードは、必要ならば複数のサブスクリプションを持つことができます。 一組のパブリッシャーとサブスクライバーの間で複数のサブスクリプションを定義することもできますが、サブスクライブしたパブリケーションオブジェクトが重複しないように注意が必要です。
各々のサブスクリプションは、一つのレプリケーションスロット(26.2.6を参照)を通じて更新が通知されます。 既存のテーブルデータを初期同期するために、追加で一時的なレプリケーションスロットが必要になることもあります。
論理レプリケーションのサブスクリプションは、同期レプリケーション(26.2.8参照)のスタンバイであっても構いません。
スタンバイ名称はデフォルトではサブスクリプション名となります。
サブスクリプションのコネクション情報の中のapplication_name
を別の名前として指定することもできます。
現在のユーザがスーパーユーザならば、サブスクリプションはpg_dump
でダンプできます。
そうでない場合には、警告が出力され、サブスクリプションはスキップされます。
非スーパーユーザはすべてのサブスクリプション情報を、pg_subscription
カタログから読み出せないからです。
サブスクリプションはCREATE SUBSCRIPTIONで追加し、ALTER SUBSCRIPTIONを使って、いつでも停止、再開でき、そしてDROP SUBSCRIPTIONで削除できます。
サブスクリプションが削除され、そして再作成されると、同期情報は失われます。 このことは、後でデータを再同期しなければならないことを意味します。
スキーマ定義情報はレプリケーションされないので、パブリッシュするテーブルはサブスクライバーに存在しなければなりません。 通常のテーブルだけがレプリケーションの対象です。 たとえば、ビューはレプリケーションできません。
パブリッシャーとサブスクライバーの間でのテーブルの照合は、完全修飾されたテーブル名に基づいて行われます。 サブスクライバーで異なる名前になっているテーブルに対するレプリケーションは、サポートされていません。
テーブルの列も名前で照合されます。
サブスクライバーのテーブルでの列の順序はパブリッシャーと一致している必要はありません。
データのテキスト表現列が対象の型に変換可能である限り、列のデータ型も一致している必要がありません。
例えば、integer
型の列からbigint
型の列にレプリケーションすることができます。
対象テーブルはパブリッシュされたテーブルにない追加の列を持つこともできます。
そうした列には対象テーブルの定義の指定に従ってデフォルト値が挿入されます。
前述のように、各々の(有効な)サブスクリプションは、リモート(パブリッシュしている)側のレプリケーションスロットに対する変更を受信します。
通常、リモートのレプリケーションスロットは、CREATE SUBSCRIPTION
によりサブスクリプションが作られた時に自動的に作られ、DROP SUBSCRIPTION
によりサブスクリプションが削除された時に自動的に削除されます。
しかし、状況によっては、サブスクリプションとそれが依拠しているレプリケーションスロットを別々に操作する方が良かったり、あるいはそうした必要性が出てくることもあるかもしれません。
そうしたシナリオを示します。
サブスクリプションを作る際、レプリケーションスロットがすでに存在しています。
この場合、create_slot = false
オプションを使ってサブスクリプションを作成し、既存のスロットと関連付けることができます。
サブスクリプションを作成する際に、リモートホストが接続できない状態にあるか、不明な状況にあります。
こうした時は、connect = false
を使ってサブスクリプションを作成することができます。
リモートホストにはまったく接続しません。
これは、pg_dumpが使っている方法です。
サブスクリプションを有効にする前に、リモートホストのレプリケーションスロットを手動で作成しなければなりません。
サブスクリプションを削除する際に、レプリケーションスロットを維持する必要があります。
サブスクライバーのデータベースが別のホストに移動中で、移動後にそこからデータベースを起動するときに有効です。
この場合、サブスクリプションを削除する前に、ALTER SUBSCRIPTION
でそのスロットを切り離します。
サブスクリプションを削除する際に、リモートホストに接続できません。
この場合、サブスクリプションを削除する前に、ALTER SUBSCRIPTION
でそのスロットを切り離しを試みます。
リモートデータベースインスタンスが存在しない場合は、これ以上の操作は必要ありません。
しかし、単にリモートデータベースに接続できない状態ならば、レプリケーションスロットを手動で削除する必要があります。
そうでなければ、WALが保存され続け、いずれディスクを埋め尽くすかもしれません。
そのような状態は注意深く調査する必要があります。