Copia de seguridad 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 realizar una copia de seguridad de una base de datos de SQL en una máquina virtual de Azure y desencadenar copias de seguridad a petición mediante la CLI de Azure. También puede llevar a cabo estas acciones con Azure Portal.

En este artículo se da por supuesto que ya tiene una base de datos de SQL instalada en una máquina virtual de Azure. (También puede crear una máquina virtual mediante la CLI de Azure).

En este artículo, aprenderá a:

  • Creación de un almacén de Recovery Services
  • Registro de una instancia de SQL Server y detección de bases de datos en ella
  • Habilitación de la copia de seguridad en una base de datos de SQL
  • Desencadenamiento de una copia de seguridad a petición

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.

Prerrequisitos

Creación de un almacén de Recovery Services

Un almacén de Recovery Services es un contenedor lógico que almacena los datos de copia de seguridad de los recursos protegidos, como las máquinas virtuales de Azure o las cargas de trabajo que se ejecutan en estas (como las bases de datos de SQL o de HANA). Cuando se ejecuta el trabajo de copia de seguridad para un recurso protegido, crea un punto de recuperación en el almacén de Recovery Services. Posteriormente, se puede usar uno de estos puntos de recuperación para restaurar los datos a un momento dado en el tiempo.

Cree un almacén de Recovery Services con el comando az backup vault create. Use el mismo grupo de recursos y ubicación de la máquina virtual que desea proteger. Aprenda a crear una máquina virtual Windows y una máquina virtual Linux con la CLI de Azure.

En este artículo, usaremos:

  • Un grupo de recursos denominado SQLResourceGroup
  • Una máquina virtual denominada testSQLVM
  • Recursos en la ubicación westus2.

Ejecute el comando siguiente para crear un almacén denominado SQLVault.

az backup vault create --resource-group SQLResourceGroup \
    --name SQLVault \
    --location westus2

De forma predeterminada, la bóveda de Recovery Services está configurada para el almacenamiento con redundancia geográfica. El almacenamiento con redundancia geográfica garantiza que los datos de copia de seguridad se replican en una región de Azure secundaria aunque se encuentre a cientos de kilómetros de distancia de la región primaria. Si es necesario modificar la configuración de redundancia del almacenamiento, utilice el comando az backup vault backup-properties set.

az backup vault backup-properties set \
    --name SQLVault  \
    --resource-group SQLResourceGroup \
    --backup-storage-redundancy "LocallyRedundant/GeoRedundant"

Para comprobar si el almacén se ha creado correctamente, use el comando az backup vault list. La respuesta aparece como:

Location   Name             ResourceGroup
---------  ---------------  -------------  
westus2    SQLVault     	SQLResourceGroup

Registro y protección de SQL Server

Para registrar SQL Server con el almacén de Recovery Services, use el comando az backup container register. VMResourceId es el identificador de recurso de la máquina virtual que creó para instalar SQL.

az backup container register --resource-group SQLResourceGroup \
    --vault-name SQLVault \
    --workload-type SQLDataBase \
    --backup-management-type AzureWorkload \
    --resource-id VMResourceId

Nota

Si la máquina virtual no está en el mismo grupo de recursos que el almacén, SQLResourceGroup usará el grupo de recursos donde se creó el almacén.

Al registrar el servidor SQL se detectan automáticamente todas sus bases de datos actuales. Sin embargo, para detectar las nuevas que se puedan agregar en el futuro, consulte la sección Detección de las nuevas bases de datos agregadas a SQL Server tras su registro.

Use el comando az backup container list para verificar si la instancia de SQL se ha registrado exitosamente en tu bóveda. La respuesta aparece como:

Name                                                    Friendly Name    Resource Group        Type           Registration Status
------------------------------------------------------  --------------   --------------------  ---------      ----------------------
VMAppContainer;Compute;SQLResourceGroup;testSQLVM   	testSQLVM        SQLResourceGroup  		AzureWorkload  Registered

Nota

