Share via


Eseguire la migrazione di SQL Server a Istanza gestita di SQL online con PowerShell e Servizio Migrazione del database di Azure

In questo articolo si esegue la migrazione online del database Adventureworks2016 ripristinato in un'istanza locale di SQL Server 2005 o versione successiva a un Istanza gestita di SQL SQL di Azure usando Microsoft Azure PowerShell. È possibile eseguire la migrazione di database da un'istanza di SQL Server a un Istanza gestita di SQL usando il Az.DataMigration modulo in Microsoft Azure PowerShell.

In questo articolo vengono illustrate le operazioni seguenti:

  • Crea un gruppo di risorse.
  • Creare un'istanza del servizio Migrazione del database di Azure.
  • Creare un progetto di migrazione in un'istanza di Servizio Migrazione del database di Azure.
  • Eseguire la migrazione online.

Suggerimento

In Servizio Migrazione del database di Azure è possibile eseguire la migrazione dei database offline o mentre sono online. In una migrazione offline , il tempo di inattività dell'applicazione inizia all'avvio della migrazione. Per limitare il tempo di inattività al tempo necessario per passare al nuovo ambiente dopo la migrazione, usare una migrazione online . È consigliabile testare una migrazione offline per determinare se il tempo di inattività è accettabile. Se il tempo di inattività previsto non è accettabile, eseguire una migrazione online.

Questo articolo illustra i passaggi per una migrazione online, ma è anche possibile eseguire la migrazione offline.

Prerequisiti

Per completare questi passaggi è necessario disporre di:

Creare un gruppo di risorse

Un gruppo di risorse di Azure è un contenitore logico in cui le risorse di Azure vengono distribuite e gestite.

Creare un gruppo di risorse usando il comando New-AzResourceGroup.

L'esempio seguente crea un gruppo di risorse denominato myResourceGroup nell'area Stati Uniti orientali.

New-AzResourceGroup -ResourceGroupName myResourceGroup -Location EastUS

Creare un'istanza del Servizio Migrazione del database

È possibile creare una nuova istanza del Servizio Migrazione del database di Azure tramite il cmdlet New-AzDataMigrationService. Questo cmdlet si aspetta i parametri obbligatori seguenti:

  • Nome del gruppo di risorse di Azure. È possibile usare il New-AzResourceGroup comando per creare un gruppo di risorse di Azure come illustrato in precedenza e specificarne il nome come parametro.
  • Nome del servizio. Stringa che corrisponde al nome univoco del servizio desiderato per Servizio Migrazione del database di Azure.
  • Posizione. Specifica il percorso del servizio. Specificare una posizione del data center di Azure, ad esempio Stati Uniti occidentali o Asia sud-orientale.
  • Sku. Questo parametro corrisponde al nome Sku DMS. I nomi sku attualmente supportati sono Basic_1vCore, Basic_2vCores GeneralPurpose_4vCores.
  • Identificatore della subnet virtuale. È possibile usare il cmdlet New-AzVirtualNetworkSubnetConfig per creare una subnet.

L'esempio seguente crea un servizio denominato MyDMS nel gruppo di risorse MyDMSResourceGroup che si trova nell'area Stati Uniti orientali usando una rete virtuale denominata MyVNET e una subnet denominata 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`

Creare un progetto di migrazione

Dopo aver creato un'istanza del Servizio Migrazione del database di Azure, creare un progetto di migrazione. Un progetto Servizio Migrazione del database di Azure richiede informazioni di connessione per entrambe le istanze di origine e di destinazione, nonché un elenco dei database che si desidera migrare come parte del progetto. Definire stringa di connessione di connettività di origine e di destinazione.

Lo script seguente definisce i dettagli di connessione di SQL Server di origine:

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

Lo script seguente definisce i dettagli della connessione Istanza gestita di SQL di destinazione:

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

Definire il mapping del database di origine e di destinazione

Fornire i database di cui eseguire la migrazione in questo progetto di migrazione

Lo script seguente esegue il mapping del database di origine al nuovo database nel Istanza gestita di SQL di destinazione con il nome specificato.

# 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> ")

Per più database, aggiungere l'elenco dei database allo script precedente usando il formato seguente:

$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> ")

Creare il progetto del Servizio Migrazione del database di Azure

È possibile creare un progetto Servizio Migrazione del database di Azure all'interno dell'istanza del Servizio Migrazione del database.

# 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 `
}

Creare un oggetto FileShare di backup

Creare ora un oggetto FileShare che rappresenta la condivisione di rete SMB locale in cui Servizio Migrazione del database di Azure può eseguire i backup del database di origine usando il cmdlet New-AzDmsFileShare.

# 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

Definire il Archiviazione di Azure

Selezionare Archiviazione di Azure Contenitore da usare per la migrazione:

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

Configurare l'app Microsoft Entra

Specificare i dettagli necessari per Microsoft Entra ID per una migrazione online Istanza gestita di 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

Creare e avviare un'attività di migrazione

Creare e avviare quindi un'attività Servizio Migrazione del database di Azure. Chiamare l'origine e la destinazione usando le variabili ed elencare le tabelle di database di cui eseguire la migrazione:

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

L'esempio seguente crea e avvia un'attività di migrazione online:

# 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

Per altre informazioni, vedere New-AzDataMigrationTask.

Monitorare la migrazione

Per monitorare la migrazione, eseguire le attività seguenti.

Controllare lo stato dell'attività

# 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

Usare quanto segue per ottenere l'elenco degli errori:

# 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 "=========="
}

Esecuzione del cutover

Con una migrazione online, viene eseguito un backup completo e il ripristino dei database e quindi si procede con il ripristino dei log delle transazioni archiviati in BackupFileShare.

Quando il database in un Istanza gestita di SQL di Azure viene aggiornato con i dati più recenti ed è sincronizzato con il database di origine, è possibile eseguire un cutover.

L'esempio seguente completerà il cutover\migration. Gli utenti richiamano questo comando a propria discrezione.

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

Eliminazione dell'istanza di Servizio Migrazione del database di Azure

Al termine della migrazione, è possibile eliminare l'istanza di Servizio Migrazione del database di Azure:

Remove-AzDms -ResourceGroupName myResourceGroup -ServiceName MyDMS

Risorse aggiuntive

Per informazioni su altri scenari di migrazione (coppie di origine/destinazione), vedere la Guida alla migrazione del database Microsoft.

Passaggi successivi

Per altre informazioni sulle Servizio Migrazione del database di Azure, vedere l'articolo Che cos'è il Servizio Migrazione del database di Azure?.