Share via


Migración de SQL Server a SQL Managed Instance en línea con PowerShell y Azure Database Migration Service

En este artículo, se va a migrar en línea la base de datos Adventureworks2016 restaurada en una instancia local de SQL Server 2005, o una versión superior, a una instancia de Azure SQL Managed Instance mediante Microsoft Azure PowerShell. Se pueden migrar bases de datos desde una instancia de SQL Server a una Instancia administrada de SQL mediante el módulo Az.DataMigration en Microsoft Azure PowerShell.

En este artículo aprenderá a:

  • Cree un grupo de recursos.
  • Cree una instancia de Azure Database Migration Service.
  • Crear un proyecto de migración en una instancia de Azure Database Migration Service.
  • Ejecute la migración en línea.

Sugerencia

En Azure Database Migration Service, puede migrar las bases de datos sin conexión o mientras están en línea. Con una migración sin conexión, el tiempo de inactividad de la aplicación se inicia cuando comienza la migración. Para limitar el tiempo de inactividad al tiempo necesario para la transición al nuevo entorno cuando finalice la migración, use una migración en línea. Se recomienda probar una migración sin conexión para determinar si el tiempo de inactividad es aceptable. Si el tiempo de inactividad esperado no es aceptable, realice una migración en línea.

En este artículo se proporcionan los pasos para realizar una migración en línea, pero también es posible realizarla sin conexión.

Requisitos previos

Para completar estos pasos, necesitará lo siguiente:

Crear un grupo de recursos

Un grupo de recursos de Azure es un contenedor lógico en el que se implementan y se administran los recursos de Azure.

Cree un grupo de recursos mediante el comando New-AzResourceGroup.

En el ejemplo siguiente se crea un grupo de recursos denominado myResourceGroup en la región Este de EE. UU.

New-AzResourceGroup -ResourceGroupName myResourceGroup -Location EastUS

Creación de una instancia de DMS

Puede crear una instancia nueva de Azure Database Migration Service mediante el cmdlet New-AzDataMigrationService. Este cmdlet espera los siguientes parámetros requeridos:

  • Nombre del grupo de recursos de Azure. Puede usar el comando New-AzResourceGroup para crear un grupo de recursos de Azure como se mostró anteriormente y proporcionar su nombre como un parámetro.
  • Nombre del servicio. Cadena que se corresponde con el nombre de servicio único deseado para Azure Database Migration Service.
  • Ubicación. Especifica la ubicación del servicio. Especifique una ubicación de centro de datos de Azure, por ejemplo, Oeste de EE. UU. o Sudeste de Asia.
  • SKU. Este parámetro corresponde al nombre de SKU de DMS. Los nombres de SKU admitidos actualmente son Basic_1vCore, Basic_2vCores y GeneralPurpose_4vCores.
  • Identificador de subred virtual. Puede usar el cmdlet New-AzVirtualNetworkSubnetConfig para crear una subred.

En el ejemplo siguiente se crea un servicio denominado MyDMS en el grupo de recursos MyDMSResourceGroup que se encuentra en la región Este de EE. UU. con una red virtual denominada MyVNET y una subred llamada 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`

Creación de un proyecto de migración

Cree un proyecto de migración después de crear una instancia de Azure Database Migration Service. Un proyecto de Azure Database Migration Service requiere información de conexión para las instancias de origen y de destino, así como una lista de bases de datos que desee migrar como parte del proyecto. Defina las cadenas de conexión de conectividad de origen y de destino.

El siguiente script define los detalles de conexión de SQL Server de origen:

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

El siguiente script define los detalles de conexión de SQL Managed Instance de destino:

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

Definición de la asignación de bases de datos de origen y de destino

Provisión de las bases de datos que se van a migrar en este proyecto de migración

El siguiente script asigna la base de datos de origen a la nueva base de datos correspondiente en la instancia de SQL Managed Instance de destino con el nombre proporcionado.

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

En el caso de varias bases de datos, agregue la lista de bases de datos al script anterior con el siguiente formato:

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

Creación de proyecto DMS

Puede crear un proyecto de Azure Database Migration Service dentro de la instancia de 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 `
}

Creación de un objeto FileShare para copias de seguridad

Cree ahora un objeto FileShare que representa el recurso compartido de red SMB local en el que Azure Database Migration Service puede realizar las copias de seguridad de la base de datos de origen con el 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

Definición de la instancia de Azure Storage

Seleccione el contenedor de Azure Storage que se va a usar para la migración:

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

Configuración de la aplicación Microsoft Entra

Proporcione los detalles necesarios para microsoft Entra ID para una migración de SQL Instancia administrada en línea:

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

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

Creación e inicio de una tarea de migración

Después, cree e inicie una tarea de Azure Database Migration Service. Llame al origen y al destino mediante variables y enumere las tablas de la base de datos que se van a migrar:

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

En el ejemplo siguiente se crea y se inicia una tarea de migración en línea:

# 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

Para obtener más información, consulte New-AzDataMigrationTask.

Supervisión de la migración

Para supervisar la migración, realice las tareas siguientes.

Comprobación del estado de la tarea

# 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

Use lo siguiente para obtener una lista de errores:-

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

Realización de la transición

Con una migración en línea, se lleva a cabo una copia de seguridad y restauración completas de las bases de datos. Después, el trabajo procede a restaurar los registros de transacciones almacenados en BackupFileShare.

Cuando la base de datos de una Instancia administrada de Azure SQL se haya actualizado con los datos más recientes y esté sincronizada con la base de datos de origen, podrá realizar una migración total.

En el ejemplo siguiente se completa la migración total. Los usuarios invocan este comando a su discreción.

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

Eliminación de la instancia de Azure Database Migration Service

Una vez completada la migración, puede eliminar la instancia de Azure Database Migration Service:

Remove-AzDms -ResourceGroupName myResourceGroup -ServiceName MyDMS

Recursos adicionales

Para obtener información sobre escenarios de migración adicionales (pares de origen/destino), consulte la guía de Database Migration de Microsoft.

Pasos siguientes

Obtenga más información sobre Azure Database Migration Service en el artículo ¿Qué es Azure Database Migration Service?