Restauración de las bases de datos de SQL en una máquina virtual de Azure con la CLI de Azure

La CLI de Azure se usa para crear y administrar los recursos de Azure desde la línea de comandos o mediante scripts. En este artículo se describe cómo restaurar una base de datos SQL con copia de seguridad en una máquina virtual de Azure mediante la CLI de Azure. También puede llevar a cabo estas acciones con Azure Portal.

Use Azure Cloud Shell para ejecutar comandos de la CLI.

Este artículo asume que tienes una base de datos SQL ejecutándose en una VM de Azure que está respaldada usando Azure Backup. Si ha usado Realización de una copia de seguridad de una base de datos de SQL en Azure mediante la CLI para la copia de seguridad de la base de datos de SQL, estará usando los siguientes recursos:

  • Grupo de recursos con el nombre SQLResourceGroup.
  • Almacén denominado SQLVault.
  • Contenedor protegido denominadoVMAppContainer;Compute;SQLResourceGroup;testSQLVM.
  • Una base de datos o un elemento con copia de seguridad denominado sqldatabase;mssqlserver;testdb.
  • Recursos de la región de westus.

Para ver los escenarios de copia de seguridad y restauración que se admiten en la actualidad, consulte la matriz de compatibilidad. Para preguntas comunes, consulte las preguntas más frecuentes.

Ver los puntos de restauración de una base de datos con copia de seguridad

Para ver la lista de todos los puntos de recuperación de una base de datos, use el cmdlet az backup recoverpoint list como se indica a continuación:

az backup recoverypoint list --resource-group SQLResourceGroup \
    --vault-name SQLVault \
    --container-name "VMAppContainer;Compute;SQLResourceGroup;testSQLVM" \
    --item-name "sqldatabase;mssqlserver;testdb" \
   --output table

La lista de puntos de recuperación aparece como:

Name                      Time                               BackupManagementType   Item Name               		RecoveryPointType
-------------------       ---------------------------------  ---------------------  ----------------------  		------------------
7660777527047692711       2019-12-10T04:00:32.346000+00:00   AzureWorkload          sqldatabase;mssqlserver;testdb  Full
7896624824685666836       2019-12-15T10:33:32.346000+00:00   AzureWorkload          sqldatabase;mssqlserver;testdb  Differential
DefaultRangeRecoveryPoint                                    AzureWorkload          sqldatabase;mssqlserver;testdb  Log

La lista anterior contiene tres puntos de recuperación: para las copias de seguridad completas, las diferenciales y las de registro.

Note

También puede ver los puntos inicial y final de cada cadena de copia de seguridad de registro íntegra mediante el comando az backup recoverypoin show-log-chain.

Requisitos previos para restaurar una base de datos

Antes de restaurar una base de datos, asegúrese de que se cumplen los requisitos previos siguientes:

  • Puede restaurar la base de datos solo a una instancia de SQL de la misma región o a otra región si la opción Cross Region Restore está habilitada en la bóveda.
  • La instancia de destino debe registrarse con el mismo almacén que el origen, excepto durante la restauración entre regiones y la restauración entre suscripciones. .

Restaurar una base de datos

Azure Backup puede restaurar bases de datos de SQL que se ejecuten en máquinas virtuales de Azure, como:

  • Restaurar a una fecha u hora específicas (con precisión de segundos) mediante copias de seguridad de registros. Azure Backup determina automáticamente la copia de seguridad diferencial o completa apropiada, y la cadena de copias de seguridad de registros necesarias para restaurar los datos en función del tiempo seleccionado.
  • Restaurar una copia de seguridad completa o diferencial específica para restaurar a un punto de recuperación específico.

Para restaurar una base de datos, use el comando az restore-azurewl, que requiere un objeto de configuración de recuperación como una de las entradas. Puede generar este objeto mediante el comando az backup recoveryconfig show. El objeto de configuración de recuperación contiene todos los detalles para realizar la restauración. Uno de ellos es el modo de restauración: OriginalWorkloadRestore o AlternateWorkloadRestore.

Note

OriginalWorkloadRestore: restaura los datos en la misma instancia de SQL de origen. Esta opción sobrescribe la base de datos original. AlternateWorkloadRestore: restaura la base de datos en una ubicación alternativa y mantiene la base de datos de origen intacta.

Restauración a una ubicación alternativa

Para restaurar una base de datos en una ubicación alternativa, use AlternateWorkloadRestore como modo de restauración. A continuación debe elegir el punto de restauración, que puede ser un momento anterior o cualquiera de los puntos de restauración anteriores.

Vamos a continuar con la restauración a un punto de restauración anterior. Consulte la lista de puntos de restauración de la base de datos y elija el momento al que desea realizar la restauración. Aquí se usará el punto de restauración con el nombre 7660777527047692711.

