演習: オンプレミスの PostgreSQL データベースを Azure Database for PostgreSQL に移行する

完了

この演習では、PostgreSQL データベースを Azure に移行します。 仮想マシンで実行されている既存の PostgreSQL データベースを Azure Database for PostgreSQL に移行します。

あなたは、AdventureWorks という組織のデータベース開発者として働いています。 AdventureWorks では、10 年以上にわたってエンドユーザーと販売代理店に自転車や自転車の部品を直接販売しています。 システムでは、Azure VM で PostgreSQL を使用して現在実行されているデータベースに情報が格納されます。 ハードウェア合理化の演習の一環として、AdventureWorks では、データベースを Azure マネージド データベースに移動したいと考えています。 あなたは、この移行を行うよう求められました。

重要

Azure Data Migration Service は、無料の Azure サンドボックス環境ではサポートされていません。 これらの手順を自分の個人サブスクリプションで実行してみるのでも、読んでデータベースの移行方法を理解するだけでもかまいません。

環境を設定する

Cloud Shell でこれらの Azure CLI コマンドを実行して、AdventureWorks データベースのコピーを使用して PostgreSQL を実行する仮想マシンを作成します。 最後のコマンドでは、新しい仮想マシンの IP アドレスを出力します。

az account list-locations -o table

az group create \
    --name migrate-postgresql \
    --location <CHOOSE A LOCATION FROM ABOVE NEAR YOU>

az vm create \
    --resource-group migrate-postgresql \
    --name postgresqlvm \
    --admin-username azureuser \
    --admin-password Pa55w.rdDemo \
    --image Ubuntu2204 \
    --public-ip-address-allocation static \
    --public-ip-sku Standard \
    --vnet-name postgresqlvnet \
    --nsg ""

az vm run-command invoke \
    --resource-group migrate-postgresql \
    --name postgresqlvm \
    --command-id RunShellScript \
    --scripts "
# Install PostgreSQL
sudo echo deb http://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main > /etc/apt/sources.list.d/pgdg.list
sudo wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get -y update
sudo apt-get -y install postgresql-10
# Clone exercise code
sudo git clone https://github.com/MicrosoftLearning/DP-070-Migrate-Open-Source-Workloads-to-Azure.git /home/azureuser/workshop    
# Configure PostgreSQL
sudo service postgresql stop
sudo bash << EOF
    printf \"listen_addresses = '*'\nwal_level = logical\nmax_replication_slots = 5\nmax_wal_senders = 10\n\" >> /etc/postgresql/10/main/postgresql.conf
    printf \"host    all             all             0.0.0.0/0               md5\n\" >> /etc/postgresql/10/main/pg_hba.conf
EOF
sudo service postgresql start

# Add the azureuser role and adventure works
sudo bash << EOF
su postgres << EOC
printf \"create role azureuser with login;alter role azureuser createdb;alter role azureuser password 'Pa55w.rd';alter role azureuser superuser;create database adventureworks;grant all privileges on database adventureworks to azureuser; \" | psql
EOC
EOF

PGPASSWORD=Pa55w.rd psql -h localhost -U azureuser adventureworks -E -q -f /home/azureuser/workshop/migration_samples/setup/postgresql/adventureworks/adventureworks.sql
"

az vm open-port \
    --resource-group migrate-postgresql \
    --name postgresqlvm \
    --priority 200 \
    --port '22'

az vm open-port \
    --resource-group migrate-postgresql \
    --name postgresqlvm \
    --priority 300 \
    --port '5432'

echo Setup Complete

SQLIP="$(az vm list-ip-addresses \
    --resource-group migrate-postgresql \
    --name postgresqlvm \
    --query "[].virtualMachine.network.publicIpAddresses[*].ipAddress" \
    --output tsv)"

echo $SQLIP

