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

完了

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

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

重要

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

環境を設定する

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

az account list-locations -o table

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

az vm create \
    --resource-group migrate-mysql \
    --name mysqlvm \
    --admin-username azureuser \
    --admin-password Pa55w.rdDemo \
    --image Ubuntu2204 \
    --public-ip-address-allocation static \
    --public-ip-sku Standard \
    --size Standard_B2ms 

az vm open-port \
    --resource-group migrate-mysql \
    --name mysqlvm \
    --priority 200 \
    --port '22'

az vm open-port \
    --resource-group migrate-mysql \
    --name mysqlvm \
    --priority 300 \
    --port '3306'

az vm run-command invoke \
    --resource-group migrate-mysql \
    --name mysqlvm \
    --command-id RunShellScript \
    --scripts "
    # MySQL installation
    sudo apt-get update && sudo apt-get upgrade -y
    sudo DEBIAN_FRONTEND=noninteractive apt-get install -y mysql-server

    # Disable Ubuntu Firewall bind mysql
    sudo ufw disable
    sudo bash << EOF
        echo "bind-address=0.0.0.0" >> /etc/mysql/mysql.conf.d/mysqld.cnf
        echo "log-bin" >> /etc/mysql/mysql.conf.d/mysqld.cnf
        echo "server-id=99" >> /etc/mysql/mysql.conf.d/mysqld.cnf
    EOF
    sudo service mysql stop
    sudo service mysql start 

    # Clone exercise code
    sudo git clone https://github.com/MicrosoftLearning/DP-070-Migrate-Open-Source-Workloads-to-Azure.git /home/azureuser/workshop
 
    # Add a password to mysql root user
    sudo mysqladmin -u root password Pa55w.rd
    # Use mysql to create users and an empty adventureworks 
    sudo mysql -u root -pPa55w.rd -e \"CREATE USER azureuser IDENTIFIED BY 'Pa55w.rd';GRANT ALL PRIVILEGES ON *.* TO azureuser;CREATE DATABASE adventureworks;\"
    # Use mysql to import the adventureworks database
    sudo mysql --user=azureuser --password=Pa55w.rd --database=adventureworks < /home/azureuser/workshop/migration_samples/setup/mysql/adventureworks/adventureworks.sql
    sudo service mysql restart"
    
MYSQLIP="$(az vm list-ip-addresses \
    --resource-group migrate-mysql \
    --name mysqlvm \
    --query "[].virtualMachine.network.publicIpAddresses[*].ipAddress" \
    --output tsv)"

echo $MYSQLIP

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

Azure Database for MySQL サーバーとデータベースを作成する

