Application schema upgrades

EDB Postgres Distributedのアップグレードと同様に、アプリケーションスキーマをアップグレードするには2つのアプローチがあります。より簡単なオプションは、影響を受けるすべてのアプリケーションを停止し、スキーマのアップグレードを実行し、アップグレードされたアプリケーションを再起動して新しいスキーマバリアントを使用することです。このアプローチでは、ダウンタイムが発生します。

このダウンタイムを解消するために、 EDB Postgres Distributedは、アプリケーションスキーマのローリングアップグレードを実行するための便利なツールを提供します。

次の推奨事項とヒントは、クラスターに対するアプリケーションスキーマのアップグレードの影響を軽減します。

ローリングアプリケーションスキーマのアップグレード

デフォルトでは、 DDLはすべてのノードに自動的に送信されます。

DMLおよびDDLレプリケーション で説明されているように、この動作を手動で制御できます。このアプローチを使用して、ノード全体のデータベーススキーマ間の違いを作成できます。

PGDは、ノード間のわずかな違いがあってもレプリケーションを継続できるように設計されています。これらの機能は、ダウンタイムなしでアプリケーションスキーマを移行できるように、またはロジカルスタンバイノードでレポートまたはテストを行えるように設計されています。

警告

PGDの外部でアプリケーションスキーマのローリングアップグレードを管理する必要があります。

これを実稼働クラスターで正しく機能させるには、慎重なスクリプト作成が必要です。広範なテストをお勧めします。

詳細は 差分のあるノード間のレプリケーション を参照してください。

1つのノードが新しいテーブルを追加するDDLを実行すると、最新のDDLをまだ受け取っていないノードは余分なテーブルを処理する必要があります。この観点から、ローリングスキーマアップグレードの適切な設定は、 target_table_missing の競合が発生した場合にskip リゾルバーを適用するようにすべてのノードを構成することです。ノードにテーブルを追加する前に、この構成を実行します。この設定は永続的です。

次のクエリを 各ノードで 個別に実行します。 node1 を実際のノード名に置き換えます。

SELECT bdr.alter_node_set_conflict_resolver(node1,
        target_table_missing, skip);

1つのノードがテーブルに列を追加するDDLを実行すると、最新のDDLをまだ受け取っていないノードは余分な列を処理する必要があります。この観点から、ローリングスキーマアップグレードの適切な設定は、 target_column_missing の競合が発生した場合にignore リゾルバーを適用するようにすべてのノードを構成することです。これは、1つのノードに列を追加する前に実行します。この設定は永続的です。

次のクエリを 各ノードで 個別に実行します。 node1 を実際のノード名に置き換えます。

SELECT bdr.alter_node_set_conflict_resolver(node1,
        target_column_missing, ignore);

1つのノードがテーブルから列を削除するDDLを実行すると、最新のDDLをまだ受け取っていないノードは不足している列を処理する必要があります。この状況により、 use_default_value リゾルバーを使用するsource_column_missing の競合が発生します。したがって、 NULLを受け入れず、 DEFAULT 値を持たない列には、2段階のプロセスが必要です。

  1. NOT NULL制約を削除するか、すべてのノードの列にDEFAULT値を追加します。

  2. カラムを取り外します。

ローリング方式でコンストレインを削除できます。現在、一度に1ノードずつローリングしてテーブル制約の追加を処理する方法はサポートされていません。

1つのノードが既存の列の型を変更するDDLを実行する場合、現在の型とターゲット型の間にバイナリ強制性の存在によっては、操作で基になるテーブルデータが書き換えられない場合があります。その場合、それは基になる列タイプのメタデータの更新のみです。通常、テーブルの書き換えは制限されています。ただし、制御されたDBA環境では、すべてのノードの非レプリケート環境でこの列の型のローリングアップグレードを1つずつ採用することにより、列の型を自動的にキャスト可能なものに変更できます。詳細については、 ALTERテーブル を参照してください。