Fazer backup de bancos de dados SQL na VM do Azure usando a CLI do Azure

A CLI do Azure é usada para criar e gerenciar recursos do Azure a partir da Linha de Comando ou por meio de scripts. Este artigo descreve como fazer backup de um banco de dados SQL na VM do Azure e disparar backups sob demanda usando a CLI do Azure. Você também pode executar essas ações usando o portal do Azure.

Este artigo pressupõe que você já tenha um banco de dados SQL instalado em uma VM do Azure. (Você também pode criar uma VM usando a CLI do Azure).

Neste artigo, vai aprender a:

  • Criar um cofre dos Serviços de Recuperação
  • Registre o servidor SQL e descubra o(s) banco(s) de dados nele
  • Habilitar backup em um banco de dados SQL
  • Acionar um backup sob demanda

Para visualizar os cenários de backup e restauração aos quais damos suporte atualmente, consulte a matriz de suporte. Para perguntas comuns, consulte as perguntas frequentes.

Pré-requisitos

Criar um cofre dos Serviços de Recuperação

Um cofre dos Serviços de Recuperação é um contêiner lógico que armazena os dados de backup para cada recurso protegido, como VMs do Azure ou cargas de trabalho em execução em VMs do Azure - por exemplo, bancos de dados SQL ou HANA. Quando a tarefa de backup de um recurso protegido é executada, cria um ponto de recuperação dentro do cofre de Serviços de Recuperação. Em seguida, pode utilizar um destes pontos de recuperação para restaurar dados para um determinado ponto no tempo.

Crie um cofre dos Serviços de Recuperação com o comando az backup vault create . Use o grupo de recursos e o local como o da VM que você deseja proteger. Saiba como criar uma VM do Windows e uma VM do Linux usando a CLI do Azure.

Para este artigo, vamos usar:

  • Um grupo de recursos chamado SQLResourceGroup
  • Uma VM chamada testSQLVM
  • Recursos na localização de westus2.

Execute o seguinte comando para criar um cofre chamado SQLVault.

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

Por predefinição, o cofre dos Serviços de Recuperação está definido para Armazenamento georredundante. O armazenamento com redundância geográfica garante que seus dados de backup sejam replicados para uma região secundária do Azure, mesmo que isso esteja a centenas de quilômetros de distância da região primária. Se precisar modificar a configuração de redundância de armazenamento, utilize o comando az backup vault backup-properties set.

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

Para verificar se o vault foi criado com êxito, use o comando az backup vault list . A resposta aparece como:

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

Registrar e proteger o SQL Server

Para registrar o SQL Server no cofre dos Serviços de Recuperação, use o comando az backup container register . VMResourceId é a ID de recurso da VM que você criou para instalar o SQL.

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

Nota

Se a VM não estiver presente no mesmo grupo de recursos que o vault, SQLResourceGroup usará o grupo de recursos onde o vault foi criado.

O registro do servidor SQL descobre automaticamente todos os seus bancos de dados atuais. No entanto, para descobrir novos bancos de dados que possam ser adicionados no futuro, consulte a seção Descobrindo novos bancos de dados adicionados ao SQL Server registrado .

Use o comando az backup container list para verificar se a instância SQL foi registrada com êxito no seu cofre. A resposta aparece como:

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

Nota

O nome da coluna na saída acima refere-se ao nome do contêiner. Esse nome de contêiner é usado nas próximas seções para habilitar backups e acioná-los. Por exemplo, VMAppContainer;Compute;SQLResourceGroup;testSQLVM.

Habilitar backup no banco de dados SQL

O comando az backup protectable-item list lista todos os bancos de dados descobertos na instância SQL que você registrou na etapa 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

Você deve encontrar o banco de dados nesta lista do qual deseja fazer backup, que aparece como:

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  

Agora, configure o backup para o sqldatabase; mssqlserver; banco de dados mestre.

Para configurar e proteger backups numa base de dados, use o comando az backup protection enable-for-azurewl. Forneça o nome da política que você deseja usar. Para criar uma política usando a CLI, use o comando az backup policy create . Para este artigo, utilizamos a 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

