CREATE SUBSCRIPTION — 新しいサブスクリプションを定義する
CREATE SUBSCRIPTIONsubscription_name
CONNECTION 'conninfo
' PUBLICATIONpublication_name
[, ...] [ WITH (subscription_parameter
[=value
] [, ... ] ) ]
《マッチ度[69.924812]》CREATE SUBSCRIPTION
は新しい論理レプリケーションのサブスクリプションを追加します。
サブスクリプションの名前は現在のデータベースに存在するどのサブスクリプションの名前とも異なるものでなければなりません。
《機械翻訳》CREATEサブスクリプション
は、新しいロジカル-レプリケーションサブスクリプションを追加します。
サブスクリプションを作成するユーザは、サブスクリプションの所有者になります。
サブスクリプション名前は、現在データベースにある既存のサブスクリプションの名前とは異なる必要があります。
サブスクリプションはパブリッシャーへのレプリケーション接続を表します。 そのため、このコマンドはローカルのカタログに定義を追加するだけでなく、通常はパブリッシャーのレプリケーションスロットも作成します。
サブスクリプションが最初に無効にされていない限り、このコマンドが実行されるトランザクションがコミットされた時点で、新しいサブスクリプションに対してデータを複製する論理レプリケーションワーカーが開始されます。
《機械翻訳》サブスクリプションを作成できるようにするには、サブスクリプションロールのCREATE
権限に加えて、pg_create_現在
データベースの権限が必要です。
subscription_name
#新しいサブスクリプションの名前です。
CONNECTION 'conninfo
'
#パブリッシャーデータベースへの接続を定義するlibpq接続文字列です。 詳細は34.1.1を参照してください。
PUBLICATION publication_name
[, ...]
#パブリッシャー上のパブリケーションで、サブスクリプションの対象となるものの名前です。
WITH ( subscription_parameter
[= value
] [, ... ] )
#この句は、サブスクリプションのオプションのパラメータを指定します。
以下のパラメータは、サブスクリプションの作成時に何が行われるかを制御します。
connect
(boolean
) #
CREATE SUBSCRIPTION
コマンドがパブリッシャーに接続する必要があるかどうかを指定します。
デフォルトはtrue
です。
これをfalse
に設定すると、create_slot
、enabled
、およびcopy_data
の値が、false
に強制的に設定されます。
(connect
をfalse
に設定することは、create_slot
、enabled
、またはcopy_data
をtrue
に設定することと組み合わせることはできません。)
《機械翻訳》このオプションがコネクション
の場合、偽は行われないため、表はサブスクライブされません。
レプリケーションを開始するには、レプリケーションスロットを手動で作成し、サブスクリプションを使用可能にして、サブスクリプションをリフレッシュする必要があります。
例については、31.2.3を参照してください。
create_slot
(boolean
) #
《機械翻訳》コマンドがパブリッシャーにレプリケーションスロットを作成するかどうかを指定します。
デフォルトは真
です。
《機械翻訳》偽
に設定した場合は、パブリッシャーのスロットを別の方法で作成する必要があります。
例については、31.2.3を参照してください。
enabled
(boolean
) #
サブスクリプションが複製の動作をすぐに行うか、あるいは単に設定をするだけでまだ開始しないかを指定します。
デフォルトはtrue
です。
slot_name
(string
) #使用するパブリッシャーのレプリケーションスロットの名前です。 デフォルトでは、サブスクリプションの名前をスロット名として使用します。
《機械翻訳》スロット_名前
をNONE
に設定すると、レプリケーションスロットはサブスクリプションに関連付けられません。
このような登録では、enabled
とcreate_スロット
の両方が偽
に設定されている必要があります。
後で手動でレプリケーションスロットを作成する場合は、この設定を使用します。
例については、31.2.3を参照してください。
以下のパラメータは、作成された後のサブスクリプションのレプリケーション動作を制御します。
binary
(boolean
) #
《マッチ度[]》(テキストではなく)バイナリ形式でデータを送信するようにサブスクリプションがパブリッシャーに要求するかどうかを指定します。
デフォルトはfalse
です。
このオプションが有効になっている場合でも、バイナリ送受信関数を持つデータ型のみがバイナリ形式で転送されます。
バージョンをまたいでレプリケーションをしている場合は、パブリッシャーはあるデータ型に対してバイナリ送信関数を持っているものの、サブスクライバーはその型に対してバイナリ受信関数を持っていないという場合があり得ます。
その場合、データ転送は失敗し、binary
オプションは使えません。
《機械翻訳》パブリッシャーがPostgreSQLバージョン前16の場合、最初のテーブル同期では、binary = true
であってもテキストフォーマットが使用されます。
copy_data
(boolean
) #
サブスクリプションの対象となるパブリケーションの既存データが、レプリケーションの開始時にコピーされるかどうかを指定します。
デフォルトはtrue
です。
パブリケーションにWHERE
句が含まれている場合、コピーされるデータに影響します。
詳細は注釈を参照してください。
《機械翻訳》コピー_データ=真
がオリジン
パラメータと対話する方法の詳細については、注釈を参照してください。
streaming
(enum
) #
《マッチ度[66.528926]》進行中のトランザクションのストリーミングをこのサブスクリプションで有効にするかどうかを指定します。
デフォルトでは、すべてのトランザクションはパブリッシャーで完全にデコードされ、その後でのみ全体としてサブスクライバーに送られます。
《機械翻訳》このサブスクリプションに対して進行中のトランザクションのストリーミングを有効にするかどうかを指定します。
デフォルト値はオフ
です。
これは、すべてのトランザクションがパブリッシャーで完全にデコードされ、サブスクライバー全体に送信されることを意味します。
《機械翻訳》on
に設定すると、受信した変更は一時的ファイルに書き込まれ、トランザクションがパブリッシャーでコミットされ、サブスクライバーで受信された後にのみ適用されます。
《機械翻訳》パラレル
に設定すると、受信した変更はパラレル適用ワーカーの1つを介して直接適用されます使用可能な場合。
パラレル適用ワーカーがフリーからハンドルストリーミング取引でない場合、変更は一時的ファイルに書き込まれ、トランザクションがコミットされた後に適用されます。
ノート、パラレル適用ワーカーでエラーが発生した場合、リモートトランザクションの終了LSNがサーバーログで報告されない場合があります。
synchronous_commit
(enum
) #
このパラメータの値は、このサブスクリプションの適用されるワーカープロセスのsynchronous_commitの設定をオーバーライドします。
デフォルト値はoff
です。
論理レプリケーションではoff
を使用するのが安全です。
そうすることで、同期の失敗によりサブスクライバーがトランザクションを失った場合でも、パブリッシャーからデータが再送されます。
同期論理レプリケーションを行う場合は別の設定が適切かもしれません。
論理レプリケーションのワーカーは書き込みおよび吐き出しの位置をパブリッシャーに報告しますが、同期レプリケーションを行っているときは、パブリッシャーは実際に吐き出しがされるのを待ちます。
これはつまり、サブスクリプションが同期レプリケーションで使われている時に、サブスクライバーのsynchronous_commit
をoff
に設定すると、パブリッシャーでのCOMMIT
の遅延が増大するかもしれない、ということを意味します。
この場合、synchronous_commit
をlocal
またはそれ以上に設定することが有利になりえます。
two_phase
(boolean
) #
このサブスクリプションに対して2相コミットを有効にするかどうかを指定します。
デフォルトはfalse
です。
2相コミットが使用可能な場合、プリペアドトランザクションはPREPARE TRANSACTION
時にサブスクライバーに送信され、サブスクライバー上でも2相トランザクションとして処理されます。
それ以外の場合、プリペアドトランザクションはコミット時にのみサブスクライバーに送信され、サブスクライバーによってただちに処理されます。
2相コミットの実装では、レプリケーションが最初のテーブル同期フェーズを正常に完了している必要があります。
そのため、two_phase
がサブスクリプションに対して有効になっている場合でも、内部の2相状態は初期化フェーズが完了するまで一時的に「pending(保留)」のままです。
実際の2相状態を知るには、pg_subscription
のsubtwophasestate
列を参照してください。
disable_on_error
(boolean
) #
パブリッシャーからのデータレプリケーション中にサブスクリプションワーカーによってエラーが検出された場合に、サブスクリプションを自動的に無効にするかどうかを指定します。
デフォルトはfalse
です。
password_required
(boolean
) #
《機械翻訳》このパブリッシャーの結果として行われたサブスクリプションへの接続で、パスワード認証を使用する必要があるかどうかを指定します。
サブスクリプションがスーパーユーザによって所有されている場合、この設定は無視されます。
デフォルトは真
です。
スーパーユーザーのみがこの値を偽
に設定できます。
run_as_owner
(boolean
) #
《機械翻訳》真の場合、レプリケーションアクションはすべてサブスクリプション所有者として行われます。
偽の場合、レプリケーションの作業員は各テーブルでそのテーブルの所有者としてアクションを行います。
後者の設定は一般的にセキュアの方がはるかに多く、詳細は31.9を参照してください。
デフォルトは偽
です。
origin
(string
) #
《機械翻訳》サブスクリプションがパブリッシャーをリクエストして、オリジンのない変更のみを送信するか、オリジンに関係なく変更を送信するかを指定します。
オリジン
をnone
に設定すると、サブスクリプションはパブリッシャーをリクエストして、オリジンのない変更のみを送信します。
オリジン
をany
に設定すると、パブリッシャーはオリジンに関係なく変更を送信します。
デフォルトはany
です。
《機械翻訳》コピー_データ=真
がオリジン
パラメータと対話する方法の詳細については、注釈を参照してください。
《機械翻訳》タイプboolean
のパラメータを指定する場合、=
値
パートを省略できます。
これは真
を指定するのと同じです。
サブスクリプションとパブリケーションのインスタンスの間のアクセス制御をどのように設定するかの詳細については、31.9を参照してください。
レプリケーションスロットを作成する(デフォルトの動作です)場合、CREATE SUBSCRIPTION
をトランザクションブロックの内側で実行することはできません。
《マッチ度[84.217335]》同じデータベースクラスタに接続するサブスクリプション(例えば、同一のクラスタ内のデータベース間で複製を行う、あるいは同一のデータベース内で複製を行う)の作成は、同じコマンド内でレプリケーションスロットが作成されない場合にのみ成功します。
そうでない場合、CREATE SUBSCRIPTION
の呼び出しはハングアップします。
これを動作させるには、(関数pg_create_logical_replication_slot
をプラグイン名pgoutput
で使って)レプリケーションスロットを別に作り、パラメータcreate_slot = false
を使ってサブスクリプションを作成してください。
これは実装上の制限で、将来のリリースでは解決されるかもしれません。
《機械翻訳》同じデータベースクラスタに接続するサブスクリプションの作成(例の場合、同じクラスタ内のデータベース間でレプリケートするため、または同じデータベース内でレプリケートするため)は、そのレプリケーションスロットが同じコマンドのパートとして作成されていない場合にのみ成功します。
それ以外の場合、CREATEサブスクリプション
呼び出しはハングになります。
makeでこの作業を行うには、レプリケーションスロットを個別に作成し(関数pg_create_ロジカル_レプリケーション_スロット
とプラグイン名前pgoutput
を使用します)、パラメータを使用してサブスクリプションを作成しますcreate_=
。
31.2.3の例を参照してください。
これは、将来のドーハで解除される可能性のある、です。
スロット偽実装制限リリース
《マッチ度[84.984026]》パブリケーション内のテーブルにWHERE
句がある場合、expression
が偽またはNULLと評価される行はパブリッシュされません。
サブスクリプションに、同じテーブルが異なるWHERE
句でパブリッシュされた複数のパブリケーションがある場合、(パブリッシュ操作を参照する)式のいずれかが満たされると行がパブリッシュされます。
WHERE
句が異なる場合、パブリケーションのいずれかにWHERE
句がないか(パブリッシュ操作を参照する)パブリケーションがFOR ALL TABLES
またはFOR TABLES IN SCHEMA
として宣言されている場合、行は他の式の定義に関係なく常にパブリッシュされます。
サブスクライバーのバージョンがPostgreSQL 15より前の場合、最初のデータ同期フェーズでは行のフィルタリングは無視されます。
この場合、後続のフィルタリングと互換性のない最初にコピーされたデータの削除を検討したくなるでしょう。
最初のデータ同期では、既存のテーブルデータをコピーする際にパブリケーションpublish
パラメータが考慮されないため、DMLを使用してレプリケートされない行がコピーされる場合があります。
例については31.2.2を参照してください。
《機械翻訳》パブリケーション内のいずれかのテーブルにWHERE
句がある場合、式
が偽またはnullと評価される行は公開されません。
同じテーブルが異なるWHERE
句を使用して公開されている複数のパブリケーションがサブスクリプションにある場合、(そのパブリッシュオペレーションを参照する)式のいずれかが満たされると、行が公開されます。
異なるWHERE
句のケースでは、パブリケーションの1つにWHERE
句がない場合(そのパブリッシュオペレーションを参照する)、またはパブリケーションがFOR ALL TABLES
またはFOR TABLES INスキーマ
と宣言されている場合、他の式の定義に関係なく、行は常に公開されます。
サブスクライバーがPostgreSQLバージョン15の場合、最初の同期化フェーズでは、すべてのが無視されます。
このでは、後続のと互換性のない最初にコピーされたをと見なすことができます。
最初のの同期化では、既存のをコピーするときに、aviations
rifが考慮されないため、DMLを使用してレプリケートされない行がコピーされる場合があります。
例については、31.2.2を参照してください。
前行フィルタリングデータケースユーザ削除データフィルタリングデータアカウントパブリケーションパブリッシュパラメータテーブルデータ
同じテーブルが異なる列リストでパブリッシュされた複数のパブリケーションを持つサブスクリプションはサポートされません。
後で追加できるように、存在しないパブリケーションを指定できます。
これはpg_subscription
が存在しないパブリケーションを持つことができることを意味します。
《機械翻訳》サブスクリプションパラメータのコピー_データ=真
とオリジン=NONE
の組合せを使用する場合、初期同期テーブルデータはパブリッシャーから直接コピーされます。
これは、そのデータの真オリジンを認識できないことを意味します。
パブリッシャーにも定期購読/購買がある場合、コピーされたテーブルデータはさらに上流から発生した可能性があります。
このシナリオが検出され、ワーニングがユーザに記録されますが、ワーニングは潜在的な問題を示しているだけです。
コピーされたの発生元が本当に必要かどうかを保証に対して必要なチェックを行うのは、ユーザの責任です。
makeデータ
《機械翻訳》(includeで作成された他のサブスクリプションのために)ローカル以外のクエリをトライする可能性のあるテーブルを見つけるには、次のようにします。
# substitute <pub-names> below with your publication name(s) to be queried SELECT DISTINCT PT.schemaname, PT.tablename FROM pg_publication_tables PT, pg_subscription_rel PS JOIN pg_class C ON (C.oid = PS.srrelid) JOIN pg_namespace N ON (N.oid = C.relnamespace) WHERE N.nspname = PT.schemaname AND C.relname = PT.tablename AND PT.pubname IN (<pub-names>);
パブリケーション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の拡張です。