Con el nombre de punto de restauración anterior y el modo de restauración, vamos a crear el objeto de configuración de recuperación mediante el comando az backup recoveryconfig show. Compruebe los parámetros restantes en este comando:

  • --target-item-name: nombre que va a usar la base de datos restaurada. En este escenario, usamos el nombre restored_database.
  • --target-server-name: nombre de un servidor SQL Server que se ha registrado correctamente en un almacén de Recovery Services y que permanece en la misma región que la base de datos que se va a restaurar. Aquí, vamos a restaurar la base de datos en el mismo servidor SQL Server que ha protegido, el que se llama testSQLVM.
  • --target-server-type: para la restauración de bases de datos SQL, debe usar SQLInstance.

az backup recoveryconfig show --resource-group SQLResourceGroup \
    --vault-name SQLVault \
    --container-name "VMAppContainer;Compute;SQLResourceGroup;testSQLVM" \
    --item-name "SQLDataBase;mssqlserver;testdb" \
    --restore-mode AlternateWorkloadRestore \
    --rp-name 7660777527047692711 \
    --target-item-name restored_database \
    --target-server-name testSQLVM \
    --target-server-type SQLInstance \
    --workload-type SQLDataBase \
    --output json

La respuesta a la consulta anterior será un objeto de configuración de recuperación con el aspecto siguiente:

{
  "container_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/SQLResourceGroup/providers/Microsoft.RecoveryServices/vaults/SQLVault/backupFabrics/Azure/protectionContainers/vmappcontainer;compute;SQLResourceGroup;testSQLVM",
  "container_uri": "VMAppContainer;compute;SQLResourceGroup;testSQLVM",
  "database_name": "MSSQLSERVER/restored_database",
  "filepath": null,
  "item_type": "SQL",
  "item_uri": "SQLDataBase;mssqlserver;testdb",
  "log_point_in_time": null,
  "recovery_mode": null,
  "recovery_point_id": "7660777527047692711",
  "restore_mode": "AlternateLocation",
  "source_resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/SQLResourceGroup/providers/Microsoft.Compute/virtualMachines/testSQLVM",
  "workload_type": "SQLDataBase",
  "alternate_directory_paths": []
}

Ahora, para restaurar la base de datos, ejecute el comando az restore restore-azurewl. Para usar este comando, se especificará la salida JSON anterior, guardada en un archivo denominado recoveryconfig.json.

az backup restore restore-azurewl --resource-group SQLResourceGroup \
    --vault-name SQLVault \
    --recovery-config recoveryconfig.json \
    --output table

La salida tiene el siguiente aspecto:

Name                                  Operation    Status      Item Name                          Backup Management Type    Start Time UTC                    Duration
------------------------------------  -----------  ----------  ---------------------------------  ------------------------  --------------------------------  --------------
be7ea4a4-0752-4763-8570-a306b0a0106f  Restore      InProgress  testdb [testSQLVM]  				  AzureWorkload             2022-06-21T03:51:06.898981+00:00  0:00:05.652967

La respuesta le proporcionará el nombre del trabajo. Puede usar este nombre de trabajo para realizar un seguimiento del estado del trabajo mediante el comando az backup job show.

Restauración y sobrescritura

Para la restauración en la ubicación original, usaremos OrignialWorkloadRestore como modo de restauración. A continuación debe elegir el punto de restauración, que puede ser un momento anterior o cualquiera de los puntos de restauración anteriores.

Por ejemplo, para esta restauración, vamos a elegir el momento dado anterior "28-11-2019-09:53:00". Puede proporcionar este punto de restauración en los siguientes formatos: dd-mm-aaaa, dd-mm-aaaa-hh:mm:ss. Para elegir un momento dado para la restauración, use el comando az backup recoverypoint show-log-chain, que muestra los intervalos de copias de seguridad de la cadena de registro íntegras.

az backup recoveryconfig show --resource-group SQLResourceGroup \
    --vault-name SQLVault \
    --container-name "VMAppContainer;Compute;SQLResourceGroup;testSQLVM" \
    --item-name "sqldatabase;mssqlserver;testdb" \
    --restore-mode OriginalWorkloadRestore \
    --log-point-in-time 20-06-2022-09:02:41 \
    --output json

La respuesta a la consulta anterior será un objeto de configuración de recuperación con el aspecto siguiente:

{
  "alternate_directory_paths": null,
  "container_id": null,
  "container_uri": "VMAppContainer;Compute;SQLResourceGroup;testSQLVM",
  "database_name": null,
  "filepath": null,
  "item_type": "SQL",
  "item_uri": "SQLDataBase;mssqlserver;testdb",
  "log_point_in_time": "20-06-2022-09:02:41",
  "recovery_mode": null,
  "recovery_point_id": "DefaultRangeRecoveryPoint",
  "restore_mode": "OriginalLocation",
  "source_resource_id": "/subscriptions/62b829ee-7936-40c9-a1c9-47a93f9f3965/resourceGroups/SQLResourceGroup/providers/Microsoft.Compute/virtualMachines/testSQLVM",
  "workload_type": "SQLDataBase"
}

