练习:将本地 MySQL 数据库迁移到 Azure Database for MySQL

已完成

在本练习中,你需要将 MySQL 数据库迁移到 Azure。 你要将在虚拟机上运行的现有 MySQL 数据库迁移到 Azure Database for MySQL。

你是 AdventureWorks 组织中的一名数据库开发人员。 十多年来,AdventureWorks 始终直接向最终消费者和分销商销售自行车和自行车零件。 该店的系统将信息存储在当前使用 MySQL 在 Azure VM 上运行的数据库中。 在实现硬件合理化的过程中,AdventureWorks 想要将该数据库移动到 Azure 托管的数据库。 组织要求你执行此迁移。

重要

免费的 Azure 沙盒环境不支持 Azure 数据迁移服务。 你可在自己的个人订阅中执行下列步骤,也可按照步骤了解如何迁移数据库。

设置环境

在 Cloud Shell 中运行下列 Azure CLI 命令,以创建运行 MySQL 的虚拟机(其中包含 AdventureWorks 数据库的副本)。 最后一个命令将打印新虚拟机的 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 门户

  2. 选择“+ 创建资源”。

  3. 在“搜索市场”框中,键入“Azure Database for MySQL”并按 Enter。

  4. 在“Azure Database for MySQL”页面上选择“创建”。

  5. 在“选择 Azure Database for MySQL 部署选项”页面上,在“灵活服务器”下选择“创建”。

  6. 在“创建 MySQL 服务器”页面上,输入以下详细信息,然后选择“查看 + 创建”:

    属性
    资源组 migrate-mysql
    服务器名称 adventureworksnnn,其中 nnn 是所选的后缀,用于使该服务器名称成为唯一名称
    数据源
    位置 选择最近的位置
    版本 5.7
    计算 + 存储 依次选择“配置服务器”、“基本”定价层和“确定”
    管理员用户名 awadmin
    密码 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] 替换为服务的后缀。 请注意,用户名具有 @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 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
    

使用数据库迁移服务执行联机迁移

  1. 切换回 Azure 门户。

  2. 依次单击“所有服务”和“订阅”,然后单击你的订阅。

  3. 在“订阅”页面的“设置”下,单击“资源提供程序”。

  4. 在“按名称筛选”框中,键入“DataMigration”,然后单击“Microsoft.DataMigration”。

  5. 如果未注册“Microsoft.DataMigration”,请单击“注册”,然后等待“状态”更改为“已注册”。 可能需要单击“刷新”才能看到状态更改。

  6. 选择“创建资源”,在“搜索市场”框中键入“Azure 数据库迁移服务”,然后按 Enter。

  7. 在“Azure 数据库迁移服务”页上,选择“创建”。

  8. 在“创建迁移服务”页面上,输入以下详细信息,然后选择“下一步: 网络>>”。

    属性
    选择资源组 migrate-mysql
    迁移服务名称 adventureworks_migration_service
    位置 选择最近的位置
    服务模式 Azure
    定价层 高级,带有 4 个 vCore
  9. 在“网络”页面上,选择 MySQLvnet/mysqlvmSubnet 虚拟网络。 此网络是在设置过程中创建的。

  10. 选择“查看 + 创建”,然后选择“创建” 。 等待数据库迁移服务创建完成。 这需要几分钟时间。

  11. 在 Azure 门户中,请转到数据库迁移服务页面。

  12. 选择“新建迁移项目”。

  13. 在“新建迁移项目”页面上,输入以下详细信息,然后选择“创建并运行活动”。

    属性
    项目名称 adventureworks_migration_project
    源服务器类型 MySQL
    适用于 MySQL 的目标数据库 Azure Database for MySQL
    选择活动类型 联机数据迁移
  14. 迁移向导启动后,在“选择源”页面上输入以下详细信息。

    属性
    源服务器名称 nn.nn.nn.nn(运行 MySQL 的 Azure 虚拟机的 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”页面,然后选择“刷新”。 滚动到“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 行。 第二个查询应返回 29 行。

  15. 使用 quit 命令关闭 mysql 实用工具。

  16. 使用 exit 命令关闭 ssh 连接。

清理已创建的资源

重要

如果你已在自己的个人订阅中执行了这些步骤,则可以分别删除资源或删除资源组以删除整个资源集。 持续运行资源可能会产生费用。

  1. 使用 Cloud Shell 运行此命令,以删除资源组:
az group delete --name migrate-mysql