使用 PowerShell 和 Azure 数据库迁移服务将 SQL Server 联机迁移到 SQL 托管实例

在本文中,我们将使用 Azure PowerShell 将还原为 SQL Server 2005 或更高版本的本地实例的 Adventureworks2016 数据库联机迁移到 Azure SQL 托管实例。 可以使用 Azure PowerShell 中的 Az.DataMigration 模块,将数据库从 SQL Server 实例迁移到 SQL 托管实例。

在本文中,学习如何:

  • 创建资源组。
  • 创建 Azure 数据库迁移服务的实例。
  • 在 Azure 数据库迁移服务实例中创建迁移项目。
  • 运行联机迁移。

提示

在 Azure 数据库迁移服务中,可以脱机或联机迁移数据库。 使用脱机迁移时,应用程序停机时间从迁移开始时算起。 若要将停机时间限制为迁移后直接转换到新环境所需的时间,请使用联机迁移。 建议测试脱机迁移,以确定停机时间是否可接受。 如果无法接受预期的停机时间,请进行联机迁移。

本文提供联机迁移的步骤,但也可以进行脱机迁移。

先决条件

若要完成这些步骤,需满足以下条件:

创建资源组

Azure 资源组是在其中部署和管理 Azure 资源的逻辑容器。

使用 New-AzResourceGroup 命令创建资源组。

以下示例在“中国东部 2”区域创建名为“myResourceGroup” 的资源组。

New-AzResourceGroup -ResourceGroupName myResourceGroup -Location ChinaEast2

创建 DMS 的实例

可以通过 New-AzDataMigrationService cmdlet 创建 Azure 数据库迁移服务的新实例。 此 cmdlet 需要以下必需参数:

  • Azure 资源组名称。 可以使用 New-AzResourceGroup 命令创建前述 Azure 资源组,并提供其名称作为参数。
  • 服务名称。 与 Azure 数据库迁移服务的所需唯一服务名称相对应的字符串。
  • 位置。 指定服务的位置。 指定 Azure 数据中心位置,例如“ChinaEast 2”。
  • Sku。 此参数对应于 DMS Sku 名称。 目前支持的 SKU 名称为 Basic_1vCoreBasic_2vCoresGeneralPurpose_4vCores
  • 虚拟子网标识符。 可以使用 cmdlet New-AzVirtualNetworkSubnetConfig 创建子网。

以下示例使用名为 MyVNET 的虚拟网络和名为 MySubnet 的子网,在位于“中国东部 2”区域的资源组 MyDMSResourceGroup 中创建名为 MyDMS 的服务。

$vNet = Get-AzVirtualNetwork -ResourceGroupName MyDMSResourceGroup -Name MyVNET

$vSubNet = Get-AzVirtualNetworkSubnetConfig -VirtualNetwork $vNet -Name MySubnet

$service = New-AzDms -ResourceGroupName myResourceGroup `
  -ServiceName MyDMS `
  -Location ChinaEast2 `
  -Sku Basic_2vCores `  
  -VirtualSubnetId $vSubNet.Id`

创建迁移项目

在创建 Azure 数据库迁移服务实例以后,创建迁移项目。 Azure 数据库迁移服务项目需要源和目标实例的连接信息,以及要在项目中迁移的数据库的列表。 定义源和目标连接性连接字符串。

以下脚本定义了源 SQL Server 连接详细信息:

# Source connection properties
$sourceDataSource = "<mysqlserver.domain.com/privateIP of source SQL>"
$sourceUserName = "domain\user"
$sourcePassword = "mypassword"

以下脚本定义了目标 SQL 托管实例连接详细信息:

# Target MI connection properties
$targetMIResourceId = "/subscriptions/<subid>/resourceGroups/<rg>/providers/Microsoft.Sql/managedInstances/<myMI>"
$targetUserName = "<user>"
$targetPassword = "<password>"

定义源和目标数据库映射

提供要在此迁移项目中迁移的数据库

以下脚本使用提供的名称将源数据库映射到目标 SQL 托管实例上的相应新数据库。

# Selected databases (Source database name to target database name mapping)
$selectedDatabasesMap = New-Object System.Collections.Generic.Dictionary"[String,String]" 
$selectedDatabasesMap.Add("<source  database name>", "<target database name> ")

对于多个数据库,请使用以下格式将数据库列表添加到上述脚本中:

$selectedDatabasesMap = New-Object System.Collections.Generic.Dictionary"[String,String]" 
$selectedDatabasesMap.Add("<source  database name1>", "<target database name1> ")
$selectedDatabasesMap.Add("<source  database name2>", "<target database name2> ")

创建 DMS 项目

可以在 DMS 实例中创建 Azure 数据库迁移服务项目。

# Create DMS project
$project = New-AzDataMigrationProject `
  -ResourceGroupName $dmsResourceGroupName `
  -ServiceName $dmsServiceName `
  -ProjectName $dmsProjectName `
  -Location $dmsLocation `
  -SourceType SQL `
  -TargetType SQLMI `