Ahora, para restaurar la base de datos, ejecute el comando az restore restore-azurewl. Para usar este comando, se especificará la salida JSON anterior, guardada en un archivo denominado recoveryconfig.json.

az backup restore restore-azurewl --resource-group sqlResourceGroup \
    --vault-name sqlVault \
    --recovery-config recoveryconfig.json \
    --output table

La salida tiene el siguiente aspecto:

Name                                  Operation    Status      Item Name                        Backup Management Type    Start Time UTC                    Duration
------------------------------------  -----------  ----------  -------------------------------  ------------------------  --------------------------------  --------------
1730ec49-166a-4bfd-99d5-93027c2d8480  Restore      InProgress  testdb [testSQLVM]  				AzureWorkload             2022-06-21T04:04:11.161411+00:00  0:00:03.118076

La respuesta le proporcionará el nombre del trabajo. Puede usar este nombre de trabajo para realizar un seguimiento del estado del trabajo mediante el comando az backup job show.

Restauración en una región secundaria

Para restaurar una base de datos en la región secundaria, especifique un almacén de destino y un servidor ubicados en la región secundaria, en la configuración de restauración.

az backup recoveryconfig show --resource-group SQLResourceGroup \
    --vault-name SQLVault \
    --container-name "VMAppContainer;compute;SQLResourceGroup;testSQLVM" \
    --item-name "sqldatabase;mssqlserver;testdb" \
    --restore-mode AlternateWorkloadRestore \
    --from-full-rp-name 293170069256531 \
    --rp-name 293170069256531 \
    --target-server-name targetSQLServer \
    --target-container-name "VMAppContainer;compute;SQLResourceGroup;targetSQLServer" \
    --target-item-name testdb_restore_1 \
    --target-server-type SQLInstance \
    --workload-type SQLDataBase \
    --target-resource-group SQLResourceGroup \
    --target-vault-name targetVault \
    --backup-management-type AzureWorkload

La respuesta es un objeto de configuración de recuperación que aparece como:

 {
  "container_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/SQLResourceGroup/providers/Microsoft.RecoveryServices/vaults/targetVault/backupFabrics/Azure/protectionContainers/vmappcontainer;compute;SQLResourceGroup;targetSQLServer",
  "container_uri": "VMAppContainer;compute;SQLResourceGroup;testSQLVM",
  "database_name": "MSSQLSERVER/testdb_restore_1",
  "filepath": null,
  "item_type": "SQL",
  "item_uri": "SQLDataBase;mssqlserver;testdb",
  "log_point_in_time": null,
  "recovery_mode": null,
  "recovery_point_id": "293170069256531",
  "restore_mode": "AlternateLocation",
  "source_resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/SQLResourceGroup/providers/Microsoft.Compute/virtualMachines/testSQLVM",
  "workload_type": "SQLDataBase",
  "alternate_directory_paths": []
}

Use esta configuración de recuperación en el comando az restore restore-azurewl. Seleccione la marca --use-secondary-region para restaurar la base de datos a la región secundaria.

az backup restore restore-azurewl --resource-group SQLResourceGroup \
    --vault-name SQLVault \
    --recovery-config recoveryconfig.json \
    --use-secondary-region \
    --output table

La salida tiene el siguiente aspecto:

Name                                  Operation           Status      Item Name                  Backup Management Type    Start Time UTC                    Duration
------------------------------------  ------------------  ----------  -------------------------  ------------------------  --------------------------------  --------------
0d863259-b0fb-4935-8736-802c6667200b  CrossRegionRestore  InProgress  testdb [testSQLVM] 		 AzureWorkload             2022-06-21T08:29:24.919138+00:00  0:00:12.372421

Note

El RPO para que los datos de copia de seguridad estén disponibles en la región secundaria es de 12 horas. Por lo tanto, cuando se activa el CRR, el RPO para la región secundaria es de 12 horas + la duración de la frecuencia de registro (que puede establecerse en un mínimo de 15 minutos).

Restaurar como archivos

Para restaurar los datos de la copia de seguridad como archivos en lugar de una base de datos, utilizaremos RestoreAsFiles como modo de restauración. A continuación debe elegir el punto de restauración, que puede ser un momento anterior o cualquiera de los puntos de restauración anteriores. Cuando los archivos se vuelcan a una ruta de acceso especificada, puede llevar estos archivos a cualquier máquina SQL en la que quiera restaurarlos como base de datos. Dado que puede mover estos archivos a cualquier máquina, ahora puede restaurar los datos entre suscripciones y regiones.

Elija el 28-11-2019-09:53:00 del momento dado anterior que se va a restaurar y la ubicación en la que volcar los archivos de copia de seguridad como C:\restoreasfiles en el mismo servidor SQL. Puede proporcionar este punto de restauración en uno de los siguientes formatos: dd-mm-aaaa o dd-mm-aaaa-hh:mm:ss. Para elegir un momento dado para la restauración, use el comando az backup recoverypoint show-log-chain, que muestra los intervalos de copias de seguridad de la cadena de registro íntegras.

