練習:將內部部署 MySQL 資料庫移轉至 Azure MySQL Database

已完成

在此練習中,您會將 MySQL 資料庫移轉至 Azure。 您會將在虛擬機器上執行的現有 MySQL 資料庫移轉至 Azure MySQL Database。

您是 AdventureWorks 組織的資料庫開發人員。 十多年來,AdventureWorks 一直都將自行車與自行車零件直接銷售給終端消費者和經銷商。 其系統會將資訊儲存在目前以 MySQL 執行 Azure VM 的資料庫中。 為了合理化運用硬體,AdventureWorks 想將資料庫移至 Azure 管理的資料庫。 公司要求您負責執行此移轉作業。

重要

免費的 Azure 沙箱環境不支援 Azure 資料移轉服務。 您可以在自己的訂用帳戶中執行這些步驟,或是遵循以了解如何遷移資料庫。

設定環境

使用 AventureWorks 資料庫的複本,在 Cloud Shell 中執行 Azure 命令列介面命令,以建立執行 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 MySQL Database 伺服器和資料庫

專案的第一階段需要您建立適用 MySQL 的 Azure 資料庫,以裝載公司的新資料庫。

  1. 使用網頁瀏覽器開啟新的索引標籤,然後瀏覽至 Azure 入口網站

  2. 選取 [+ 建立資源]。

  3. 在 [搜尋 Marketplace] 方塊中,鍵入 Azure MySQL Database,然後按下 Enter。

  4. Azure MySQL Database 頁面上,選取 [建立]

  5. 在 [選取 Azure MySQL Database 部署選項] 頁面上,在 [彈性伺服器] 下選取 [建立]。

  6. 在 [建立 MySQL 伺服器] 頁面上,輸入下列詳細資料,然後選取 [檢閱 + 建立]

    屬性
    資源群組 migrate-mysql
    伺服器名稱 adventureworksnnn,其中 nnn 是您選擇的尾碼,可將伺服器名稱變成唯一
    資料來源 None
    Location 選取最接近您的位置
    版本 5.7
    計算 + 儲存體 選取 [設定伺服器],再選取 [基本定價層] ,然後選取 [確定]
    管理員使用者名稱 awadmin
    密碼 Pa55w.rdDemo
    確認密碼 Pa55w.rdDemo
  7. 在 [檢閱 + 建立] 頁面上,選取 [建立]。 等候服務建立完成,再繼續進行。

  8. 建立服務之後,選取 [前往資源]

  9. 選取 [連線安全性]

  10. 在 [連線安全性] 頁面上,將 [允許存取 Azure 服務] 設定為 [是]

  11. 在防火牆規則清單中,新增名為 [虛擬機器] 的規則,然後將 [起始 IP 位址] 與 [結束 IP 位址] 設為執行 MySQL 伺服器的虛擬機器 IP 位址。 此為 Cloud Shell 中列在最後一行的 IP 位址。

  12. 選取 [新增目前用戶端 IP 位址],以同時啟用您的用戶端機器來存取資料庫。

  13. [儲存] 並等候防火牆規則完成更新。

  14. 在 Cloud Shell 提示中執行下列指令,以在 Azure MySQL Database 服務中建立新的資料庫。 以 [nnn] 取代建立 Azure MySQL Database 服務時使用的尾碼。 以 [資源群組] 取代為服務指定的資源群組名稱:

    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 虛擬機器,以匯出資料庫結構。

  1. 執行此 Azure CLI 指令,以查看適用於虛擬機器的 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]。 請注意,使用者名稱的尾碼為 @adventureworks[nnn]。 出現密碼提示時,輸入 Pa55w.rdDemo

    mysql -h adventureworks[nnn].MySQL.database.azure.com -u awadmin@adventureworks[nnn] -pPa55w.rdDemo
    
  2. 執行下列命令,以建立名為 azureuser 的使用者,再將此使用者的密碼設定為 Pa55w.rd。 第二個陳述式提供 azureuser 使用者必要的權限,以在 azureadventureworks 資料庫中建立物件。

    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 MySQL Database 服務。 由於您目前是以 azureuser 的身分來執行匯入,因此,請在出現提示時輸入密碼 Pa55w.rd

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