# Create selected databases object
$selectedDatabases = @();
foreach ($sourceDbName in $selectedDatabasesMap.Keys){
    $targetDbName = $($selectedDatabasesMap[$sourceDbName])
    $selectedDatabases += New-AzDmsSelectedDB -MigrateSqlServerSqlDbMi `
      -Name $sourceDbName `
      -TargetDatabaseName $targetDbName `
      -BackupFileShare $backupFileShare `
}

创建备份 FileShare 对象

现在,使用 New-AzDmsFileShare cmdlet 创建 FileShare 对象,用于 Azure 数据库迁移服务可将源数据库备份迁移到的本地 SMB 网络共享。

# SMB Backup share properties
$smbBackupSharePath = "\\shareserver.domain.com\mybackup"
$smbBackupShareUserName = "domain\user"
$smbBackupSharePassword = "<password>"

# Create backup file share object
$smbBackupSharePasswordSecure = ConvertTo-SecureString -String $smbBackupSharePassword -AsPlainText -Force
$smbBackupShareCredentials = New-Object System.Management.Automation.PSCredential ($smbBackupShareUserName, $smbBackupSharePasswordSecure)
$backupFileShare = New-AzDmsFileShare -Path $smbBackupSharePath -Credential $smbBackupShareCredentials

定义 Azure 存储

选择要用于迁移的 Azure 存储容器:

# Storage resource id
$storageAccountResourceId = "/subscriptions/<subscriptionname>/resourceGroups/<rg>/providers/Microsoft.Storage/storageAccounts/<mystorage>"

配置 Microsoft Entra 应用

提供 Microsoft Entra ID 所需的详细信息,以实现联机 SQL 托管实例迁移:

# AAD properties
$AADAppId = "<appid-guid>"
$AADAppKey = "<app-key>"

# Create AAD object
$AADAppKeySecure = ConvertTo-SecureString $AADAppKey -AsPlainText -Force
$AADApp = New-AzDmsAadApp -ApplicationId $AADAppId -AppKey $AADAppKeySecure

创建并启动迁移任务

接下来,创建并启动 Azure 数据库迁移服务任务。 使用变量调用源和目标,并列出要迁移的数据库表:

# Managed Instance online migration properties
$dmsTaskName = "testmigration1"

# Create source connection info
$sourceConnInfo = New-AzDmsConnInfo -ServerType SQL `
  -DataSource $sourceDataSource `
  -AuthType WindowsAuthentication `
  -TrustServerCertificate:$true
$sourcePasswordSecure = ConvertTo-SecureString -String $sourcePassword -AsPlainText -Force
$sourceCredentials = New-Object System.Management.Automation.PSCredential ($sourceUserName, $sourcePasswordSecure)

# Create target connection info
$targetConnInfo = New-AzDmsConnInfo -ServerType SQLMI `
    -MiResourceId $targetMIResourceId
$targetPasswordSecure = ConvertTo-SecureString -String $targetPassword -AsPlainText -Force
$targetCredentials = New-Object System.Management.Automation.PSCredential ($targetUserName, $targetPasswordSecure)

以下示例创建并启动联机迁移任务:

# Create DMS migration task
$migTask = New-AzDataMigrationTask -TaskType MigrateSqlServerSqlDbMiSync `
  -ResourceGroupName $dmsResourceGroupName `
  -ServiceName $dmsServiceName `
  -ProjectName $dmsProjectName `
  -TaskName $dmsTaskName `
  -SourceConnection $sourceConnInfo `
  -SourceCred $sourceCredentials `
  -TargetConnection $targetConnInfo `
  -TargetCred $targetCredentials `
  -SelectedDatabase  $selectedDatabases `
  -BackupFileShare $backupFileShare `
  -AzureActiveDirectoryApp $AADApp `
  -StorageResourceId $storageAccountResourceId

有关详细信息,请参阅 New-AzDataMigrationTask

监视迁移

若要监视迁移,请执行以下任务。

检查任务的状态

# Get migration task status details
$migTask = Get-AzDataMigrationTask `
                    -ResourceGroupName $dmsResourceGroupName `
                    -ServiceName $dmsServiceName `
                    -ProjectName $dmsProjectName `
                    -Name $dmsTaskName `
                    -ResultType DatabaseLevelOutput `
                    -Expand

# Task state will be either of 'Queued', 'Running', 'Succeeded', 'Failed', 'FailedInputValidation' or 'Faulted'
$taskState = $migTask.ProjectTask.Properties.State

# Display task state
$taskState | Format-List

使用以下命令获取错误列表:

# Get task errors
$taskErrors = $migTask.ProjectTask.Properties.Errors

# Display task errors
foreach($taskError in $taskErrors){
    $taskError |  Format-List
}


# Get database level details
$databaseLevelOutputs = $migTask.ProjectTask.Properties.Output

# Display database level details
foreach($databaseLevelOutput in $databaseLevelOutputs){

    # This is the source database name.
    $databaseName = $databaseLevelOutput.SourceDatabaseName;

    Write-Host "=========="
    Write-Host "Start migration details for database " $databaseName
    # This is the status for that database - It will be either of:
    # INITIAL, FULL_BACKUP_UPLOADING, FULL_BACKUP_UPLOADED, LOG_FILES_UPLOADING,
    # CUTOVER_IN_PROGRESS, CUTOVER_INITIATED, CUTOVER_COMPLETED, COMPLETED, CANCELLED, FAILED
    $databaseMigrationState = $databaseLevelOutput.MigrationState;

    # Details about last restored backup. This contains file names, LSN, backup date, etc 
    $databaseLastRestoredBackup = $databaseLevelOutput.LastRestoredBackupSetInfo
        
    # Details about last restored backup. This contains file names, LSN, backup date, etc 
    $databaseLastRestoredBackup = $databaseLevelOutput.LastRestoredBackupSetInfo

    # Details about last Currently active/most recent backups. This contains file names, LSN, backup date, etc 
    $databaseActiveBackpusets = $databaseLevelOutput.ActiveBackupSets

    # Display info
    $databaseLevelOutput | Format-List

    Write-Host "Currently active/most recent backupset details:"
    $databaseActiveBackpusets  | select BackupStartDate, BackupFinishedDate, FirstLsn, LastLsn -ExpandProperty ListOfBackupFiles | Format-List

    Write-Host "Last restored backupset details:"
    $databaseLastRestoredBackupFiles  | Format-List

    Write-Host "End migration details for database " $databaseName
    Write-Host "=========="
}

执行交接

在联机迁移过程中,将执行数据库的完整备份和还原,然后继续还原 BackupFileShare 中存储的事务日志。

在 Azure SQL 托管实例中的数据库已使用最新数据进行更新并与源数据库同步后,你可以执行交接。

以下示例将完成交接/迁移。 用户可自行调用此命令。

$command = Invoke-AzDmsCommand -CommandType CompleteSqlMiSync `
                               -ResourceGroupName myResourceGroup `
                               -ServiceName $service.Name `
                               -ProjectName $project.Name `
                               -TaskName myDMSTask `
                               -DatabaseName "Source DB Name"

删除 Azure 数据库迁移服务的实例

完成迁移后,可以删除 Azure 数据库迁移服务实例:

Remove-AzDms -ResourceGroupName myResourceGroup -ServiceName MyDMS

后续步骤

什么是 Azure 数据库迁移服务?一文中详细了解 Azure 数据库迁移服务。