Con el nombre de punto de restauración anterior y el modo de restauración, vamos a crear el objeto de configuración de recuperación mediante el comando az backup recoveryconfig show. Compruebe cada uno de los parámetros restantes en este comando:

  • --target-container-name: nombre de un servidor SQL Server que se ha registrado correctamente en un almacén de Recovery Services y se encuentra en la misma región que la base de datos que se va a restaurar. Restauremos la base de datos en forma de archivos en el mismo servidor SQL que protegiste, llamado mssqlserver.
  • --rp-name: para una restauración a un momento dado, el nombre del punto de restauración será DefaultRangeRecoveryPoint.
az backup recoveryconfig show --resource-group SQLResourceGroup \
    --vault-name SQLVault \
    --container-name "VMAppContainer;Compute;SQLResourceGroup;testSQLVM" \
    --item-name "sqldatabase;mssqlserver;testdb" \
    --restore-mode RestoreAsFiles \
    --rp-name 932606668166874635 \
    --target-container-name "VMAppContainer;Compute;SQLResourceGroup;testSQLVM" \
    --filepath "C:\restoreasfiles" \
    --output json

La respuesta a la consulta anterior será un objeto de configuración de recuperación con el aspecto siguiente:

{
  "alternate_directory_paths": null,
  "container_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/SQLResourceGroup/providers/Microsoft.RecoveryServices/vaults/SQLVault/backupFabrics/Azure/protectionContainers/VMAppContainer;Compute;SQLResourceGroup;testSQLVM",
  "container_uri": "VMAppContainer;compute;SQLResourceGroup;testSQLVM",
  "database_name": null,
  "filepath": "C:\restoreasfiles",
  "item_type": "SQL",
  "item_uri": "SQLDataBase;mssqlserver;testdb",
  "log_point_in_time": null,
  "recovery_mode": "FileRecovery",
  "recovery_point_id": "932606668166874635",
  "restore_mode": "AlternateLocation",
  "source_resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/SQLResourceGroup/providers/Microsoft.Compute/virtualMachines/testSQLVM",
  "workload_type": "SQLDataBase"
}

Ahora, para restaurar la base de datos como archivos, ejecute el comando az restore restore-azurewl. Para usar este comando, se especificará la salida JSON anterior, guardada en un archivo denominado recoveryconfig.json.

az backup restore restore-azurewl --resource-group SQLResourceGroup \
    --vault-name SQLVault \
    --recovery-config recoveryconfig.json \
    --output json

La salida tiene el siguiente aspecto:

{
  "eTag": null,
  "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/SQLResourceGroup/providers/Microsoft.RecoveryServices/vaults/SQLVault/backupJobs/e9cd9e73-e3a3-425a-86a9-8dd1c500ff56",
  "location": null,
  "name": "e9cd9e73-e3a3-425a-86a9-8dd1c500ff56",
  "properties": {
    "actionsInfo": [
      "1"
    ],
    "activityId": "9e7c8ee4-f1ef-11ec-8a2c-3c52826c1a9a",
    "backupManagementType": "AzureWorkload",
    "duration": "0:00:04.304322",
    "endTime": null,
    "entityFriendlyName": "testdb [testSQLVM]",
    "errorDetails": null,
    "extendedInfo": {
      "dynamicErrorMessage": null,
      "propertyBag": {
        "Job Type": "Restore as files"
      },
      "tasksList": [
        {
          "status": "InProgress",
          "taskId": "Transfer data from vault"
        }
      ]
    },
    "isUserTriggered": true,
    "jobType": "AzureWorkloadJob",
    "operation": "Restore",
    "startTime": "2022-06-22T05:53:32.951666+00:00",
    "status": "InProgress",
    "workloadType": "SQLDataBase"
  },
  "resourceGroup": "SQLResourceGroup",
  "tags": null,
  "type": "Microsoft.RecoveryServices/vaults/backupJobs"
}

La respuesta le proporcionará el nombre del trabajo. Puede usar este nombre de trabajo para realizar un seguimiento del estado del trabajo mediante el comando az backup job show.

Note

Si no desea restaurar toda la cadena, sino solo un subconjunto de archivos, siga los pasos que se documentan aquí.

Restauración entre suscripciones

Con la restauración entre suscripciones (CSR), tiene la flexibilidad de restaurar a cualquier suscripción y almacén del inquilino si los permisos de restauración están disponibles. De manera predeterminada, CSR está habilitado en todos los almacenes de Recovery Services (tanto los existentes como los recién creados).

Note

  • La restauración entre suscripciones se puede desencadenar desde el almacén de Recovery Services.
  • CSR solo se admite para la copia de seguridad basada en streaming y no se admite para la copia de seguridad basada en instantáneas.
  • No se admite la restauración entre regiones (CRR) con CSR.