使用資料庫移轉服務執行線上移轉

  1. 切換回到 Azure 入口網站。

  2. 按一下 [所有服務],按一下 [訂閱],再按一下您的訂閱。

  3. 在您的訂閱頁面上,於 [設定] 下方按一下 [資源提供者]

  4. 在 [依名稱篩選] 方塊中,鍵入 DataMigration,再按一下 Microsoft.DataMigration

  5. 若尚未註冊 [Microsoft.DataMigration],按一下 [註冊],等待 [狀態] 變更為 [已註冊]。 可能需要按一下 [重新整理] 來查看狀態是否變更。

  6. 選取 [建立資源],於 [搜尋 Marketplace] 方塊中,鍵入 [Azure 資料庫移轉服務],再按 Enter 鍵。

  7. 在 [Azure 資料庫移轉服務] 頁面上,選取 [建立]

  8. 在 [建立移轉服務] 頁面上,輸入下列詳細資料,然後選取 [下一步: 網路>>]

    屬性
    選取資源群組 migrate-mysql
    移轉服務名稱 adventureworks_migration_service
    Location 選取最接近您的位置
    服務模式 Azure
    定價層 進階,有 4 個虛擬核心
  9. 在 [網路] 頁面上,選取 MySQLvnet/mysqlvmSubnet 虛擬網路。 此網路是在設定過程中所建立。

  10. 選取 [檢閱 + 建立],然後選取 [建立]。 等候資料庫移轉服務建立完成。 這需要幾分鐘的時間。

  11. 在 Azure 入口網站中,前往您的資料庫移轉服務頁面。

  12. 選取 [新增移轉專案]

  13. 在 [新增移轉專案] 頁面上,輸入下列詳細資料,然後選取 [建立與執行活動]

    屬性
    專案名稱 adventureworks_migration_project
    來源伺服器類型 MySQL
    適用於 MySQL 的 目標資料庫 適用於 MySQL 的 Azure 資料庫
    選擇活動類型 線上資料移轉
  14. 移轉精靈啟動時,在 [選取來源] 頁面上輸入下列詳細資料。

    屬性
    來源伺服器名稱 nn.nn.nn.nn (執行 MySQL 的 Aure 虛擬機器的 IP 位址)
    伺服器通訊埠 3306
    使用者名稱 azureuser
    密碼 Pa55w.rd
  15. 選取 [下一步: 選取目標]>>

  16. 在 [選取目標] 頁面上輸入下列詳細資料。

    屬性
    目標伺服器名稱 adventureworks[nnn].MySQL.database.azure.com
    使用者名稱 awadmin@adventureworks[nnn]
    密碼 Pa55w.rdDemo
  17. 選取 [下一步: 選取資料庫 >>]

  18. 在 [選取資料庫] 頁面上,確保 [來源資料庫] 和 [目標資料庫] 皆設為 adventureworks,再選取 [下一步:設定移轉設定]

  19. 在 [設定移轉設設定] 頁面上,選取 [下一步:摘要 >>]

  20. 在 [移轉摘要] 頁面的 [活動名稱] 方塊中,鍵入 AdventureWorks_Migration_Activity,然後選取 [開始移轉]

  21. 在 [AdventureWorks_Migration_Activity] 頁面上,選取每隔 15 秒重新整理。 您將在移轉作業進行時看到其狀態。

  22. 請等到 [移轉詳細資料] 資料行變更為 [完全移轉已就緒]

修改資料和完全移轉至新的資料庫

  1. 退回至 Azure 入口網站中的 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 入口網站中的 adventureworks 頁面,然後選取 [重新整理]。 捲動頁面至 salesorderheadersalesorderdetail 資料表。 確認 salesorderheader 資料表指出已刪除 3 個資料列,且已從 sales.salesorderdetail 資料表中移除 29 個資料列。 若未套用任何更新,請檢查資料庫是否存在暫止的變更

  10. 選取 [開始完全移轉]

  11. 在 [完成完全移轉] 頁面上,選取 [確認],然後選取 [套用]。 請等候狀態變更為 [已完成]

  12. 返回 Cloud Shell。

  13. 執行下列命令,以連接到使用 Azure MySQL Database 服務執行的 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 個資料列。 第二個查詢應該會傳回 29 個資料列。

  15. 使用 quit 命令關閉 mysql 公用程式。

  16. 使用 exit 命令關閉 SSH 連線。

清除已建立的資源

重要

若是在自己的個人訂閱中執行這些步驟,您即可個別刪除資源,或是刪除資源群組來刪除整組資源。 資源若繼續執行,將需付費。

  1. 使用 Cloud Shell 執行下列命令以刪除資源群組:
az group delete --name migrate-mysql