使用自动化大规模迁移数据库

Azure Database Migration Service提供以下功能:

  • 可靠、可复原且容错的服务,可协调数据移动活动以提供无缝迁移体验。

  • 以联机(适用于需要最短停机时间的迁移)或脱机(适用于迁移期间持续停机的迁移)迁移模式的功能,可满足你的业务需求。

  • 灵活地创建和配置自托管集成运行时,以提供您自己的计算能力用于访问本地环境中的源SQL Server及其备份。

借助自动化工具(如 PowerShell - Azure DataMigration 服务模块Azure CLI,可以大规模迁移一个或多个数据库,包括跨多个SQL Server实例的数据库。

可以使用Azure PowerShell或Azure CLI引用以下示例脚本来满足迁移方案:

迁移方案 脚本语言
SQL Server评估 PowerShell / Azure CLI
SQL Server 到 Azure SQL 托管实例(使用文件共享) PowerShell / Azure CLI
SQL Server 到 Azure SQL 托管实例(使用 Azure 存储) PowerShell / Azure CLI
SQL Server 到 Azure 虚拟机上的 SQL Server(使用文件共享) PowerShell / Azure CLI
Azure 虚拟机上的 SQL Server 到 SQL Server(使用 Azure 存储) PowerShell / Azure CLI
从 SQL Server 到 Azure SQL 数据库 PowerShell / Azure CLI
SKU 建议 PowerShell / Azure CLI
端到端迁移自动化 PowerShell / Azure CLI
针对多个数据库的端到端迁移自动化 PowerShell / Azure CLI

先决条件

使用Azure PowerShell或Azure CLI在所有受支持的迁移方案中通用的先决条件包括:

  • 有一个 Azure 帐户,并且该帐户被分配给以下列出的内置角色之一:

    • 目标 Azure SQL 托管实例、Azure 虚拟机上的 SQL Server 或 Azure SQL 数据库的管理者,以及用于从 SMB 网络共享上传数据库备份文件的存储帐户(不适用于 Azure SQL 数据库)。

    • 包含目标Azure SQL Managed Instance、SQL Server on Azure Virtual Machines或Azure SQL Database的Azure资源组的读取者角色。

    • Azure订阅的所有者或贡献者角色。

    仅在运行迁移步骤时才需要Azure帐户,而评估或Azure建议步骤不需要。

  • 在 Azure Virtual Machine 上创建目标 Azure SQL Managed InstanceSQL ServerAzure SQL Database

    如果目标是 Azure SQL Database,则必须使用 Visual Studio Code 的 Data 层应用程序体验SQL 数据库项目扩展将数据库架构从源迁移到目标。

    如果有现有的Azure虚拟机,则应在完全管理模式下向 SQL Server IaaS 代理扩展注册它

  • 如果目标是Azure SQL 托管实例Azure 虚拟机上的 SQL Server,请确保用于连接源 SQL Server 的登录名是sysadmin服务器角色的成员,或者具有CONTROL SERVER权限。

  • 如果目标是 Azure SQL 数据库,请确保用于连接源 SQL Server 的登录名是成员,并确保目标 SQL Server 的 db_datareader 和登录名 db_owner 也是成员。

  • 为完整数据库和事务日志备份文件使用以下存储选项之一:

    • SMB 网络共享

    • Azure 存储帐户文件共享或 Blob 容器

      • 如果数据库备份文件在 SMB 网络共享中提供,创建一个Azure存储帐户,以便 DMS 服务上传数据库备份文件。 请确保在创建Azure Database Migration Service实例所在的同一区域中创建Azure Storage帐户。

      • 请确保Azure存储帐户 blob 容器仅用于存储备份文件。 任何其他文件类型(.txt.png.jpg等)都会干扰还原过程,从而导致失败。

      • Azure Database Migration Service不会启动任何备份,而是使用现有的备份(你可能已在灾难恢复计划中)进行迁移。

      • 可以将每个备份写入单个独立的备份文件或多个备份文件。 但是,不支持将多个备份(即完整备份和 t-log)追加到单个备份介质。

      • 使用压缩的备份来减少遇到与迁移大型备份相关的潜在问题的可能性。

  • 确保运行源SQL Server实例的服务帐户对包含数据库备份文件的 SMB 网络共享具有读取和写入权限。

  • 源SQL Server的实例证书,来自受透明数据加密(TDE)保护的数据库,必须在迁移数据之前被迁移到目标Azure SQL托管实例或Azure虚拟机上的SQL Server。

    小窍门

    如果数据库包含受 Always Encrypted 保护的敏感数据,迁移过程会自动将 Always Encrypted 密钥迁移到Azure虚拟机上的目标Azure SQL Managed Instance或SQL Server。

  • 如果数据库备份在网络文件共享中,请提供计算机以安装自承载集成运行时,以访问和迁移数据库备份。 Azure PowerShell或Azure CLI模块提供用于注册自承载集成运行时的身份验证密钥。 在为迁移做准备时,请确保计划安装自承载集成运行时的计算机启用了以下出站防火墙规则和域名:

    域名 出站端口 说明
    中国:{datafactory}.{region}.datafactory.azure.cn 443 自承载集成运行时连接到数据迁移服务时需要此端口。
    对于新建的数据工厂,请在自承载 Integration Runtime 键中找到 FQDN,该密钥的格式为 {datafactory}.{region}.datafactory.azure.cn。 对于旧数据工厂,如果在自承载集成密钥中找不到 FQDN,请改用 *.frontend.clouddatahub.net。
    download.microsoft.com 443 自托管集成运行时在下载更新时需要此端口。 如果禁用了自动更新,则可以跳过配置此域。
    *.core.chinacloudapi.cn 443 用于连接到 Azure 存储帐户并从您的网络共享上传数据库备份的自托管集成运行时

    如果数据库备份文件已在Azure存储帐户中提供,则迁移过程中不需要自承载集成运行时。

  • 使用自承载集成运行时时,请确保安装运行时的计算机可以连接到源SQL Server实例以及备份文件所在的网络文件共享。

  • 应该启用出站端口 445,用于访问网络文件共享。

  • 如果您是首次使用 Azure 数据库迁移服务,请确认已经在您的订阅中注册了 Microsoft.DataMigration 资源提供器。 可以按照步骤注册资源提供程序

    如果迁移目标Azure SQL Database,则不需要备份来执行此迁移。 迁移到Azure SQL Database被视为逻辑迁移,涉及数据库的预创建和数据移动(由 DMS 执行)。

自动执行数据库迁移

使用 Azure PowerShell Az.DataMigration 或 Azure CLI az datamigration,可以自动化地创建 Azure 数据库迁移服务、配置数据库的联机迁移,并执行切换,从而迁移数据库。 Azure 示例中记录了多个命令和功能。

使用 Azure CLI自动迁移SQL Server数据库的示例:

Step 1:创建Azure Database Migration Service,用于协调数据库的迁移活动。

#STEP 1: Create Database Migration Service
az datamigration sql-service create --resource-group "myRG" --sql-migration-service-name "myMigrationService" --location "ChinaNorth3"

步骤 2:配置和启动从本地 SQL Server(Azure 存储中的备份)到 Azure SQL 托管实例的联机数据库迁移。

#STEP 2: Start Migration
az datamigration sql-managed-instance create `
--source-location '{\"AzureBlob\":{\"storageAccountResourceId\":\"/subscriptions/mySubscriptionID/resourceGroups/myRG/providers/Microsoft.Storage/storageAccounts/dbbackupssqlbits\",\"accountKey\":\"myAccountKey\",\"blobContainerName\":\"dbbackups\"}}' `
--migration-service "/subscriptions/mySubscriptionID/resourceGroups/myRG/providers/Microsoft.DataMigration/SqlMigrationServices/myMigrationService" `
--scope "/subscriptions/mySubscriptionID/resourceGroups/myRG/providers/Microsoft.Sql/managedInstances/mySQLMI" `
--source-database-name "AdventureWorks2008" `
--source-sql-connection authentication="SqlAuthentication" data-source="mySQLServer" password="<password>" user-name="sqluser" `
--target-db-name "AdventureWorks2008" `
--resource-group myRG `
--managed-instance-name mySQLMI

步骤 3:将所有备份还原到 Azure SQL 托管实例后,执行迁移割接。

#STEP 3: Get migration ID and perform Cutover
$migOpId = az datamigration sql-managed-instance show --managed-instance-name "mySQLMI" --resource-group "myRG" --target-db-name "AdventureWorks2008" --expand=MigrationStatusDetails --query "properties.migrationOperationId"
az datamigration sql-managed-instance cutover --managed-instance-name "mySQLMI" --resource-group "myRG" --target-db-name "AdventureWorks2008" --migration-operation-id $migOpId

如果收到错误 The subscription is not registered to use namespace 'Microsoft.DataMigration'. See https://aka.ms/rps-not-found for how to register subscriptions.,请运行以下命令:

Register-AzResourceProvider -ProviderNamespace "Microsoft.DataMigration"