CREATE SUBSCRIPTION — 新しいサブスクリプションを定義する
CREATE SUBSCRIPTIONsubscription_name
CONNECTION 'conninfo
' PUBLICATIONpublication_name
[, ...] [ WITH (subscription_parameter
[=value
] [, ... ] ) ]
CREATE SUBSCRIPTION
は現在のデータベースに新しいサブスクリプションを追加します。
サブスクリプションの名前は現在のデータベースに存在するどのサブスクリプションの名前とも異なるものでなければなりません。
サブスクリプションはパブリッシャーへのレプリケーション接続を表します。 そのためこのコマンドはローカルのカタログに定義を追加するだけでなく、パブリッシャーのレプリケーションスロットも作成します。
このコマンドが実行されるトランザクションがコミットされた時点で、新しいサブスクリプションに対してデータを複製する論理レプリケーションワーカが開始されます。
subscription_name
新しいサブスクリプションの名前です。
CONNECTION 'conninfo
'
パブリッシャーへの接続文字列です。 詳細は34.1.1を参照してください。
PUBLICATION publication_name
パブリッシャー上のパブリケーションで、サブスクリプションの対象となるものの名前です。
WITH ( subscription_parameter
[= value
] [, ... ] )
この句ではサブスクリプションのオプションパラメータを指定します。 以下のパラメータがサポートされています。
copy_data
(boolean
)
サブスクリプションの対象となるパブリケーションの既存データが、レプリケーションの開始時にコピーされるかどうかを指定します。
デフォルトはtrue
です。
create_slot
(boolean
)
このコマンドがパブリッシャー上にレプリケーションスロットを作るかどうかを指定します。
デフォルトはtrue
です。
enabled
(boolean
)
サブスクリプションが複製の動作をすぐに行うか、あるいは単に設定をするだけでまだ開始しないかを指定します。
デフォルトはtrue
です。
slot_name
(string
)使用するレプリケーションスロットの名前です。 デフォルトの挙動では、サブスクリプションの名前をスロット名として使用します。
slot_name
をNONE
に設定すると、サブスクリプションに紐付けられたレプリケーションスロットがなくなります。
これはレプリケーションスロットを後で手作業で作成する場合に使用できます。
そのようなサブスクリプションは、enabled
とcreate_slot
の両方をfalse
に設定しなければなりません。
synchronous_commit
(enum
)
このパラメータの値は、このサブスクリプションの適用されるワーカプロセスのsynchronous_commitの設定をオーバーライドします。
デフォルト値はoff
です。
論理レプリケーションではoff
を使用するのが安全です。
そうすることで、同期の失敗によりサブスクライバーがトランザクションを失った場合でも、パブリッシャーからデータが再送されます。
同期論理レプリケーションを行う場合は別の設定が適切かもしれません。
論理レプリケーションのワーカは書き込みおよび吐き出しの位置をパブリッシャーに報告しますが、同期レプリケーションを行っているときは、パブリッシャーは実際に吐き出しがされるのを待ちます。
これはつまり、サブスクリプションが同期レプリケーションで使われている時に、サブスクライバーのsynchronous_commit
をoff
に設定すると、パブリッシャーでのCOMMIT
の遅延が増大するかもしれない、ということを意味します。
この場合、synchronous_commit
をlocal
またはそれ以上に設定することが有利になりえます。
binary
(boolean
)
サブスクリプションがパブリッシャーにデータを(テキストではなく)バイナリ形式で送るよう要求するかどうかを指定します。
デフォルトはfalse
です。
このオプションが有効な場合でも、バイナリ送受信関数のあるデータ型だけがバイナリで転送されます。
バージョンをまたいでレプリケーションをしている場合は、パブリッシャーはあるデータ型に対してバイナリ送信関数を持っているものの、サブスクライバーはその型に対してバイナリ受信関数を持っていないという場合があり得ます。
その場合、データ転送は失敗し、binary
オプションは使えません。
connect
(boolean
)
CREATE SUBSCRIPTION
がパブリッシャーに接続するかどうかを指定します。
これをfalse
に設定すると、enabled
、create_slot
、copy_data
のデフォルト値をfalse
に変更します。
connect
をfalse
に設定し、enabled
、create_slot
またはcopy_data
をtrue
に設定することは許されません。
このオプションがfalse
に設定されると接続が行われないため、テーブルはサブスクライブされません。
そのため、サブスクリプションを有効にしても、何も複製されません。
テーブルをサブスクライブするには、ALTER SUBSCRIPTION ... REFRESH PUBLICATION
を実行する必要があります。
streaming
(boolean
)進行中のトランザクションのストリーミングをこのサブスクリプションで有効にするかどうかを指定します。 デフォルトでは、すべてのトランザクションはパブリッシャーで完全にデコードされ、その後でのみ全体としてサブスクライバーに送られます。
サブスクリプションとパブリケーションのインスタンスの間のアクセス制御をどのように設定するかの詳細については、31.7を参照してください。
レプリケーションスロットを作成する(デフォルトの動作です)場合、CREATE SUBSCRIPTION
をトランザクションブロックの内側で実行することはできません。
同じデータベースクラスタに接続するサブスクリプション(例えば、同一のクラスタ内のデータベース間で複製を行う、あるいは同一のデータベース内で複製を行う)の作成は、同じコマンド内でレプリケーションスロットが作成されない場合にのみ成功します。
そうでない場合、CREATE SUBSCRIPTION
の呼び出しはハングアップします。
これを動作させるには、(関数pg_create_logical_replication_slot
をプラグイン名pgoutput
で使って)レプリケーションスロットを別に作り、パラメータcreate_slot = false
を使ってサブスクリプションを作成してください。
これは実装上の制限で、将来のリリースでは解決されるかもしれません。
パブリケーションmypublication
およびinsert_only
のテーブルを複製する、リモートサーバへのサブスクリプションを作成し、コミット後、すぐにレプリケーションを開始します。
CREATE SUBSCRIPTION mysub CONNECTION 'host=192.168.1.50 port=5432 user=foo dbname=foodb' PUBLICATION mypublication, insert_only;
パブリケーションinsert_only
のテーブルを複製するリモートサーバへのサブスクリプションを作成しますが、後に有効化するまではレプリケーションを開始しません。
CREATE SUBSCRIPTION mysub CONNECTION 'host=192.168.1.50 port=5432 user=foo dbname=foodb' PUBLICATION insert_only WITH (enabled = false);
CREATE SUBSCRIPTION
はPostgreSQLの拡張です。