数据库迁移最佳实践
使用 Azure Database Migration Service 将 SQL Server 数据库迁移到 Azure SQL,同时尽量减少停机时间,并解决常见的架构和兼容性问题。
数据库迁移最佳实践 是 CoddyKit 上的免费 Cloud & IT Cert Prep 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cloud & IT Cert Prep 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cloud & IT Cert Prep 课程共包含 4 节课。
数据库迁移为何不同
迁移数据库比迁移 VM 更复杂,因为数据库具有状态,并且通常全天候保持活动连接。简单的复制和还原方法需要数小时停机,这对于生产系统不可接受。数据库迁移的最佳做法是使用持续数据复制,在验证目标数据库的同时让源数据库和目标数据库保持同步,然后在流量重定向到新的 Azure 数据库时执行一次简短且计划好的切换。
Azure 数据库迁移服务
Azure Database Migration Service (DMS) 是一项完全托管的服务,用于编排从常见本地数据库引擎迁移到 Azure 托管数据库服务的在线迁移(近乎零停机)和离线迁移(基于停机)。DMS 支持包括 SQL Server、MySQL、PostgreSQL、MongoDB、Oracle 在内的源,以及 Azure SQL Database、Azure SQL Managed Instance、Azure Database for MySQL 和 Azure Cosmos DB 在内的目标。该服务与Data Migration Assistant (DMA) 集成,用于执行迁移前兼容性检查。
# Create a DMS instance
az dms create \
--service-name myDMS \
--resource-group myRG \
--location eastus \
--sku-name Premium_4vCores \
--vnet myVnet \
--subnet mySubnet使用 DMA 进行迁移前评估
迁移 SQL Server 之前,请针对源数据库运行Data Migration Assistant (DMA)。DMA 会识别:兼容性问题(数据库中使用但 Azure SQL 目标不支持的功能)、重大变更、已弃用的功能以及性能建议。它会生成详细的 HTML 报告,并按严重性排列问题优先级,以便您的团队在迁移窗口开始前解决这些问题。
# Run DMA assessment from CLI (Windows only)
# DmaCmd.exe /AssessmentName='SQL2022toAzureSQL' \
# /AssessmentSourcePlatform='SqlOnPrem' \
# /AssessmentTargetPlatform='AzureSqlDatabase' \
# /AssessmentDatabases='Server=myServer;Initial Catalog=AdventureWorks;Integrated Security=true'在线迁移与离线迁移
离线迁移会在整个迁移期间使源数据库离线,适用于小型数据库或可以安排维护窗口的非关键系统。在线迁移使用变更数据捕获(CDC)或事务日志传送,在加载新数据库的同时持续复制更改,将停机时间缩短到最后的切换步骤。对于大于 1 GB 的数据库,或服务级别协议要求停机时间少于 1 小时的数据库,建议使用在线迁移。
配置 DMS 迁移项目
DMS 迁移项目指定源连接(服务器名称、身份验证和数据库名称)、目标连接(Azure SQL 连接字符串)以及迁移模式(在线或离线)。您还需要选择要迁移的数据库和表。DMS 会在启动前验证连接性。迁移项目会保留在 Azure 门户中,因此您可以监视进度、重试失败的表并查看详细的活动日志。
# Create a DMS project for SQL Server to Azure SQL Database
az dms project create \
--service-name myDMS \
--resource-group myRG \
--name SQL2AzureSQL \
--source-platform SQL \
--target-platform SQLDB \
--location eastus先迁移架构
请始终先迁移架构,再迁移数据。使用 DMA 或 SQL Server Management Studio (SSMS) 将表、视图、存储过程、函数和索引编写为脚本并部署到目标 Azure SQL Database。在允许 DMS 开始传输数据之前,请验证所有架构对象均已存在并且能够无错误地编译。在迁移过程中途发现架构错误可能会破坏迁移运行,并迫使您从头开始。
# Generate schema scripts using sqlpackage
sqlpackage /Action:Script \
/SourceServerName:myOnPremServer \
/SourceDatabaseName:AdventureWorks \
/TargetServerName:mysqlserver.database.windows.net \
/TargetDatabaseName:AdventureWorksAzure \
/OutputPath:/tmp/schema.sql初始数据加载
DMS 通过逐表读取源数据库,并使用批量插入将行写入 Azure SQL 目标数据库,从而执行完整数据加载。在完整加载期间,该服务会将大型表拆分为多个批次进行处理。加载期间会禁用目标数据库上的索引以最大限度提高吞吐量,之后再重新生成索引。对于超大型数据库(TB 级别),可以考虑使用Azure 数据工厂或bacpac 导出预先加载数据,以缩短 DMS 的运行时间。
在线同步的更改数据捕获
对于在线迁移,DMS 会在源数据库上启用SQL Server 更改数据捕获(CDC),以捕获完整加载进行期间发生的 INSERT、UPDATE 和 DELETE 操作。完整加载完成后,DMS 会在目标数据库上重放这些捕获的更改,逐步缩小差距。当延迟降至接近零时,数据库即可进行切换。CDC 要求 SQL Server Agent 正在运行,并且源数据库处于完整恢复模式。
-- Enable CDC on source database
EXEC sys.sp_cdc_enable_db;
-- Enable CDC on specific table
EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name = N'Orders',
@role_name = NULL;切换与验证
当 CDC 延迟很小时,请在 DMS 门户中启动切换。DMS 会停止接收新的 CDC 事件,应用所有剩余更改,并将迁移标记为完成。此时,请将应用程序连接字符串重定向到 Azure SQL 终结点。针对关键表运行数据验证查询,比较源数据库和目标数据库的行数及校验和聚合值。切换完成后,让源数据库保持只读模式 24–48 小时,以便在需要时执行回滚。
-- Validate row counts post-cutover
SELECT TABLE_NAME, TABLE_ROWS
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'dbo'
ORDER BY TABLE_NAME;迁移后的性能优化
迁移后,Azure SQL Database 的性能可能与本地 SQL Server 不同,这是因为查询计划缓存、统计信息和硬件各不相同。运行Database Experimentation Assistant (DEA),在 Azure 目标环境中重放工作负载跟踪,并比较执行计划。在 Azure SQL 中启用Automatic Tuning,让服务自动创建或删除索引,并强制使用不会导致回归的查询计划,从而无需手动干预即可持续改善性能。
-- Enable Automatic Tuning on Azure SQL Database
ALTER DATABASE CURRENT SET AUTOMATIC_TUNING (
FORCE_LAST_GOOD_PLAN = ON,
CREATE_INDEX = ON,
DROP_INDEX = OFF
);其他数据库引擎的迁移
DMS 也支持迁移开源数据库引擎:使用mysqldump 加二进制日志复制模式将 MySQL 迁移到Azure Database for MySQL,并使用逻辑复制槽将 PostgreSQL 迁移到Azure Database for PostgreSQL。对于MongoDB 到 Cosmos DB的迁移,请使用 Cosmos DB for MongoDB API,以及原生的 mongodump / mongorestore 管道,或使用 Azure 数据工厂的 MongoDB 连接器执行增量 CDC。在针对实时数据运行迁移之前,请务必先在非生产副本上测试迁移。
# Offline MySQL migration using mysqldump
mysqldump -h source-server -u admin -p \
--single-transaction --routines --triggers \
myDatabase > /tmp/myDatabase.sql
# Restore to Azure Database for MySQL
mysql -h myserver.mysql.database.azure.com \
-u adminUser@myserver -p myDatabase < /tmp/myDatabase.sql快速检查
测试您对本课 Microsoft Azure Fundamentals (AZ-900) 概念的理解。
课程回顾
本课介绍了:Azure Database Migration Service 负责协调在线和离线数据库迁移;迁移前使用DMA 进行评估,可在迁移窗口开始前发现兼容性问题;而更改数据捕获则支持生产数据库近乎零停机的切换。接下来,我们将把重点转向 Azure 成本优化。
用 AI 导师学习 Cloud & IT Cert Prep — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 150
- 课程
- 600
常见问题解答
「数据库迁移最佳实践」课时是免费的吗?
是的 — 「数据库迁移最佳实践」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cloud & IT Cert Prep 课程的其余内容,请升级到 CoddyKit PRO。 Cloud & IT Cert Prep 课程共包含 4 节课。
「数据库迁移最佳实践」这节课中我会学到什么?
使用 Azure Database Migration Service 将 SQL Server 数据库迁移到 Azure SQL,同时尽量减少停机时间,并解决常见的架构和兼容性问题。 你通过在浏览器中直接运行的动手代码来练习 Cloud & IT Cert Prep,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Cloud & IT Cert Prep 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Cloud & IT Cert Prep 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「数据库迁移最佳实践」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Cloud & IT Cert Prep 课中编写并运行代码吗?
能。每节 Cloud & IT Cert Prep 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。