La columna name de la salida anterior hace referencia al nombre del contenedor. Este nombre de contenedor se usa en las secciones siguientes para habilitar las copias de seguridad y desencadenarlas. Por ejemplo, VMAppContainer;Compute;SQLResourceGroup;testSQLVM.

Habilitación de la copia de seguridad en la base de datos de SQL

El comando az backup protectable-item list enumera todas las bases de datos detectadas en la instancia de SQL que registró en el paso anterior.

az backup protectable-item list --resource-group SQLResourceGroup \
    --vault-name SQLVault \
    --workload-type SQLDataBase \
	--backup-management-type AzureWorkload \
	--protectable-item-type SQLDataBase \
    --output table

Debería encontrar la base de datos de la que desea realizar una copia de seguridad en esta lista, que tendrá el siguiente aspecto:

Name                           		Protectable Item Type    ParentName    ServerName    	IsProtected
-----------------------------  		----------------------   ------------  -----------   	------------
sqldatabase;mssqlserver;master      SQLDataBase              MSSQLServer   testSQLVM        NotProtected  
sqldatabase;mssqlserver;model       SQLDataBase              MSSQLServer   testSQLVM        NotProtected  
sqldatabase;mssqlserver;msdb        SQLDataBase              MSSQLServer   testSQLVM        NotProtected  

Ahora, configure la copia de seguridad para la base de datos sqldatabase;mssqlserver;master.

Para configurar y proteger copias de seguridad en una base de datos, utiliza el comando az backup protection enable-for-azurewl. Proporcione el nombre de la directiva que desee usar. Para crear una directiva mediante la CLI, use el comando az backup policy create. Para este artículo, utilizamos la política SQLPolicy .

az backup protection enable-for-azurewl --resource-group SQLResourceGroup \
    --vault-name SQLVault \
    --policy-name SQLPolicy \
    --protectable-item-name "sqldatabase;mssqlserver;master"  \
    --protectable-item-type SQLDataBase \
    --server-name testSQLVM \
    --workload-type SQLDataBase \
    --output table

Puede usar el mismo comando si tiene un grupo de disponibilidad de SQL Always On y desea identificar el origen de datos que se puede proteger dentro del grupo de disponibilidad. Aquí, el tipo de elemento que se puede proteger es SQLAG.

Para comprobar si se ha completado la configuración de copia de seguridad anterior, use el comando az backup job list. La salida tiene el siguiente aspecto:

Name                                  Operation         Status     Item Name   Start Time UTC
------------------------------------  ---------------   ---------  ----------  -------------------  
e0f15dae-7cac-4475-a833-f52c50e5b6c3  ConfigureBackup   Completed  master         2019-12-03T03:09:210831+00:00  

El comando az backup job list enumera todos los trabajos de copia de seguridad (programados o a petición) que se han ejecutado o que se están ejecutando actualmente en la base de datos protegida, además de otras operaciones como el registro, la configuración de la copia de seguridad y la eliminación de datos de la copia de seguridad.

Nota

Azure Backup no se ajusta automáticamente a los cambios del horario de verano cuando se realiza la copia de seguridad de una base de datos de SQL en una máquina virtual de Azure.

Modifique la directiva de forma manual según sea necesario.

Habilitación de la protección automática

Para una configuración de copia de seguridad correcta, todas las bases de datos que se agreguen en el futuro se pueden proteger automáticamente con una determinada directiva. Para habilitar la protección automática, use el comando az backup protection auto-enable-for-azurewl.

Puesto que la indicación es realizar la copia de seguridad de todas las bases de datos futuras, la operación se realiza a nivel de SQLInstance.

az backup protection auto-enable-for-azurewl --resource-group SQLResourceGroup \
    --vault-name SQLVault \
    --policy-name SQLPolicy \
    --protectable-item-name "sqlinstance;mssqlserver"  \
    --protectable-item-type SQLInstance \
    --server-name testSQLVM \
    --workload-type MSSQL\
    --output table

Desencadenamiento de una copia de seguridad a petición

Para desencadenar una copia de seguridad a petición, utilice el comando az backup protection backup-now.

