DDL overview
============

DDLはデータ定義言語の略で、データベースオブジェクトを作成、変更、および削除するSQL言語のサブセットです。

レプリケートされたDDL
---------------------

操作の利便性と正確性を維持するために、
PGDはほとんどのDDLアクションをレプリケートしますが、次の例外を除きます。

- 一時的な関係

- 特定のDDLステートメントほとんどの場合、長時間実行

- ロックコマンド ``LOCK``

・テーブルメンテナンスコマンド ``VACUUM`` 、\ ``ANALYZE``
、\ ``CLUSTER``

- オートバキュームのアクション

・操作コマンド ``CHECKPOINT`` 、\ ``ALTER SYSTEM``

- データベースに関するアクション

自動DDLレプリケーションにより、
DDL変更をすべてのノードに手動で配布し、一貫性を確認する必要がなく、特定のDDL変更が簡単になります。

デフォルトのレプリケーションセットでは、
DDLはデフォルトですべてのノードにレプリケートされます。

PostgreSQLとの違い
------------------

DDLレプリケーションに関して、
PGDはスタンドアロンのPostgreSQLとは大きく異なります。それを同じに扱うことは、PGDで最も一般的な問題です。

テーブルレプリケーションとの主な違いは、
DDLレプリケーションがDDLの結果をレプリケートしないことです。代わりに、ステートメントをレプリケートします。これは、ほとんどの場合で非常にうまく機能しますが、
DDLをすべてのノードで同様に実行する必要があるという要件が導入されます。より微妙な点は、
DDLは、拡張機能ビルトインではなくによって導入されたデータ型を含む、すべてのデータ型固有のパラメーター設定に関して不変である必要があることです。たとえば、
DDLステートメントは、各ノードで使用されるデフォルトのエンコーディングで正しく実行される必要があります。

PGDシステムでのDDLの実行
------------------------

PGDグループは、スタンドアロンのPostgreSQLサーバーと同じではありません。これは、集中ロックやトランザクションコーディネーターを使用しない非同期マルチマスターレプリケーションに基づいています。これは、
DDLの実行時に重要な意味を持ちます。

パラレルに実行されるDDLは、PGDで引き続き実行されます。
DDLの実行は、実行時に各ノードの並列オペレーションに影響を与えるパラメーターを尊重するため、ノード間の設定の違いに気づく場合があります。

競合するDDLステートメントの実行を防ぐことが重要です。それ以外の場合、
DDLレプリケーションの競合が発生し、レプリケーションが停止します。

PGDは、 DDLの競合に対して次のレベルの保護を提供します。

``bdr.ddl_locking = 'all'`` は最も厳密なオプションであり、
DDLが任意のノードから同時に実行される可能性があり、正確性を保証したい場合に最適です。

``bdr.ddl_locking = 'leader'``
は、書き込みリーダーのみをロックし、ノードの大部分がロック操作に参加する必要はありません。

``bdr.ddl_locking = 'auto'`` デフォルトは、可能であれば\ ``leader``
ロックを自動的に選択し、それ以外の場合は\ ``all``
にフォールバックします。

``bdr.ddl_locking = 'dml'``
は、任意の時点で1つのノードからDDLを実行する場合にのみ安全なオプションです。
DDLを実行する場所を完全に制御できる場合にのみこの設定を使用します。単一のノードからDDLを実行すると、ノード間の競合が保証されません。ノード内の競合はPostgreSQLによって既に処理されています。

``bdr.ddl_locking = 'off'``
は最も厳密でないオプションであり、一般的な使用は危険です。このオプションは、ロックを完全にスキップし、パフォーマンスのオーバーヘッドを回避するため、新しい空のデータベーススキーマを作成するときに役立つオプションです。

これらのオプションは、
bdr_superuser、スーパーユーザー、または\ ``postgres.conf``
構成ファイルでのみ設定できます。

`bdr.replicate_ddl_command <https://www.enterprisedb.com/docs/pgd/latest/reference/tables-views-functions/functions#bdrreplicate_ddl_command>`_ を使用する場合、そのファンクションに渡されるDDLコマンドにのみ指定された `bdr.ddl_locking <https://www.enterprisedb.com/docs/pgd/latest/reference/tables-views-functions/pgd-settings#bdrddl_locking>`_ 設定を使用して、3番目の引数でこのパラメーターを直接設定できます。

DDLおよび混合PostgreSQLバージョン
---------------------------------

PGDは、クラスター内の異なるメジャーPostgresバージョン間のDDLレプリケーションをサポートしていません。クラスターはPostgresの同じメジャーバージョンを実行するため、ほとんどの場合、これは問題ではありません。ただし、これは、メジャーバージョンから別のメジャーバージョンへのクラスターのローリングアップグレードを実行する場合には当てはまりません。この場合、
DDLレプリケーションは、すべてのノードが同じメジャーバージョンにアップグレードされるまでサポートされないため、使用しないでください。

スクリプトがDDLレプリケーションをトリガーする場合があるため、拡張機能を更新するときはアップグレードプロセスで特別な注意を払う必要があります。この場合、アップグレードが完了する前にスクリプトを実行する必要がある場合は、スクリプトの実行中に\ ``bdr.ddl_replication``
設定を\ ``off`` に設定する必要があります。
