オンプレミスの PostgreSQL データベースを Azure に移行する

完了

企業が Azure Database for PostgreSQL への移行を決定したら、次の手順は、オンプレミス データベースを移行する方法を計画し、データを移動するためのツールを選択することです。

Azure Database for PostgreSQL によって Azure で PostgreSQL がどのようにサポートおよびスケーリングされるかを探索した後は、既存のオンプレミス データベースをどのように移行するかを検討します。

このユニットでは、Azure portal を使用して Azure Database for PostgreSQL サービスのインスタンスを作成する方法について説明します。 このサービスのインスタンスを多数作成する必要がある場合は、Azure CLI を使用してこのプロセスをスクリプト化できます。

Azure Database for PostgreSQL フレキシブル サーバーを作成する

Azure portal で、検索ボックスに「Azure Database for PostgreSQL flexible servers」と入力して、[Azure Database for PostgreSQL フレキシブル サーバー] を選択します。

Screenshot showing the Azure Database for PostgreSQL flexible servers item in the Azure portal.

フレキシブル サーバーのメイン ブレードで [作成] を選択し、サービスの詳細を入力します。 詳細情報は次のとおりです。

  • リソース グループ。 サーバーのリソース グループ。

  • [サーバー名] : 小文字、数字、およびハイフンのみを含む 3 から 63 文字の一意の名前である必要があります。

  • [リージョン]。 サーバーのリージョン。

  • PostgreSQL バージョン: 移行するオンプレミスのデータベースに対応するバージョンを選択します。

  • ワークロードの種類。 ワークロードに基づいてオプションを選択します。

    • [コンピューティングとストレージ][サーバーの構成] を選択して価格レベルを設定し、サービスに必要なリソースを指定します。 これらのオプションについては、レッスン 1 で説明しました。 [汎用] または [メモリ最適化] の価格レベルを選択した場合は、後で仮想プロセッサのコア数をスケールアップまたはスケールダウンできることに注意してください。 ただし、ストレージの量を減らすことはできません。サーバーが作成された後は、増やすことしかできません。
  • [管理者ユーザー名]。 管理特権で作成するユーザー アカウントの名前。 Azure では、独自に使用するアカウントがいくつか作成されます。 azure_superuserazure_pg_adminadminadministratorrootguestpublic、または pg_ で始まる任意の名前を使用することはできません。

  • [パスワード]。 8 ~ 128 文字である必要があります。 大文字と小文字、数字、および英数字以外の文字を組み合わせる必要があります。

Screenshot showing a sample configuration for Azure Database for PostgreSQL flexible server in the Azure portal.

[確認および作成] をクリックしてサービスをデプロイします。 デプロイには数分かかります。

サービスがデプロイされたら、[接続のセキュリティ] オプションを選択し、適切なファイアウォール規則を追加して、クライアントが接続できるようにします。手順については、レッスン 1 の「クライアント接続」を参照してください。 また、[Azure サービスへのアクセスを許可する] オプションも選択する必要があります。

Azure CLI を使用して Azure Database for PostgreSQL インスタンスを作成する

az postgres flexible-server create コマンドを使用して、Azure Database for PostgreSQL のインスタンスを作成できます。 次のステートメントは、フレキシブル サーバーのインスタンスを作成する例を示しています。 以下を除いて、ほとんどのパラメーターは自明です。

  • sku-name。 これは、価格レベル (Basic の場合は B、汎用の場合は GP、メモリ最適化の場合は MO)、コンピューティング世代 (Gen4 または Gen5)、および仮想 CPU コアの数の組み合わせから構築します。 次の例では、汎用価格レベルで Gen5 世代の 4 つの CPU コアを備えたサーバーを作成しています。
  • storage-size。 これは、必要なディスク ストレージの量で、メガバイト単位で指定します。 次の例では、10 GB が割り当てられます。
    az postgres flexible-server create \
    --location northeurope --resource-group testGroup \
    --name testserver --admin-user username --admin-password password \
    --sku-name Standard_B1ms --tier Burstable --public-access 153.24.26.117 --storage-size 128 \
    --tags "key=value" --version 13 --high-availability Enabled --zone 1 \
    --standby-zone 3
    

オンライン移行を実行する

Azure Database Migration Service を使用して、オンプレミスにインストールされた PostgreSQL から Azure Database for PostgreSQL へのオンライン移行を実行できます。

