DDL overview#

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

レプリケートDDL#

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

  • 一時的なまたはログに記録されていない関係

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

  • ロックコマンド LOCK

  • テーブルメンテナンスコマンド VACUUM 、ANALYZE 、CLUSTER 、REINDEX

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

・操作コマンド 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は、これらの問題に対する3つのレベルの保護を提供します。

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

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

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

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

bdr.replicate_ddl_command を使用する場合、そのファンクションに渡されるDDLコマンドにのみ指定された bdr.ddl_locking 設定を使用して、3番目の引数でこのパラメーターを直接設定できます。