练习:将本地 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 来托管公司的新数据库。
使用 Web 浏览器打开新的标签页,然后导航到 Azure 门户。
选择“+ 创建资源”。
在“搜索市场”框中,键入“Azure Database for MySQL”并按 Enter。
在“Azure Database for MySQL”页面上选择“创建”。
在“选择 Azure Database for MySQL 部署选项”页面上,在“灵活服务器”下选择“创建”。
在“创建 MySQL 服务器”页面上,输入以下详细信息,然后选择“查看 + 创建”:
属性 值 资源组 migrate-mysql 服务器名称 adventureworksnnn,其中 nnn 是所选的后缀,用于使该服务器名称成为唯一名称 数据源 无 位置 选择最近的位置 版本 5.7 计算 + 存储 依次选择“配置服务器”、“基本”定价层和“确定” 管理员用户名 awadmin 密码 Pa55w.rdDemo 确认密码 Pa55w.rdDemo 在“查看 + 创建”页面上,选择“创建”。 等待服务创建完毕,然后再继续操作。
创建服务后,选择“转到资源”。
选择“连接安全性”。
在“连接安全性”页面上,将“允许访问 Azure 服务”设置为“是”。
在防火墙规则列表中,添加一个名为“VM”的规则,将“起始 IP 地址”和“结束 IP 地址”设置为运行 MySQL 服务器的虚拟机的 IP 地址。 它是作为 Cloud Shell 中的最后一行列出的 IP 地址。
选择“添加当前客户端 IP 地址”,使客户端计算机也能访问数据库。
单击“保存”,然后等待防火墙规则更新完成。
在 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,以导出数据库架构。
运行以下 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
使用 SSH 连接到旧的数据库服务器。 输入“Pa55w.rdDemo”作为密码。
ssh azureuser@$MYSQLIP
使用 mysqldump 实用工具导出源数据库的架构:
mysqldump -u azureuser -pPa55w.rd adventureworks --no-data > adventureworks_mysql_schema.sql
将架构导入到目标数据库
在 Cloud Shell 中运行以下命令,连接到 azureadventureworks[nnn] 服务器。 将两个实例的 [nnn] 替换为服务的后缀。 请注意,用户名具有 @adventureworks[nnn] 后缀。 在密码提示符下,输入 Pa55w.rdDemo。
mysql -h adventureworks[nnn].MySQL.database.azure.com -u awadmin@adventureworks[nnn] -pPa55w.rdDemo
运行以下命令创建一位名为“azureuser”的用户,并将该用户的密码设置为“Pa55w.rd”。 第二个语句为 azureuser 用户提供在 azureadventureworks 数据库中创建对象所需的特权。
GRANT SELECT ON *.* TO 'azureuser'@'localhost' IDENTIFIED BY 'Pa55w.rd'; GRANT CREATE ON *.* TO 'azureuser'@'localhost';
运行以下命令创建一个 adventureworks 数据库。
CREATE DATABASE adventureworks;
使用 quit 命令关闭 mysql 实用工具。
将 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
使用数据库迁移服务执行联机迁移
切换回 Azure 门户。
依次单击“所有服务”和“订阅”,然后单击你的订阅。
在“订阅”页面的“设置”下,单击“资源提供程序”。
在“按名称筛选”框中,键入“DataMigration”,然后单击“Microsoft.DataMigration”。
如果未注册“Microsoft.DataMigration”,请单击“注册”,然后等待“状态”更改为“已注册”。 可能需要单击“刷新”才能看到状态更改。
选择“创建资源”,在“搜索市场”框中键入“Azure 数据库迁移服务”,然后按 Enter。
在“Azure 数据库迁移服务”页上,选择“创建”。
在“创建迁移服务”页面上,输入以下详细信息,然后选择“下一步: 网络>>”。
属性 值 选择资源组 migrate-mysql 迁移服务名称 adventureworks_migration_service 位置 选择最近的位置 服务模式 Azure 定价层 高级,带有 4 个 vCore 在“网络”页面上,选择 MySQLvnet/mysqlvmSubnet 虚拟网络。 此网络是在设置过程中创建的。
选择“查看 + 创建”,然后选择“创建” 。 等待数据库迁移服务创建完成。 这需要几分钟时间。
在 Azure 门户中,请转到数据库迁移服务页面。
选择“新建迁移项目”。
在“新建迁移项目”页面上,输入以下详细信息,然后选择“创建并运行活动”。
属性 值 项目名称 adventureworks_migration_project 源服务器类型 MySQL 适用于 MySQL 的目标数据库 Azure Database for MySQL 选择活动类型 联机数据迁移 迁移向导启动后,在“选择源”页面上输入以下详细信息。
属性 值 源服务器名称 nn.nn.nn.nn(运行 MySQL 的 Azure 虚拟机的 IP 地址) 服务器端口 3306 用户名 azureuser 密码 Pa55w.rd 选择“下一页: 选择目标>>”。
在“选择目标”页面上,输入以下详细信息。
属性 值 目标服务器名称 adventureworks[nnn].MySQL.database.azure.com 用户名 awadmin@adventureworks[nnn] 密码 Pa55w.rdDemo 选择“下一页: 选择数据库>>”。
在“选择数据库”页面上,确保“源数据库”和“目标数据库”均已设置为“adventureworks”,然后选择“下一步: 配置迁移设置”。
在“配置迁移设置”页面上,选择“下一页: 摘要>>”。
在“迁移摘要”页面上,在“活动名称”框中键入“AdventureWorks_Migration_Activity”,然后选择“开始迁移”。
在“AdventureWorks_Migration_Activity”页面上,每隔 15 秒选择一次“刷新”。 你会在迁移操作的进行过程中看到其状态。
等待“迁移详细信息”列更改为“可直接转换”。
修改数据并直接转换到新数据库
返回到 Azure 门户中的“AdventureWorks_Migration_Activity”页面。
选择 adventureworks 数据库。
在“adventureworks”页面上,验证是否已将所有表的状态都标记为“已完成”。
选择“增量数据同步”。验证是否已将每个表的状态都标记为“正在同步”。
切换回 Cloud Shell。
运行以下命令,连接到在虚拟机上使用 MySQL 运行的 adventureworks 数据库:
mysql -pPa55w.rd adventureworks
执行以下 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);
使用 quit 命令关闭 mysql 实用工具。
返回到 Azure 门户中的“adventureworks”页面,然后选择“刷新”。 滚动到“salesorderheader”和“salesorderdetail”表对应的页面。 验证“salesorderheader”表是否指示已删除 3 行并且已从“sales.salesorderdetail”表中删除 29 行。 如果未应用任何更新,请查看数据库是否存在“挂起的更改”。
选择“启动直接转换”。
在“完成直接转换”页上,选择“确认”,然后选择“应用”。 等待状态更改为“已完成”。
退回到 Cloud Shell。
运行以下命令,连接到使用 Azure Database for MySQL 服务运行的 azureadventureworks 数据库:
mysql -h adventureworks[nnn].MySQL.database.azure.com -u awadmin@adventureworks[nnn] -pPa55w.rdDemo adventureworks
运行以下 SQL 语句,显示订单以及订单 43659、43660 和 43661 的详细信息。 这些查询的目的是显示已传输数据:
SELECT * FROM salesorderheader WHERE salesorderid IN (43659, 43660, 43661); SELECT * FROM salesorderdetail WHERE salesorderid IN (43659, 43660, 43661);
第一个查询应返回 3 行。 第二个查询应返回 29 行。
使用 quit 命令关闭 mysql 实用工具。
使用 exit 命令关闭 ssh 连接。
清理已创建的资源
重要
如果你已在自己的个人订阅中执行了这些步骤,则可以分别删除资源或删除资源组以删除整个资源集。 持续运行资源可能会产生费用。
- 使用 Cloud Shell 运行此命令,以删除资源组:
az group delete --name migrate-mysql