これらのコマンドが完了するまで、約 5 分かかります。 待つ必要はありません。次の手順に進むことができます。

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

  1. Web ブラウザーを使用して新しいタブを開き、Azure portal に移動します。

  2. 検索バーに「Azure Database for PostgreSQL フレキシブル サーバー」と入力します。

  3. [Azure Database for PostgreSQL のフレキシブル サーバー] ページで、[+ 作成] を選択します。

  4. [フレキシブル サーバー] ページで、次の詳細を入力して、[確認および作成] を選択します。

    プロパティ
    Resource group migrate-postgresql
    サーバー名 adventureworksnnnnnn は、サーバー名を一意にするための任意のサフィックスです
    場所 最も近い場所を選択します
    PostgreSQL のバージョン 13
    コンピューティングとストレージ [サーバーの構成] を選択し、[Basic] 価格レベルを選択して、[OK] を選択します。
    管理者ユーザー名 awadmin
    Password Pa55w.rdDemo
    パスワードの確認 Pa55w.rdDemo
  5. [確認および作成] ページで、 [作成] を選択します。 サービスが作成されるまで待ってから続行します。

  6. サービスが作成されたら、[リソースに移動] を選択します。

  7. [接続のセキュリティ] を選択します。

  8. [接続のセキュリティ] ページで、[Azure サービスへのアクセスを許可する][はい] に設定します。

  9. ファイアウォール規則の一覧で、VM という名前の規則を追加し、[開始 IP アドレス][終了 IP アドレス] に、前に作成した PostgreSQL サーバーを実行している仮想マシンの IP アドレスを設定します。

  10. クライアント コンピューターからデータベースに接続できるようにするには、[現在のクライアント IP アドレスを追加する] を選択します。

  11. 保存し、ファイアウォール規則が更新されるまで待ちます。

  12. Cloud Shell プロンプトで、次のコマンドを実行して、Azure Database for PostgreSQL サービスに新しいデータベースを作成します。 [nnn] を Azure Database for PostgreSQL サービスの作成時に使用したサフィックスに置き換えます。 [リソース グループ]を、サービスに指定したリソース グループの名前に置き換えます。

    az postgres flexible-server create \
      --name azureadventureworks \
      --resource-group migrate-postgresql
    

    データベースが正常に作成されると、次のようなメッセージが表示されます。

    {
      "charset": "UTF8",
      "collation": "English_United States.1252",
      "name": "azureadventureworks",
      "resourceGroup": "migrate-postgresql",
      "type": "Microsoft.DBforPostgreSQL/servers/databases"
    }
    

ターゲット データベースで使用するスキーマをエクスポートする

次に、Cloud Shell を使用してデータベース スキーマをエクスポートし、既存の PostgreSQL VM に接続します。

  1. この Azure CLI コマンドを実行して、既存の VM の IP アドレスを確認します。

    SQLIP="$(az vm list-ip-addresses \
        --resource-group migrate-postgresql \
        --name postgresqlvm \
        --query "[].virtualMachine.network.publicIpAddresses[*].ipAddress" \
        --output tsv)"
    
    echo $SQLIP
    
  2. SSH を使用して古いデータベース サーバーに接続します。 パスワードとして「Pa55w.rdDemo」と入力します。

    ssh azureuser@$SQLIP
    
  3. 次のコマンドを実行して、仮想マシン上のデータベースに接続します。 仮想マシンで実行されている PostgreSQL サーバーの azureuser ユーザーのパスワードは、Pa55w.rd です。

    psql adventureworks
    
  4. Azure ユーザーにレプリケーション権限を付与します。

    ALTER ROLE azureuser REPLICATION;
    
  5. \q コマンドを使用して、psql ユーティリティを閉じます。

  6. Bash プロンプトで次のコマンドを実行して、adventureworks データベースのスキーマを adventureworks_schema.sql という名前のファイルにエクスポートし ます。

    pg_dump -o  -d adventureworks -s > adventureworks_schema.sql
    