az backup vault create

Agregue el parámetro cross-subscription-restore-state que le permite establecer el estado de CSR del almacén durante la creación y actualización de este.

az backup recoveryconfig show

Agregue el parámetro --target-subscription-id que le permite proporcionar la suscripción de destino como entrada al desencadenar la restauración entre suscripciones para orígenes de datos de SQL o HANA.

Example:

   az backup vault create -g {rg_name} -n {vault_name} -l {location} --cross-subscription-restore-state Enable
   az backup recoveryconfig show --restore-mode alternateworkloadrestore --backup-management-type azureworkload -r {rp} --target-container-name {target_container} --target-item-name {target_item} --target-resource-group {target_rg} --target-server-name {target_server} --target-server-type SQLInstance --target-subscription-id {target_subscription} --target-vault-name {target_vault} --workload-type SQLDataBase --ids {source_item_id}

Restaurar instantáneas de la instancia SQL

Los siguientes ejemplos usan la sintaxis shell de PowerShell, no Bash. Utiliza una versión de CLI de Azure que exponga las opciones de instantáneas mostradas en este artículo. Revisa los requisitos previos para la restauración de instantáneas y la matriz de soporte.

Cambia los marcadores antes de usarlos. Completa la configuración común y elige solo el escenario de restauración necesario. Los siguientes ejemplos son alternativas, no un script para ejecutar en su totalidad. Los comandos de restauración pueden sobrescribir los datos o cambiar las conexiones de los discos.

Configurar variables de restauración de instantáneas

Use la suscripción del almacén para $vaultSubscription. Prepara el grupo de recursos objetivo y la identidad gestionada asignada por el usuario con los permisos requeridos:

$vaultSubscription = "<vault-subscription-id>"
$vaultRg = "<vault-rg>"
$vaultName = "<vault-name>"
$sourceVm = "<source-vm-name>"
$targetVm = "<target-vm-name>"
$targetInstanceName = "<target-instance-name>"
$restoreRg = "<restore-resource-group>"
$uamiId = "/subscriptions/<subscription-id>/resourceGroups/<identity-rg>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<identity-name>"
$vaultArgs = @("--subscription", $vaultSubscription, "--resource-group", $vaultRg, "--vault-name", $vaultName)

az backup vault show --subscription $vaultSubscription --resource-group $vaultRg --name $vaultName
az backup container list @vaultArgs --backup-management-type AzureWorkload `
  --query "[].{Name:name,VM:properties.friendlyName}" --output table
$containerName = "<native-source-container-name>"
$targetContainerName = "<native-target-container-name>"
$sourceArgs = $vaultArgs + @("--container-name", $containerName, "--backup-management-type", "AzureWorkload")

az backup item list @sourceArgs --workload-type SQLInstance --output json
$instanceItemName = "<native-protected-instance-item-name>"
$instanceArgs = $sourceArgs + @("--item-name", $instanceItemName, "--workload-type", "SQLInstance")

Copia los nombres exactos nativos de contenedores y elementos protegidos de la salida del servicio. La configuración de origen y de destino anterior usa el mismo almacén. Para restauraciones en ubicaciones alternativas, verifica que la instancia objetivo sea descubrible:

az backup protectable-item show @vaultArgs --workload-type MSSQL `
  --protectable-item-type SQLInstance --name $targetInstanceName --server-name $targetVm

Las opciones largas en estos ejemplos también soportan los siguientes alias más cortos:

Opción larga Alias
--restore-point-query-type --rp-query-type
--get-latest-recovery-point-only --latest-rp-only
--base-snapshot-recovery-point-id --base-snapshot-rp-id
--base-recovery-point-datasource-id --base-datasource-id

Consultar los puntos de recuperación de instantáneas

Enumera todos los tipos de puntos de recuperación solicitados para una ventana temporal, solo instantáneas o solo la última instantánea:

$startDate = (Get-Date).ToUniversalTime().AddDays(-7).ToString("dd-MM-yyyy-HH:mm:ss")
$endDate = (Get-Date).ToUniversalTime().ToString("dd-MM-yyyy-HH:mm:ss")
az backup recoverypoint list @instanceArgs --start-date $startDate --end-date $endDate `
  --restore-point-query-type FullDifferentialAndSnapshot --output json
az backup recoverypoint list @instanceArgs --restore-point-query-type Snapshot --output json
az backup recoverypoint list @instanceArgs --restore-point-query-type Snapshot `
  --get-latest-recovery-point-only true --output json

Elige un punto de recuperación explícitamente; no asumas el orden de la lista. Recupera todos sus datos para inspeccionar las bases de datos incluidas y la información del sistema de archivos:

$snapshotRpName = "<selected-snapshot-recovery-point-name>"
$snapshotJson = az backup recoverypoint show @instanceArgs --name $snapshotRpName --output json
if ($LASTEXITCODE -ne 0) { throw "Could not read the selected snapshot recovery point." }
$snapshotRp = $snapshotJson | ConvertFrom-Json