Nota

El período de retención de esta copia de seguridad viene determinado por el tipo de copia de seguridad a petición que se haya ejecutado.

  • Completa a petición conserva las copias de seguridad durante un mínimo de 45 días y un máximo de 99 años.
  • Solo copia a petición completa acepta cualquier valor para la retención.
  • La copia diferencial a petición conserva la copia de seguridad según la retención delas copias diferenciales programadas establecidos en la directiva.
  • Registro a petición conserva las copias de seguridad según la retención de registros programados establecidos en la directiva.
az backup protection backup-now --resource-group SQLResourceGroup \
    --item-name "sqldatabase;mssqlserver;master" \
    --vault-name SQLVault \
    --container-name "VMAppContainer;Compute;SQLResourceGroup;testSQLVM" \
    --backup-type Full \
    --retain-until 01-01-2040 \
    --output table

La salida tiene el siguiente aspecto:

Name                                  ResourceGroup
------------------------------------  -------------
e0f15dae-7cac-4475-a833-f52c50e5b6c3  sqlResourceGroup

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.

Configurar la copia de seguridad de instantánea de instancia SQL

Los siguientes ejemplos de instantáneas utilizan la sintaxis del shell de PowerShell, incluyendo backticks para la continuación de línea y splatting de arrays para argumentos comunes de CLI. No son scripts de Bash. Utiliza una versión de CLI de Azure que exponga las opciones de snapshot mostradas aquí, y revisa la matriz de soporte para snapshots y los requisitos previos para snapshots.

Cambia todos los marcadores de posición antes de ejecutar un comando. Ejecuta solo la operación prevista; los ejemplos son flujos de trabajo separados, no un único script que debe ejecutarse por completo.

Configurar las variables de la copia de seguridad de instantáneas

Use la suscripción y el grupo de recursos del almacén, aunque la máquina virtual esté en otra suscripción:

$vaultSubscription = "<vault-subscription-id>"
$vaultRg = "<vault-rg>"
$vaultName = "<vault-name>"
$sourceVm = "<source-vm-name>"
$instanceName = "<instance-name>"
$snapshotRg = "<snapshot-resource-group-name>"
$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

Preparar archivos de política de instantáneas

Establezca $snapshotRg en el nombre real del grupo de recursos de la instantánea. Este ejemplo utiliza retención diaria y de registros de siete días, con retención de instantáneas de cinco días. La retención diaria y de registros debe ser de al menos siete días; la retención de instantáneas instantáneas se configura por separado.

Lee la identidad gestionada asignada por el usuario y crea el objeto de política:

$identityJson = az identity show --ids $uamiId --output json
if ($LASTEXITCODE -ne 0) { throw "Could not read the managed identity." }
$identity = $identityJson | ConvertFrom-Json
$snapshotTime = "2026-10-15T02:00:00Z"
$policy = @{
    properties = @{
        backupManagementType = "AzureWorkload"
        workLoadType = "SQLInstance"
        vmWorkloadPolicyType = "SnapshotV2"
        settings = @{ timeZone = "UTC"; issqlcompression = $false; isCompression = $false }
        subProtectionPolicy = @(
            @{
                policyType = "SnapshotFull"
                schedulePolicy = @{
                    schedulePolicyType = "SimpleSchedulePolicy"
                    scheduleRunFrequency = "Daily"
                    scheduleRunTimes = @($snapshotTime)
                }
                retentionPolicy = @{
                    retentionPolicyType = "LongTermRetentionPolicy"
                    dailySchedule = @{
                        retentionTimes = @($snapshotTime)
                        retentionDuration = @{ count = 7; durationType = "Days" }
                    }
                }
                snapshotBackupAdditionalDetails = @{
                    instantRpRetentionRangeInDays = 5
                    instantRPDetails = $snapshotRg
                    userAssignedManagedIdentityDetails = @{
                        identityArmId = $uamiId
                        identityName = $identity.name
                        userAssignedIdentityProperties = @{
                            clientId = $identity.clientId
                            principalId = $identity.principalId
                        }
                    }
                }
            },
            @{
                policyType = "Log"
                schedulePolicy = @{
                    schedulePolicyType = "LogSchedulePolicy"
                    scheduleFrequencyInMins = 60
                }
                retentionPolicy = @{
                    retentionPolicyType = "SimpleRetentionPolicy"
                    retentionDuration = @{ count = 7; durationType = "Days" }
                }
            }
        )
    }
}