スキーマをターゲット データベースにインポートする

  1. 次のコマンドを実行して、azureadventureworks[nnn] サーバーに接続します。 [nnn] の 2 つのインスタンスをサービスのサフィックスに置き換えます。 ユーザー名のサフィックスは @adventureworks[nnn] であることに注意してください。 パスワード プロンプトで、「Pa55w.rdDemo」と入力します。

    psql -h adventureworks[nnn].postgres.database.azure.com -U awadmin@adventureworks[nnn] -d postgres
    
  2. 次のコマンドを実行して、azureuser という名前のユーザーを作成し、このユーザーのパスワードを Pa55w.rd に設定します。 3 番目のステートメントは、azureadventureworks データベース内のオブジェクトを作成および管理するために必要な特権を azureuser ユーザーに付与します。 azure_pg_admin ロールを使用すると、azureuser ユーザーはデータベースに拡張機能をインストールして使用できます。

    CREATE ROLE azureuser WITH LOGIN;
    ALTER ROLE azureuser PASSWORD 'Pa55w.rd';
    GRANT ALL PRIVILEGES ON DATABASE azureadventureworks TO azureuser;
    GRANT azure_pg_admin TO azureuser;
    
  3. \q コマンドを使用して、psql ユーティリティを閉じます。

  4. Azure Database for PostgreSQL サービスで実行されている azureadventureworks データベースに adventureworks データベースのスキーマをインポートします。 インポートを azureuser として実行しているので、メッセージが表示されたらパスワード Pa55w.rd を入力します。

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks -E -q -f adventureworks_schema.sql
    

    各項目が作成されると、一連のメッセージが表示されます。 スクリプトは、エラーがない状態で完了する必要があります。

  5. 次のコマンドを実行します。 findkeys.sql スクリプトでは、azureadventureworks データベース内のテーブルからすべての外部キーを削除する dropkeys.sql という名前の別の SQL スクリプトが生成されます。 dropkeys.sql スクリプトをすぐに実行します。

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks -f workshop/migration_samples/setup/postgresql/adventureworks/findkeys.sql -o dropkeys.sql -t
    
  6. 次のコマンドを実行します。 createkeys.sqlスクリプトによって、addkeys.sql という名前の別の SQL スクリプトが生成され、すべての外部キーが再作成されます。 データベースを移行した後で、addkeys.sql スクリプトを実行します。

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks -f workshop/migration_samples/setup/postgresql/adventureworks/createkeys.sql -o addkeys.sql -t
    
  7. dropkeys.sql スクリプトを実行します。

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks -f dropkeys.sql
    

    外部キーが削除される際に、一連の ALTER TABLE メッセージが表示されます。

  8. psql ユーティリティを再実行し、azureadventureworks データベースに接続します。

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks
    
  9. 残りの外部キーの詳細を検索するには、次のクエリを実行します。

    SELECT constraint_type, table_schema, table_name, constraint_name
    FROM information_schema.table_constraints
    WHERE constraint_type = 'FOREIGN KEY';
    

    このクエリでは、空の結果セットが返されます。 ただし、外部キーがまだ存在する場合は、各外部キーに対して次のコマンドを実行します。

    ALTER TABLE [table_schema].[table_name] DROP CONSTRAINT [constraint_name];
    
  10. 残りの外部キーを削除したら、次の SQL ステートメントを実行して、データベース内のトリガーを表示します。

    SELECT trigger_name
    FROM information_schema.triggers;
    

    このクエリでは、データベースにトリガーが含まれていないことを示す空の結果セットも返される必要があります。 データベースにトリガーが含まれていた場合は、データを移行する前にそれらを無効にし、後で再度有効にする必要があります。

  11. \q コマンドを使用して、psql ユーティリティを閉じます。