Você pode usar o mesmo comando, se tiver um Grupo de Disponibilidade Always On do SQL e quiser identificar a fonte de dados protegível dentro do grupo de disponibilidade. Aqui, o tipo de item protegível é SQLAG.

Para verificar se a configuração de backup acima está concluída, use o comando az backup job list . A saída aparece como:

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

O comando az backup job list lista todos os trabalhos de backup (agendados ou sob demanda) executados ou atualmente em execução no banco de dados protegido, além de outras operações, como registrar, configurar backup e excluir dados de backup.

Nota

O Backup do Azure não se ajusta automaticamente para alterações de horário de verão ao fazer backup de um banco de dados SQL em execução em uma VM do Azure.

Modifique a política manualmente conforme necessário.

Ativar a proteção automática

Para uma configuração de backup perfeita, todos os bancos de dados adicionados no futuro podem ser protegidos automaticamente com uma determinada política. Para habilitar a proteção automática, use o comando az backup protection auto-enable-for-azurewl.

Como a instrução é fazer backup de todos os bancos de dados futuros, a operação é feita em um nível 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

Acionar um backup sob demanda

Para acionar um backup a pedido, use o comando az backup protection backup-now.

Nota

O período de retenção desse backup é determinado pelo tipo de backup sob demanda executado.

  • O On-demand Full retém backups por um período mínimo de 45 dias e máximo de 99 anos.
  • A cópia completa sob demanda aceita qualquer valor para retenção.
  • O diferencial sob demanda retém o backup de acordo com a retenção de diferenciais agendados definidos na política.
  • O log sob demanda retém backups de acordo com a retenção de logs agendados definida na política.
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

A saída aparece como:

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

A resposta fornece o nome do trabalho. Você pode usar esse nome de trabalho para acompanhar o status do trabalho usando o comando az backup job show .

Configurar backup de snapshot da instância SQL

Os exemplos seguintes de snapshots utilizam a sintaxe shell do PowerShell, incluindo backticks para continuação de linha e array splatting para argumentos comuns da CLI. Não são scripts do Bash. Use uma versão do CLI do Azure que exponha as opções de snapshot aqui apresentadas e reveja a matriz de suporte a snapshots e os pré-requisitos para snapshots.

Substitua todos os marcadores antes de executar um comando. Execute apenas a operação pretendida; os exemplos são fluxos de trabalho separados, não um único script para executar na totalidade.

Configurar variáveis de backup snapshot

Utilize a subscrição e o grupo de recursos do vault, mesmo que a VM esteja noutra subscrição:

$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 ficheiros de política snapshot

Defina $snapshotRg como o nome real do grupo de recursos do instantâneo. Este exemplo utiliza retenção diária e de registos de sete dias, com retenção de instantâneos instantâneos de cinco dias. A retenção diária e de registos deve ser de pelo menos sete dias; a retenção de snapshots instantâneos é configurada separadamente.

Leia a identidade gerida atribuída pelo utilizador e crie o 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" }
                }
            }
        )
    }
}

Guarde a política snapshot-and-log antes de remover a subpolítica de log para criar um ficheiro separado apenas para snapshot:

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

Criar políticas de instantâneo

Crie as duas políticas a partir dos respetivos ficheiros. Selecione a política adequada às suas necessidades de proteção ao ativar backup:

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

Registe a VM para proteção da instância

Para uma VM noutra subscrição, forneça o seu ID de recurso e a subscrição do contentor de recursos. O alias opcional --container-sub-id pode substituir --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>"

Descubra instâncias que podem ser protegidas

A descoberta utiliza MSSQL para componentes SQL. Lista os componentes, filtra as instâncias por servidor e depois recupera a instância pretendida:

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

Ativar a proteção de snapshot

Selecione a política de snapshots e as bases de dados de utilizadores 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"

Desencadear um backup de snapshot a pedido

Liste os contentores registados e os itens protegidos. Copie os seus nomes nativos exatos em vez de os criá-los:

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

Utilize o nome da tarefa devolvido com az backup job show para acompanhar o progresso. Para comandos de ponto de recuperação e restauração, consulte Restaurar snapshots de instâncias SQL.

Próximos passos