オンライン シナリオでは、Azure Database Migration Service によって既存のすべてのデータが Azure にコピーされた後、ソース データベースから同期操作が継続的に実行されます。 オンプレミスのシステムに対して実行されるすべての新しいトランザクションは、Azure の新しいデータベースにコピーされます。 このプロセスは、Azure で新しいデータベースを使用するようにクライアント アプリケーションを再構成するまで続行されます。そこで、同期操作を終了します。

ソース サーバーを構成し、スキーマをエクスポートする

オンライン移行を実行するための最初の手順は、完全な先書き ログをサポートするようにソース サーバーを準備することです。 ソース サーバーで、postgresql.config ファイルを編集し、次の先書きログ パラメーターを構成します。 これらのパラメーターを変更するには、サーバーを再起動します。これは、システムの休止が想定されている場合にのみ実行します。

wal_level = logical
max_replication_slots = 5
max_wal_senders = 10

サーバーを再起動したら、pg_dump ユーティリティを使用して、ソース データベースのスキーマをエクスポートします。

pg_dump -o -h [server host] -U [user name] -d [database name] -s > db_schema.sql

最後に、データベースで使用されているすべての拡張機能の一覧を作成します。 ターゲット データベースでこれらの拡張機能を有効にする必要があります。 これを行うには、\dx plsql コマンドを使用するか、次のクエリを実行します。

SELECT *
FROM pg_extension;

ターゲット データベースを作成し、スキーマをインポートする

次の段階では、お使いの Azure Database for PostgreSQL サービスでターゲット データベースを作成します。 pgAdmin などの使い慣れたツールを使用してサーバーに接続するか、次の例の Azure CLI を使用することができます。

az postgres db create \
  --name [database name] \
  --server-name [server name] \
  --resource-group [azure resource group]

ターゲット データベースで、ソース データベースで使用されているすべての拡張機能を有効にします。

スキーマをターゲット データベースにインポートします。 db_schema.sql ファイルが格納されているマシン上で、次のコマンドを実行します。

psql -h [Azure Database for PostgreSQL host] -U [user name] -d [database name] -f db_schema.sql

ターゲット データベース内のすべての外部キー参照を削除します。 この手順が必要なのは、データが必ずしも特定の順序で移行されるわけではなく、参照整合性違反によって移行プロセスが失敗する可能性があるためです。 ただし、後で再作成する必要があるため、すべての外部キーを記録する必要があります。 psql ユーティリティを使用して次の SQL ステートメントを実行し、データベース内のすべての外部キーを検索して、削除するスクリプトを生成します。

SELECT Queries.tablename
       ,concat('alter table ', Queries.tablename, ' ', STRING_AGG(concat('DROP CONSTRAINT ', Queries.foreignkey), ',')) as DropQuery
            ,concat('alter table ', Queries.tablename, ' ',
                                            STRING_AGG(concat('ADD CONSTRAINT ', Queries.foreignkey, ' FOREIGN KEY (', column_name, ')', 'REFERENCES ', foreign_table_name, '(', foreign_column_name, ')' ), ',')) as AddQuery
    FROM
    (SELECT
    tc.table_schema,
    tc.constraint_name as foreignkey,
    tc.table_name as tableName,
    kcu.column_name,
    ccu.table_schema AS foreign_table_schema,
    ccu.table_name AS foreign_table_name,
    ccu.column_name AS foreign_column_name
FROM
    information_schema.table_constraints AS tc
    JOIN information_schema.key_column_usage AS kcu
      ON tc.constraint_name = kcu.constraint_name
      AND tc.table_schema = kcu.table_schema
    JOIN information_schema.constraint_column_usage AS ccu
      ON ccu.constraint_name = tc.constraint_name
      AND ccu.table_schema = tc.table_schema
WHERE constraint_type = 'FOREIGN KEY') Queries
  GROUP BY Queries.tablename;

ターゲット データベースのトリガーを無効にします。これを行う理由は 2 つあります。

  • データのコピー時に移行プロセスを最適化するのに役立つ。
  • 多くの場合、トリガーは、複雑な形式の参照整合性を実装するために使用されます。前述の理由により、この種類の整合性チェックはデータの転送中に失敗する可能性があります。 次の SQL ステートメントを使用して、データベース内のすべてのトリガーを検索し、それらを無効にするスクリプトを生成します。
    SELECT concat ('alter table ', event_object_table, ' disable trigger ', trigger_name)
    FROM information_schema.triggers;
    

Note

トリガーのテキストは、psql で \df+ コマンドを使用して見つけることができます。

Azure Database Migration Service インスタンスを作成する

これで、Azure portal で Azure Database Migration Service のインスタンスを作成できるようになりました。