Database Migration Service を使用してオンライン移行を実行する

  1. Azure portal に戻ります。

  2. [すべてのサービス] を選択し、[サブスクリプション] を選択して、自分のサブスクリプションを選択します。

  3. 対象のサブスクリプションのページの [設定] で、[リソース プロバイダー] をクリックします。

  4. [名前でフィルター] ボックスに「DataMigration」と入力し、その後 [Microsoft.DataMigration] を選択します。

  5. Microsoft.DataMigration が登録されていない場合は、[登録] を選択し、[状態][登録済み] に変わるまで待ちます。 状態の変化を確認するには、[更新] を選択する必要がある場合があります。

  6. [リソースの作成] を選択し、[Marketplace で検索] ボックスに「Azure Database Migration Service」と入力して、Enter キーを押します。

  7. [Azure Database Migration Service] ページで、 [作成] を選択します。

  8. [移行サービスの作成] ページで、次の詳細を入力し、[次へ: ネットワーク>>] を選択します。

    プロパティ [値]
    リソース グループの選択 migrate-postgresql
    [サービス名] adventureworks_migration_service
    場所 最も近い場所を選択します
    サービス モード Azure
    Pricing tier Premium、4 つの仮想コア
  9. [ネットワーク] ページで、postgresqlvnet/posgresqlvmSubnet 仮想ネットワークを選択します。 このネットワークは、セットアップの一部として作成されました。

  10. [確認および作成] を選択し、次に [作成] を選択します。 Database Migration Service が作成されるまで待機します。 この処理には数分かかります。

  11. サービスが作成されたら、[リソースに移動] を選択します。

  12. [新しい移行プロジェクト] を選択します。

  13. [新しい移行プロジェクト] ページで、次の詳細を入力し、[アクティビティの作成と実行] を選択します。

    プロパティ [値]
    プロジェクト名 adventureworks_migration_project
    ソース サーバー名 PostgreSQL
    PostgreSQL のターゲット データベース Azure Database for PostgreSQL
    アクティビティの種類を選択します オンライン データ移行
  14. 移行ウィザードが起動したら、[ソースの選択] ページで次の詳細を入力し、[次へ: ターゲットの選択]>> を選択します。

    プロパティ [値]
    Source server name (依存元サーバー名) nn.nn.nn.nn (PostgreSQL を実行する Azure 仮想マシンの IP アドレス)
    [サーバー ポート] 5432
    データベース adventureworks
    [ユーザー名] azureuser
    Password Pa55w.rd
    [サーバー証明書を信頼する] Selected
    暗号化接続 Selected
  15. [ターゲットの選択] ページで、次の詳細を入力し、[次へ: データベースの選択]>> を選択します。

    プロパティ [値]
    Azure PostgreSQL adventureworks[nnn]
    データベース azureadventureworks
    [ユーザー名] azureuser@adventureworks[nnn]
    Password Pa55w.rd
  16. [データベースの選択] ページで、adventureworks データベースを選択し、azureadventureworks にマップします。 postgres データベースの選択を解除します。 [次へ: テーブルの選択]>> を選択します。

  17. [テーブルの選択] ページで、[次へ: 移行設定の構成]>> を選択します。

  18. [移行設定の構成] ページで、[adventureworks] ドロップダウンを展開し、[オンライン移行の詳細設定] ドロップダウンを展開し、[同時に読み込むインスタンスの最大数] が 5 に設定されていることを確認し、その後 [次へ: 概要]>> を選択します。

  19. [概要] ページで、[アクティビティ名] ボックスに「AdventureWorks_Migration_Activity」と入力し、[移行の開始] を選択します。

  20. [AdventureWorks_Migration_Activity] ページで、[最新の情報に更新] を 15 秒間隔で選択します。 移行操作の進行状況が表示されます。 [MIGRATION DETAILS] 列が [カットオーバー可能] になるまで待ってください。

  21. 切り替えて Cloud Shell に戻ります。

  22. 次のコマンドを実行して、azureadventureworks データベースの外部キーを再作成します。 前の手順で addkeys.sql スクリプトを生成しました。

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks -f addkeys.sql
    

    外部キーが追加されると、一連の ALTER TABLE ステートメントが表示されます。 SpecialOfferProduct テーブルに関するエラーが表示されることがあります。ここでは無視してかまいません。 これは、正しく転送されない UNIQUE 制約が原因です。 実際には、次のクエリを使用して、ソース データベースからこの制約の詳細を取得する必要があります。

    SELECT constraint_type, table_schema, table_name, constraint_name
    FROM information_schema.table_constraints
    WHERE constraint_type = 'UNIQUE';
    

    その後、Azure Database for PostgreSQL でターゲット データベースのこの制約を手動で復帰させることができます。

    他にエラーはないはずです。

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

  1. Azure portal の [AdventureWorks_Migration_Activity] ページに戻ります。

  2. adventureworks データベースを選択します。

  3. [adventureworks] ページで、[完全な読み込みが完了] の値が 66 で、他のすべての値が 0 であることを確認します。

  4. 切り替えて Cloud Shell に戻ります。

  5. 次のコマンドを実行して、仮想マシンで PostgreSQL を使用して実行されている adventureworks データベースに接続します。

    psql adventureworks
    
  6. 次の SQL ステートメントを実行して表示し、次にデータベースから注文 43659、43660、および 43661 を削除します。 データベースでは salesorderheader テーブルに連鎖削除が実施されることに注意してください。これにより、salesorderdetail テーブルから対応する行が自動的に削除されます。

    SELECT * FROM sales.salesorderheader WHERE salesorderid IN (43659, 43660, 43661);
    SELECT * FROM sales.salesorderdetail WHERE salesorderid IN (43659, 43660, 43661);
    DELETE FROM sales.salesorderheader WHERE salesorderid IN (43659, 43660, 43661);
    
  7. \q コマンドを使用して、psql ユーティリティを閉じます。

  8. Azure portal の [adventureworks] ページに戻り、[最新の情報に更新] を選択します。 32 の変更が適用されていることを確認します。

  9. [カットオーバーを開始] を選択します。

  10. [カットオーバーの完了] ページで [確認] を選択し、[適用] を選択します。 状態が [完了] に変わるまで待機します。

  11. Cloud Shell に戻ります。

  12. 次のコマンドを実行して、Azure Database for PostgreSQL サービスを使用して実行されている azureadventureworks データベースに接続します。

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks
    

    パスワードは Pa55w.rd です。

  13. 次の SQL ステートメントを実行して、データベース内の注文と注文の詳細を表示します。 各テーブルの最初のページの後に終了します。 これらのクエリの目的は、データが転送されたことを示すことです。

    SELECT * FROM sales.salesorderheader;
    SELECT * FROM sales.salesorderdetail;
    
  14. 次の SQL ステートメントを実行して、注文 43659、43660、および 43661 の注文と詳細を表示します。

    SELECT * FROM sales.salesorderheader WHERE salesorderid IN (43659, 43660, 43661);
    SELECT * FROM sales.salesorderdetail WHERE salesorderid IN (43659, 43660, 43661);
    

    どちらのクエリも、0 行を返す必要があります。

  15. \q コマンドを使用して、psql ユーティリティを閉じます。

作成したリソースをクリーンアップする

重要

独自の個人用サブスクリプションでこれらの手順を実行した場合は、リソースを個別に削除するか、リソース グループを削除してリソースのセット全体を削除することができます。 リソースを実行したままにすると、お金がかかる場合があります。

  1. リソース グループを削除するには、Cloud Shell を使用して次のコマンドを実行します。
az group delete --name migrate-postgresql