Guarda la política de instantáneas y registros antes de eliminar la subpolítica de registro para crear un archivo independiente de solo instantáneas:

$policy | ConvertTo-Json -Depth 100 |
    Set-Content -Encoding utf8 ".\sqlinst-snaplog-policy.json"
$policy.properties.subProtectionPolicy = @(
    $policy.properties.subProtectionPolicy | Where-Object policyType -eq "SnapshotFull"
)
$policy | ConvertTo-Json -Depth 100 |
    Set-Content -Encoding utf8 ".\sqlinst-snapshot-policy.json"

Crear directivas de instantáneas

Crea las dos políticas a partir de sus respectivos archivos. Selecciona la política adecuada para tus necesidades de protección al habilitar una copia de seguridad:

az backup policy create @vaultArgs --name "SqlInst-SnapLog" `
    --backup-management-type AzureWorkload --workload-type SQLInstance `
    --policy ".\sqlinst-snaplog-policy.json"

az backup policy create @vaultArgs --name "SqlInst-SnapOnly" `
    --backup-management-type AzureWorkload --workload-type SQLInstance `
    --policy ".\sqlinst-snapshot-policy.json"

az backup policy show @vaultArgs --name "SqlInst-SnapLog" --output json

Registrar la máquina virtual para la protección de instancias

Para una máquina virtual en otra suscripción, proporciona su ID de recurso y la suscripción al contenedor. El alias opcional --container-sub-id puede sustituir --container-subscription-id:

az backup container register @vaultArgs `
    --resource-id "/subscriptions/<vm-subscription-id>/resourceGroups/<vm-rg>/providers/Microsoft.Compute/virtualMachines/<vm-name>" `
    --backup-management-type AzureWorkload --workload-type SQLInstance `
    --container-subscription-id "<vm-subscription-id>"

Detectar las instancias que se pueden proteger

Discovery usa MSSQL para componentes SQL. Lista los componentes, filtra las instancias por servidor y luego recupera la instancia prevista:

az backup protectable-item list @vaultArgs --workload-type MSSQL --output json
az backup protectable-item list @vaultArgs --workload-type MSSQL `
    --protectable-item-type SQLInstance --server-name $sourceVm --output json
az backup protectable-item show @vaultArgs --workload-type MSSQL `
    --protectable-item-type SQLInstance --name $instanceName --server-name $sourceVm --output json

Habilitar la protección de instantáneas

Seleccione la política de instantáneas y las bases de datos de usuarios para proteger:

az backup protection enable-for-azurewl @vaultArgs `
    --policy-name "SqlInst-SnapLog" --workload-type SQLInstance `
    --protectable-item-type SQLInstance --protectable-item-name $instanceName `
    --server-name $sourceVm --child-database-names "Testdb1" "Testdb2" "Testdb4"

Activa una copia de seguridad de instantánea bajo demanda

Haz una lista de los contenedores registrados y los elementos protegidos. Copie sus nombres nativos exactos en lugar de construirlos:

az backup container list @vaultArgs --backup-management-type AzureWorkload `
    --query "[].{Name:name,VM:properties.friendlyName}" --output table
$containerName = "<native-source-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")

$retainUntil = (Get-Date).ToUniversalTime().AddDays(45).ToString("dd-MM-yyyy-HH:mm:ss")
az backup protection backup-now @instanceArgs --backup-type SnapshotFull --retain-until $retainUntil

Usa el nombre del trabajo devuelto con az backup job show para monitorizar el progreso. Para ver los comandos de punto de recuperación y de restauración, consulte Restaurar las instantáneas de instancias de SQL.

Pasos siguientes