Выполнение переноса SQL Server в Управляемый экземпляр SQL с подключением к сети, используя PowerShell и Azure Database Migration Service

Выполняя действия, приведенные в этой статье, мы перенесем базу данных Adventureworks2016, восстановленную в локальном экземпляре SQL Server 2005 (или более поздней версии), в Управляемый экземпляр SQL Azure SQL с помощью Microsoft Azure PowerShell. Базы данных можно перенести из экземпляра SQL Server в Управляемый экземпляр SQL, используя в Microsoft Azure PowerShell модуль Az.DataMigration.

Вы узнаете, как выполнять следующие задачи:

  • Создать группу ресурсов.
  • Создайте экземпляр Azure Database Migration Service.
  • Создание проекта миграции в экземпляре Azure Database Migration Service.
  • Выполнение переноса с подключением к сети.

Совет

В Службе azure Database Migration Service можно перенести базы данных в автономном режиме или во время их работы в сети. При автономной миграции время простоя приложения начинается при запуске миграции. Чтобы ограничить время простоя, необходимое для перехода к новой среде после миграции, используйте миграцию через Интернет . Рекомендуется протестировать автономную миграцию, чтобы определить допустимо ли время простоя. Если ожидаемое время простоя недопустимо, выполните миграцию по сети.

В этой статье приведены действия по переносу с подключением к сети, однако вы также можете выполнить миграцию в автономном режиме.

Необходимые компоненты

Для выполнения этих действий вам потребуется следующее:

Создание или изменение группы ресурсов

Группа ресурсов Azure является логическим контейнером, в котором происходит развертывание ресурсов Azure и управление ими.

Создайте группу ресурсов с помощью команды New-AzResourceGroup.

В следующем примере создается группа ресурсов с именем myResourceGroup в регионе Восточная часть США.

New-AzResourceGroup -ResourceGroupName myResourceGroup -Location EastUS

Создание экземпляра DMS

Вы можете создать экземпляр Azure Database Migration Service, выполнив командлет New-AzDataMigrationService. Для этого командлета нужно передать следующие обязательные параметры:

  • ResourceGroupName. Вы можете выполнить команду New-AzResourceGroup, чтобы создать группу ресурсов Azure, как описано в предыдущем разделе, и указать ее имя в качестве параметра.
  • ServiceName. Строка, соответствующая требуемому уникальному имени службы для Azure Database Migration Service.
  • Location. Указывает расположение службы. Укажите расположение центра обработки данных Azure, например "Западная часть США" или "Юго-Восточная Азия".
  • Sku. Этот параметр соответствует имени SKU DMS. Сейчас поддерживаются такие имена SKU: Basic_1vCore, Basic_2vCores, GeneralPurpose_4vCores.
  • VirtualSubnetId. Для создания подсети можно использовать командлет New-AzVirtualNetworkSubnetConfig.

В указанном ниже примере создается служба с именем MyDMS в группе ресурсов MyDMSResourceGroup, расположенная в регионе Восточная часть США. Ее компонентами является виртуальная сеть с именем MyVNET и подсеть с именем MySubnet.

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

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

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

Создание проекта миграции

Создав экземпляр Azure Database Migration Service, создайте проект миграции. Для проекта Azure Database Migration Service необходимо иметь сведения о подключении для исходных и целевых экземпляров, а также список баз данных, которые требуется перенести как часть проекта. Определите строки подключения для возможности подключения источника и целевого объекта.

Следующий скрипт определяет сведения о подключении источника 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

Проект Azure Database Migration Service можно создать в экземпляре DMS.

# 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 создайте объект FileShare, представляющий собой локальную сетевую папку SMB, в которую Azure Database Migration Service может поместить резервные копии базы данных-источника.

# 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 для миграции Управляемый экземпляр 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 Database Migration Service. Вызовите источник и целевой объект с помощью переменных и создайте список таблиц базы данных, которые нужно перенести:

# 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.

Прямую миграцию можно выполнить после обновления базы данных в Управляемом экземпляре SQL Azure с использованием актуальных данных и ее синхронизации с базой данных-источником.

В следующем примере показано завершение прямой миграции. Пользователи вызывают эту команду по собственному усмотрению.

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

Удаление экземпляра Azure Database Migration Service

Завершив миграцию, вы можете удалить экземпляр Azure Database Migration Service:

Remove-AzDms -ResourceGroupName myResourceGroup -ServiceName MyDMS

Дополнительные ресурсы

Сведения о дополнительных сценариях миграции (пары "источник — целевой объект") см. в руководстве по миграции баз данныхМайкрософт.

Следующие шаги

Дополнительные сведения о службе Azure Database Migration Service см. в статье Что такое служба Azure Database Migration Service?.