$snapshotRp.properties.extendedInfo.includedDatabases | Select-Object datasourceName, datasourceId
$snapshotRp.properties.extendedInfo.snapshotRecoveryPointInfo.snapshotResourceGroup
$snapshotRp.properties.extendedInfo.snapshotRecoveryPointInfo.sourceFilesystemInfo |
  Select-Object label, fileSystemType, accessPaths, isOnStorageSpace, storageSpaceInfo, diskInfoList

Consultar los intervalos de registros basados en instantáneas

Recupere el de la instanciaprotectedItemDataSourceId. Este ID es la fuente de datos base para consultas de registro, no el ID de fuente de datos de una base de datos individual.

$instanceJson = az backup item show @sourceArgs --name $instanceItemName `
  --workload-type SQLInstance --output json
if ($LASTEXITCODE -ne 0) { throw "Could not read the protected instance." }
$instanceItem = $instanceJson | ConvertFrom-Json
$instanceDatasourceId = $instanceItem.properties.protectedItemDataSourceId

az backup item list @sourceArgs --workload-type MSSQL --output json
$dbItemName = "<selected-native-database-item-name>"
$databaseArgs = $sourceArgs + @("--item-name", $dbItemName, "--workload-type", "MSSQL")
az backup recoverypoint show-log-chain @databaseArgs `
  --recovery-mode SnapshotAttachAndRecover `
  --base-snapshot-recovery-point-id $snapshotRpName `
  --base-recovery-point-datasource-id $instanceDatasourceId --output json

Selecciona un elemento de base de datos que corresponda a una de las bases de datos incluidas en la instantánea. Use show-log-chain para los intervalos de tiempo de recuperación continua, en lugar de tratar los puntos de recuperación individuales como intervalos de registros.

Restauración de la ubicación original de la instancia

Genera la configuración de restauración de ubicación original (OLR).

$configFile = ".\instance-olr.json"
az backup recoveryconfig show @instanceArgs --rp-name $snapshotRpName `
  --restore-mode OriginalWorkloadRestore --recovery-mode SnapshotAttachAndRecover `
  --snapshot-rg $restoreRg --identity-arm-id $uamiId --output json |
  Set-Content -Encoding utf8 $configFile

Antes de enviar, inspecciona los mapeos de volumen. La restauración de la ubicación original puede sobrescribir las bases de datos originales.

Restauración de instancias en una ubicación alternativa

Usa el contenedor de destino, el servidor y la instancia SQL. Establece --target-item-name en el nombre de base de datos objetivo requerido o en un patrón de nombres de instancia compatible con el servicio:

$configFile = ".\instance-alr.json"
az backup recoveryconfig show @instanceArgs --rp-name $snapshotRpName `
  --restore-mode AlternateWorkloadRestore --recovery-mode SnapshotAttachAndRecover `
  --target-container-name $targetContainerName --target-server-name $targetVm `
  --target-server-type SQLInstance --target-instance-name $targetInstanceName `
  --target-item-name "<target-database-name-or-service-supported-instance-pattern>" `
  --snapshot-rg $restoreRg --identity-arm-id $uamiId --output json |
  Set-Content -Encoding utf8 $configFile

Restauración de instancias a un momento dado

Utiliza la instantánea de la instancia seleccionada y su ID de la fuente de datos base de las consultas anteriores. Resuelva cada base de datos incluida en un elemento protegido único y, a continuación, consulte sus intervalos de registros por encima de esa instantánea:

$includedDatabases = @($snapshotRp.properties.extendedInfo.includedDatabases)
if ($includedDatabases.Count -eq 0) { throw "The snapshot has no included databases." }
$itemsJson = az backup item list @sourceArgs --workload-type MSSQL --output json
if ($LASTEXITCODE -ne 0) { throw "Could not list protected databases." }
$databaseItems = @($itemsJson | ConvertFrom-Json)
$logRangesPerDb = @{}
foreach ($database in $includedDatabases) {
  $matchingItems = @($databaseItems | Where-Object {
    $_.properties.protectedItemDataSourceId -eq $database.datasourceId
  })
  if ($matchingItems.Count -eq 0) {
    $matchingItems = @($databaseItems | Where-Object {
      $_.name -eq "SQLDataBase;$($database.datasourceName)" -or
      $_.properties.friendlyName -eq $database.datasourceName
    })
  }
  if ($matchingItems.Count -ne 1) {
    throw "Could not uniquely resolve included database $($database.datasourceName)."
  }
  $rangesJson = az backup recoverypoint show-log-chain @sourceArgs `
    --item-name $matchingItems[0].name --workload-type MSSQL `
    --recovery-mode SnapshotAttachAndRecover `
    --base-snapshot-recovery-point-id $snapshotRpName `
    --base-recovery-point-datasource-id $instanceDatasourceId `
    --query "[].properties.timeRanges[]" --output json
  if ($LASTEXITCODE -ne 0) { throw "Could not query snapshot-based log ranges." }
  $logRangesPerDb[$database.datasourceName] = @(
    foreach ($range in ($rangesJson | ConvertFrom-Json)) {
      if (-not $range.startTime -or -not $range.endTime) {
        throw "The service returned a log range without startTime or endTime."
      }
      [PSCustomObject]@{
        ItemName = $matchingItems[0].name
        StartTime = ([DateTimeOffset]$range.startTime).UtcDateTime
        EndTime = ([DateTimeOffset]$range.endTime).UtcDateTime
      }
    }
  )
  if ($logRangesPerDb[$database.datasourceName].Count -eq 0) {
    throw "No snapshot-based log ranges for $($database.datasourceName)."
  }
}