Azure Database Migration Service のインスタンスを作成する前に、Microsoft.DataMigration リソース プロバイダーを対象のサブスクリプションに登録する必要があります。 このことは次のように実行できます。

  1. Azure portal の左側のメニュー バーで、[すべてのサービス] を選択します。
  2. [すべてのサービス] ページで、[サブスクリプション] を選択します。
  3. [サブスクリプション] ページで、対象のサブスクリプションを選択します。
  4. 対象のサブスクリプションのページの [設定] で、[リソース プロバイダー] をクリックします。
  5. [名前でフィルター] ボックスに「DataMigration」と入力し、その後 [Microsoft.DataMigration] を選択します。
  6. [登録] を選択し、[状態][登録済み] に変わるまで待ちます。 状態の変化を確認するために [最新の情報に更新] を選択することが必要になる場合があります。
    Image showing the Resource providers page. The user is registering the Microsoft.DataMigration resource provider

リソース プロバイダーが登録されたら、サービスを作成できます。 左側のメニュー バーで [リソースの作成] コマンドを選択し、Azure Database Migration Service を検索します。

Image showing the initial page when creating the Azure Database Migration Service

[移行サービスの作成] ページで、このサービスのインスタンスの名前を入力し、サブスクリプション (リソース プロバイダーを登録したサブスクリプションと同じである必要があります)、リソース グループ、および場所を指定します。 さらに、仮想ネットワークも指定する必要があります。なぜなら、Database Migration Service では、必要な保護を提供するために、この仮想ネットワーク用に作成されたファイアウォールに依存するからです。 Azure 仮想マシンからデータベースを移行する場合は、これらの仮想マシンで使用されているのと同じ仮想ネットワークに Database Migration Service を配置できる可能性があります。 サービスで使用できる仮想プロセッサ コアの数は、価格レベルによって決まります。 オンライン移行を実行する場合は、Premium レベルを選択する必要があります。Standard レベルでは、オフライン移行のみがサポートされます。

Image showing the configuration for the Azure Database Migration Service. The user has selected the Premium pricing tier

サービスがデプロイされるまで待ってから続行します。 この操作には数分かかります。

Database Migration Service を使用して移行プロジェクトを作成する

これで、Database Migration Service インスタンスをオンライン移行の実行に使用できるようになりました。 これを行うには、新しいデータベース移行プロジェクトを作成します。 移行サービス インスタンスのページに移動し、[新しい移行プロジェクト] を選択します。

Image showing the newly created Azure Database Migration Service.

[新しい移行プロジェクト] ページで、ソース サーバーの種類を [PostgreSQL] に設定し、ターゲット サーバーの種類を [Azure Database for PostgreSQL] に設定して、[オンライン データの移行] を選択します。 [アクティビティの種類] ページには、オンライン移行を有効にするためにソース サーバーで実行する必要のある手順が一覧表示されます。 [新しい移行プロジェクト] ページの下部にあるテキストに、スキーマをターゲットに移行するためのプロセスが説明されています。

Image showing the migration project properties and instructions.

これらの手順を完了したことを確認し、[アクティビティの作成と実行] を選択します。

移行アクティビティを作成して実行する

新しい移行プロジェクトによって、手順を案内するウィザードが起動されます。 以下の詳細を指定します。

  • [ソースの追加に関する詳細] ページで、ソース サーバーのアドレス、ソース データベース、およびこのデータベースに接続してデータを取得できるアカウント。 移行を実行するには、アカウントに SUPERUSER 特権が必要です。
  • [ターゲットの詳細] ページで、Azure Database for PostgreSQL サービスのアドレス、データの移行先のデータベース、および管理者権限があるアカウントの詳細を指定する。
  • [ターゲット データベースへマッピング] ページで、ソース データベースとターゲット データベースを選択する。 単一のデータベースまたは複数のデータベースを移行できます。
  • [移行の設定] ページで、構成する追加の設定 (並行して読み込むテーブルの最大数など) を指定する。
  • [移行の概要] ページで、アクティビティの名前を入力し、[移行を実行する] を選択する。
    Image showing the migration summary page.

アクティビティ状態ページが表示され、移行の進行状況と発生したエラーが表示されます。 移行に失敗した場合は、問題を修正してから、アクティビティを再試行します。 オンライン移行を行っている場合、既存のデータが転送された後、状態が [カットオーバー準備完了] に変わります。 ただし、アクティビティは引き続き実行され、アプリケーションが元のデータベースをアクティブに使用している間に発生する追加の変更が転送されます。