プロジェクトの最初のフェーズでは、会社の新しいデータベースをホストする Azure Database for MySQL を作成する必要があります。

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

  2. [+ リソースの作成] を選択します。

  3. [Marketplace を検索] ボックスに「Azure Database for MySQL」と入力し、Enter キーを押します。

  4. [Azure Database for MySQL] ページで、[作成] を選択します。

  5. [Azure Database for MySQL のデプロイ オプションの選択] ページの [フレキシブル サーバー] で、[作成] を選択します。

  6. [MySQL サーバーの作成] ページで、次の詳細を入力し、[確認および作成] を選択します。

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

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

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

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

  11. ファイアウォール規則の一覧で、VM という名前の規則を追加し、[開始 IP アドレス][終了 IP アドレス] に、MySQL サーバーを実行している仮想マシンの IP アドレスを設定します。 これは、Cloud Shell の最後の行として表示される IP アドレスです。

  12. [現在のクライアント IP アドレスを追加する] を選択して、クライアント マシンもデータベースにアクセスできるようにします。

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

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

    az MySQL db create \
    --name azureadventureworks \
    --server-name adventureworks[nnn] \
    --resource-group migrate-mysql
    

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

    {
          "charset": "latin1",
          "collation": "latin1_swedish_ci",
          "id": "/subscriptions/nnnnnnnnnnnnnnnnnnnnnnnnnnnnn/resourceGroups/nnnnnn/providers/Microsoft.DBforMySQL/servers/adventureworksnnnn/databases/azureadventureworks",
          "name": "azureadventureworks",
          "resourceGroup": migrate-mysql,
          "type": "Microsoft.DBforMySQL/servers/databases"
    }
    

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

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

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

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

    ssh azureuser@$MYSQLIP
    
  3. mysqldump ユーティリティを使用して、ソース データベースのスキーマをエクスポートします。

    mysqldump -u azureuser -pPa55w.rd adventureworks --no-data > adventureworks_mysql_schema.sql
    

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

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

    mysql -h adventureworks[nnn].MySQL.database.azure.com -u awadmin@adventureworks[nnn] -pPa55w.rdDemo
    
  2. 次のコマンドを実行して、azureuser という名前のユーザーを作成し、このユーザーのパスワードを Pa55w.rd に設定します。 2 番目のステートメントでは、azureadventureworks データベース内にオブジェクトを作成するために必要な特権を azureuser ユーザーに付与します。

    GRANT SELECT ON *.* TO 'azureuser'@'localhost' IDENTIFIED BY 'Pa55w.rd';
    GRANT CREATE ON *.* TO 'azureuser'@'localhost';
    
  3. 次のコマンドを実行して、adventureworks データベースを作成します。

    CREATE DATABASE adventureworks;
    
  4. quit コマンドを使用して、mysql ユーティリティを閉じます。

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

    mysql -h adventureworks[nnnn].MySQL.database.azure.com -u awadmin@adventureworks[nnn] -pPa55w.rdDemo adventureworks < adventureworks_mysql_schema.sql
    

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

  1. Azure portal に戻ります。

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

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

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

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

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

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

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

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

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

  11. Azure portal で、Database Migration Service のページにアクセスします。

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

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

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

    プロパティ [値]
    Source server name (依存元サーバー名) nn.nn.nn.nn "(MySQL を実行している Azure 仮想マシンの IP アドレス)"
    [サーバー ポート] 3306
    [ユーザー名] azureuser
    Password Pa55w.rd
  15. [次へ: ターゲットの選択>>] を選択します。

  16. [ターゲットの選択] ページで、次の詳細を入力します。

    プロパティ [値]
    ターゲット サーバー名 adventureworks[nnn].MySQL.database.azure.com
    [ユーザー名] awadmin@adventureworks[nnn]
    Password Pa55w.rdDemo
  17. [次へ: データベースの選択>>] を選択します。

  18. [データベースの選択] ページで、[ソース データベース][ターゲット データベース] の両方が adventureworks に設定されていることを確認し、[次へ: 移行の設定の構成] を選択します。

  19. [移行の設定の構成] ページで、[Next: Summary>>](次へ: 概要\>\>) を選択します。

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

  21. [AdventureWorks_Migration_Activity] ページで、[Refresh](最新の情報に更新) を 15 秒間隔で選択します。 移行操作の進行状況が表示されます。

  22. [移行の詳細] 列が [一括準備完了] に変わるまで待ちます。

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

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

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

  3. [adventureworks] ページで、すべてのテーブルの状態が [完了] としてマークされていることを確認します。

  4. [増分データ同期] を選択します。すべてのテーブルの状態が [同期中] としてマークされていることを確認します。

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

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

    mysql -pPa55w.rd adventureworks
    
  7. 次の SQL ステートメントを実行して、注文 43659、43660、および 43661 を表示し、その後データベースから削除します。

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

  9. Azure portal の [adventureworks] ページに戻り、[Refresh](最新の情報に更新) を選択します。 salesorderheader テーブルと salesorderdetail テーブルのページまでスクロールします。 salesorderheader テーブルで 3 行が削除されたことが示されていること、および sales.salesorderdetail テーブルから 29 行が削除されていることを確認します。 更新が適用されていない場合は、データベースに保留中の変更があることを確認してください。

  10. [一括で開始] を選択します。

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

  12. Cloud Shell に戻ります。

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

    mysql -h adventureworks[nnn].MySQL.database.azure.com -u awadmin@adventureworks[nnn] -pPa55w.rdDemo adventureworks
    
  14. 次の SQL ステートメントを実行して、注文 43659、43660、および 43661 の注文と詳細を表示します。 これらのクエリの目的は、データが転送されたことを示すことです。

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

    最初のクエリでは、3 行が返されます。 2 番目のクエリでは、29 行が返されます。

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

  16. exit コマンドを使用して ssh 接続を閉じます。

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

重要

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

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