Inspecciona los rangos de una base de datos y elige una hora UTC. El siguiente ejemplo elige la hora de finalización más tardía para esa base de datos y luego verifica que la hora también esté disponible para todas las bases de datos incluidas. Si la validación falla, selecciona una hora dentro de los rangos comunes disponibles y vuelve a ejecutar la comprobación:

$selectedDatabase = "<instance-name>;<database-name>"
if (-not $logRangesPerDb.ContainsKey($selectedDatabase)) {
  throw "Select a database from logRangesPerDb.Keys."
}
$selectedRanges = @($logRangesPerDb[$selectedDatabase] | Sort-Object EndTime)
$selectedRanges | Format-Table ItemName, StartTime, EndTime
$rangeIndex = -1
$pointInTime = $selectedRanges[$rangeIndex].EndTime
foreach ($databaseName in $logRangesPerDb.Keys) {
  $matchingRanges = @($logRangesPerDb[$databaseName] | Where-Object {
    $_.StartTime -le $pointInTime -and $_.EndTime -ge $pointInTime
  })
  if ($matchingRanges.Count -eq 0) {
    throw "The chosen restore time is unavailable for $databaseName."
  }
}
$pit = $pointInTime.ToString("dd-MM-yyyy-HH:mm:ss")

Genera la configuración PITR usando la instantánea base y el tiempo de reproducción validado del log:

$configFile = ".\instance-pit.json"
az backup recoveryconfig show @instanceArgs --rp-name $snapshotRpName --log-point-in-time $pit `
  --restore-mode AlternateWorkloadRestore --recovery-mode SnapshotAttachAndRecover `
  --target-container-name $targetContainerName --target-server-name $targetVm `
  --target-server-type SQLInstance --target-instance-name $targetInstanceName `
  --target-item-name "<target-database-name-or-service-supported-instance-pattern>" `
  --snapshot-rg $restoreRg --identity-arm-id $uamiId --no-recovery-mode `
  --output json | Set-Content -Encoding utf8 $configFile

--no-recovery-mode solicita que las bases de datos permanezcan sin recuperar para los pasos posteriores de recuperación. Revisa si ese comportamiento es apropiado para tu plan de recuperación.

Restauración de instancias como discos

Use SnapshotAttach para la restauración como discos (RAD), en lugar de la conexión de la instantánea seguida de la recuperación de la base de datos:

$configFile = ".\instance-rad.json"
az backup recoveryconfig show @instanceArgs --rp-name $snapshotRpName `
  --restore-mode AlternateWorkloadRestore --recovery-mode SnapshotAttach `
  --target-container-name $targetContainerName --target-server-name $targetVm `
  --target-server-type SQLInstance --target-instance-name $targetInstanceName `
  --snapshot-rg $restoreRg --identity-arm-id $uamiId --output json |
  Set-Content -Encoding utf8 $configFile

Restaurar una base de datos protegida bajo una instancia

Selecciona el nombre exacto del elemento nativo de la base de datos del contenedor de origen. Para restauraciones a un punto de recuperación, elige explícitamente una instantánea de la base de datos:

az backup item list @sourceArgs --workload-type MSSQL --output json
$dbItemName = "<native-protected-database-item-name>"
$databaseArgs = $sourceArgs + @("--item-name", $dbItemName, "--workload-type", "MSSQL")
az backup recoverypoint list @databaseArgs --restore-point-query-type Snapshot --output json
$dbSnapshotRpName = "<chosen-database-snapshot-recovery-point-name>"
az backup recoverypoint show @databaseArgs --name $dbSnapshotRpName --output json

Restauración de ubicación alternativa de la base de datos