Image showing the activity status page for the migration activity. The migration has transferred all the current data, and is ready to cutover to the new database.

外部キーとトリガーを復元する

この時点で、これでデータが転送され、アプリケーションで使用を開始できるようになりました。 データを移行する前に削除した外部キーを再作成し、トリガーをすべて復元する必要があります。 一部のアプリケーションが元のデータベースにまだ接続されている場合は、先書きログによって Azure 内のターゲットデータベースが最新の状態に保たれることが保証されます。 外部キーとトリガーが先書きログに悪影響を与えることはありません。

新しいデータベースにカットオーバーする

すべてのアプリケーションが新しいデータベースに切り替えられたら、移行プロセスを完了して、新しいデータベースにカットオーバーします。 アクティビティ状態ページで、移行するデータベースの名前を選択して、実行された作業の概要を確認します。

Image showing the statistics for the migration activity.

[カットオーバーを開始] を選択します。 操作が完了したことを確認するよう求めるページが表示されます。 この時点で、ソース データベースの先書きログの残りのエントリはすべてドレインされ、更新は停止します。 それ以降のソース データベースへの変更は反映されません。

Image of the Complete cutover page.

オフライン移行を実行する

オフライン移行では、特定の時点のソース データベースの "スナップショット" を作成し、そのデータをターゲット データベースにコピーします。 スナップショットの作成後にソース データに加えられた変更は、ターゲット データベースに反映されません。

Azure Database for PostgreSQL または Azure 仮想マシンなどの別の場所で実行されている PostgreSQL サーバーに対してオフライン移行を実行する場合、少なくとも 2 つのオプションがあります。

  • pg_dump ユーティリティを使用してソース データベースからスキーマとデータをエクスポートし、psql ユーティリティを使用してスキーマとデータをターゲット データベースにインポートします。 この手法を使用すると、必要に応じてスキーマとデータを変更、再フォーマット、およびクリーンアップしてから、ターゲット データベースに転送できます。
  • 再度 pg_dump を使用してソース データベースからデータをダンプし、pg_restore を使用してデータをターゲット データベースに復元します。 この手法は、エクスポートとインポートを使用するよりも高速ですが、データは簡単には変更できない形式でダンプされます。 スキーマまたはデータを調整する必要がない場合は、この方法を使用します。

注意

現時点では、Azure Database Migration Service を使用して PostgreSQL データベースのオフライン移行を実行することはできません。

エクスポートとインポートを使用して移行する

エクスポートとインポートの方法を使用してデータベースを移行するには、次の手順を実行します。

  1. bash プロンプトから pg_dump コマンドを使用して、スキーマをエクスポートします。

    pg_dump -o -h [source database server] -U [user name] -d [database] -s > db_schema.sql
    
  2. pg_dump コマンドを使用して、データを別のファイルにエクスポートします。

    pg_dump -o -h [source database server] -U [user name] -d [database] -a > db_data.sql
    

    この時点で、db_schema.sql と db_data は、テキスト エディターを使用して変更する SQL スクリプトです。

  3. Azure Database for PostgreSQL でターゲット データベースを作成します。 これを行うには、Azure CLI を使用します。

    az postgres db create \
        --name [database name] \
        --server-name [server name] \
        --resource-group [azure resource group]
    
  4. psql コマンドを使用して、スキーマをターゲット データベースにインポートします。

    psql -d [target database name] -h [server name in Azure Database for PostgreSQL] -U [user name] -f db_schema.sql
    
  5. psql コマンドを使用して、データをターゲット データベースにインポートします。

    psql -d [target database name] -h [server name in Azure Database for PostgreSQL] -U [user name] -f db_data.sql
    

バックアップと復元を使用した移行

次の手順では、バックアップと復元を使用してデータベースを移行するプロセスについて説明します。

  1. データベースのバックアップ - bash プロンプトで、次のコマンドを実行します。 データベースをバックアップするために必要な特権を持つユーザーの名前を指定します。

    pg_dump [database name] -h [source database server] -U [user name] -Fc > database_backup.bak
    
  2. Azure Database for PostgreSQL でターゲット データベースを作成します。

    az postgres db create \
        --name [database name] \
        --server-name [server name] \
        --resource-group [azure resource group] \
    
  3. bash プロンプトから pg_restore コマンドを使用して、バックアップを新しいデータベースに復元します。 Azure Database for PostgreSQL サービスで管理者権限を持つユーザーの名前を指定します。

    pg_restore -d [target database name] -h [server name in Azure Database for PostgreSQL] -Fc -U [user name] database_backup.bak