$configFile = ".\database-alr.json"
az backup recoveryconfig show @databaseArgs --rp-name $dbSnapshotRpName `
  --restore-mode AlternateWorkloadRestore --recovery-mode SnapshotAttachAndRecover `
  --target-container-name $targetContainerName --target-server-name $targetVm `
  --target-server-type SQLInstance --target-instance-name $targetInstanceName `
  --target-item-name "<restored-db-name>" --snapshot-rg $restoreRg `
  --identity-arm-id $uamiId --no-recovery-mode --output json |
  Set-Content -Encoding utf8 $configFile

Restauración en un momento determinado de la base de datos

Consulta los rangos de registros disponibles y elige una hora UTC dentro de un rango devuelto. Usa el formato dd-MM-yyyy-HH:mm:ss:

az backup recoverypoint show-log-chain @databaseArgs --output json
$pit = "<dd-MM-yyyy-HH:mm:ss-in-UTC-within-a-returned-range>"
$configFile = ".\database-pit.json"
az backup recoveryconfig show @databaseArgs --log-point-in-time $pit `
  --restore-mode AlternateWorkloadRestore --recovery-mode SnapshotAttachAndRecover `
  --target-container-name $targetContainerName --target-server-name $targetVm `
  --target-server-type SQLInstance --target-instance-name $targetInstanceName `
  --target-item-name "<restored-db-name>" --snapshot-rg $restoreRg `
  --identity-arm-id $uamiId --no-recovery-mode --output json |
  Set-Content -Encoding utf8 $configFile

Los ejemplos de restauración de bases de datos anteriores también utilizan --no-recovery-mode. Revisa esa configuración antes de enviarla.

Restauración de bases de datos como discos

$configFile = ".\database-rad.json"
az backup recoveryconfig show @databaseArgs --rp-name $dbSnapshotRpName `
  --restore-mode AlternateWorkloadRestore --recovery-mode SnapshotAttach `
  --target-container-name $targetContainerName --target-server-name $targetVm `
  --target-server-type SQLInstance --target-instance-name $targetInstanceName `
  --snapshot-rg $restoreRg --identity-arm-id $uamiId --output json |
  Set-Content -Encoding utf8 $configFile

Restauración de bases de datos como discos con los registros como archivos

Establezca $pit en una hora UTC válida de los intervalos de registros de la base de datos, como en el ejemplo de PITR de base de datos. Genera la configuración de adjunción del disco y luego establece el destino para los archivos de registro:

$configFile = ".\database-rad-logs.json"
az backup recoveryconfig show @databaseArgs --log-point-in-time $pit `
  --restore-mode AlternateWorkloadRestore --recovery-mode SnapshotAttach `
  --target-container-name $targetContainerName --target-server-name $targetVm `
  --target-server-type SQLInstance --target-instance-name $targetInstanceName `
  --snapshot-rg $restoreRg --identity-arm-id $uamiId --output json |
  Set-Content -Encoding utf8 $configFile

Tras confirmar que la generación de configuración ha tenido éxito, edita los mapeos generados:

$cfg = Get-Content -Raw $configFile | ConvertFrom-Json
$cfg.target_directory_mapping = @{ all = 'C:\temp' }
($cfg.target_physical_path | Where-Object source_path -eq 'E:\').target_path = 'M:\'
$cfg | ConvertTo-Json -Depth 100 | Set-Content -Encoding utf8 $configFile

Revisar y enviar una restauración de instantáneas

Para cada escenario seleccionado, confirme que az backup recoveryconfig show se realice correctamente antes de usar su salida. Inspecciona el archivo generado y los mapeos de volúmenes. Reasigna solo volúmenes fuente que requieran una ruta de destino diferente. Sustituye las letras de unidad de ejemplo por rutas reales:

$cfg = Get-Content -Raw $configFile | ConvertFrom-Json
$cfg.target_physical_path | Format-Table source_path, target_path
($cfg.target_physical_path | Where-Object source_path -eq 'E:\').target_path = 'X:\'
$cfg | ConvertTo-Json -Depth 100 | Set-Content -Encoding utf8 $configFile

El remapeo previo es opcional. Conserva los mapeos previstos para el escenario que haya seleccionado, incluyendo cualquier configuración de disco y archivo de registro de la base de datos.

Si se requiere desconexión de disco para resolver un conflicto en el sistema de archivos, añadir solo identificadores de disco explícitamente aprobados a la configuración generada:

$cfg = Get-Content -Raw $configFile | ConvertFrom-Json
$cfg.disks_to_detach_on_clash = @(
  "/subscriptions/<subscription-id>/resourceGroups/<disk-rg>/providers/Microsoft.Compute/disks/<disk-name>"
)
$cfg | ConvertTo-Json -Depth 100 | Set-Content -Encoding utf8 $configFile

Advertencia

Desacoplar discos existentes puede interrumpir las cargas de trabajo de destino. Verifica cada ID de disco y la configuración completa de recuperación antes de confirmar la restauración. No apliques el ejemplo opcional de desacoplamiento de disco a menos que la operación sea requerida y aprobada.

Envía solo el archivo de configuración para la operación elegida:

az backup restore restore-azurewl @vaultArgs --recovery-config $configFile

Rastrea el nombre del trabajo devuelto con az backup job show. Para comandos de protección contra paradas y de desregistro, consulta Gestionar copias de seguridad instantáneas de instancias SQL.

Paso siguiente