Exportando SQL Database PaaS no Azure para Backup e Restore em Ambiente de Desenvolvimento

Exportando SQL Database PaaS no Azure para Backup e Restore em Ambiente de Desenvolvimento

Em cenários corporativos, a gestão de bases de dados em ambientes de produção exige cuidado especial, tanto em termos de segurança quanto de continuidade de serviços. Uma prática recomendada é separar operações de backup e restore do ambiente produtivo, garantindo isolamento, escalabilidade e governança.

Neste artigo, apresento um projeto desenvolvido para exportar uma base SQL PaaS no Azure para um Storage Account, com a finalidade de armazenar o backup em formato .bacpac e realizar o restore em um servidor de desenvolvimento.

Essa abordagem traz ganhos importantes em segurança, eficiência e redução de riscos.


Cenário do Projeto

O objetivo principal foi exportar o banco de dados hospedado em Azure SQL Database para um Storage Account, armazenando o arquivo .bacpac como backup seguro. Esse arquivo pode ser restaurado posteriormente em um servidor Dev, permitindo validações e testes sem impactar os recursos de produção.

Dessa forma, conseguimos:

  • Evitar consumo desnecessário de recursos no ambiente produtivo.
  • Mitigar riscos de incidentes, isolando atividades críticas.
  • Manter a integridade e governança dos dados exportados.

Arquitetura da Solução

A arquitetura foi construída com os seguintes componentes:

  • SQL Database PaaS – base de dados de origem.
  • Storage Account – repositório do arquivo .bacpac.
  • Azure Automation Account (Identidade Gerenciada) – responsável pela execução automatizada do processo via Runbook.
  • Azure Key Vault – armazena credenciais sensíveis (usuário e senha do banco).
  • Azure Database Migration Service (DMS) – serviço responsável pela exportação da base para o Storage.

Segurança e Governança

A segurança foi tratada como prioridade, adotando boas práticas de Identity & Access Management (IAM) e Data Protection:

  • Identidade Gerenciada → utilizada pela Automation Account, elimina a necessidade de credenciais fixas no código.
  • Azure Key Vault → garante que credenciais fiquem protegidas e acessadas apenas em tempo de execução.
  • RBAC (Role-Based Access Control) → permissões concedidas de forma granular:
    • Contributor no SQL Database.
    • Storage Blob Data Contributor no Storage Account.
    • Key Vault Secrets User/Reader no Key Vault.
  • Exportação via DMS → o serviço exige que o Storage esteja acessível publicamente, pois o DMS utiliza uma conexão implícita para a gravação do arquivo. Mesmo com Private Endpoints configurados, o processo não funcionará sem essa abertura controlada.

  • Obs.: Ao criar um segundo servidor sql de Dev, usei uma conta admin simples e senha, mas você pode e deve alocar essas informações também no Key Vault. Deixei o desafio para vocês. Script de restore está logo mais abaixo e não está associado ao cofre. Não criem ou publiquem chaves e senhas em scripts, seja de produção ou não, o intuito é der ideia que o processo é possível. Avalie também o export do seu banco, tamanho e impacto para esta exportação.

Benefícios da Solução

A solução entrega ganhos diretos em segurança, operação e escalabilidade:

  • 🔒 Segurança dos dados: backup armazenado em um ambiente isolado e protegido.
  • Eficiência operacional: restores podem ser feitos em ambientes de desenvolvimento, sem impactar produção.
  • 🤖 Automação confiável: Runbook garante execução padronizada e auditável.
  • 📊 Governança e conformidade: acessos centralizados e controlados via Key Vault e RBAC.
  • 📈 Escalabilidade: possibilidade de estender o processo para múltiplas bases ou diferentes ambientes.

Runbook em Poweshell 7.2

https://github.com/ErickMedeiros/exportDataBase

Altere todos os parametros de acordo com seu ambiente e crie um schedule, de preferência para ambientes produtivos, em horário de menor pico ou consumo.

# Parâmetros

$KeyVaultName          = “kv-exporddb”

$SqlServerName         = “sqldbteste0001”

$DatabaseName          = “estudados”

$StorageAccountName    = “stohomolexpoert0001”

$StorageContainer      = “sqldbbackup”

$StorageResourceGroup  = “RG-HOMOL”

$UserSecretName        = “sql-admin-user”

$PassSecretName        = “sql-admin-password”

$BackupPrefix          = “$DatabaseName-backup”

$RetentionCount        = 15

# Log início

$startTime = Get-Date

Write-Output “$startTime – Iniciando processo de backup BACPAC…”

# Valida módulo Az.Sql

if (-not (Get-Module -ListAvailable -Name Az.Sql)) {

    Write-Output “Instalando módulo Az.Sql…”

    Install-Module -Name Az.Sql -Force -Scope CurrentUser

}

# Autenticação (Managed Identity)

$AzContext = (Connect-AzAccount -Identity).Context

# Segredos do KeyVault

$sqlAdminUser = (Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name $UserSecretName -AsPlainText -DefaultProfile $AzContext).Trim()

$sqlAdminPassword = (Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name $PassSecretName -AsPlainText -DefaultProfile $AzContext).Trim()

# Storage Key

$storageAccountKey = (Get-AzStorageAccountKey -ResourceGroupName $StorageResourceGroup -Name $StorageAccountName -DefaultProfile $AzContext)[0].Value

$storageContext = New-AzStorageContext -StorageAccountName $StorageAccountName -StorageAccountKey $storageAccountKey

# Backup .bacpac

$backupFileName = “$BackupPrefix-$(Get-Date -Format ‘yyyyMMdd-HHmmss’).bacpac”

$storageUri = “https://$StorageAccountName.blob.core.windows.net/$StorageContainer/$backupFileName”

# Exportação do SQL Database

Write-Output “Iniciando exportação para o blob: $storageUri”

$exportStatus = New-AzSqlDatabaseExport `

    -ResourceGroupName $StorageResourceGroup `

    -ServerName $SqlServerName `

    -DatabaseName $DatabaseName `

    -StorageKeyType “StorageAccessKey” `

    -StorageKey $storageAccountKey `

    -StorageUri $storageUri `

    -AdministratorLogin $sqlAdminUser `

    -AdministratorLoginPassword (ConvertTo-SecureString $sqlAdminPassword -AsPlainText -Force) `

    -DefaultProfile $AzContext

Write-Output “Status da Exportação: $($exportStatus.Status)”

# Limpeza backups antigos

$existingBackups = Get-AzStorageBlob -Container $StorageContainer -Context $storageContext | Where-Object { $_.Name -like “$BackupPrefix*” } | Sort-Object LastModified -Descending

if ($existingBackups.Count -gt $RetentionCount) {

    $blobsToDelete = $existingBackups | Select-Object -Skip $RetentionCount

    foreach ($blob in $blobsToDelete) {

        Remove-AzStorageBlob -Blob $blob.Name -Container $StorageContainer -Context $storageContext

        Write-Output “Backup removido: $($blob.Name)”

    }

} else {

    Write-Output “Nenhum backup antigo a remover. Total atual: $($existingBackups.Count)”

}

$endTime = Get-Date

Write-Output “$endTime – Backup exportado para: $storageUri”

SQL Database no Azure

Obs.: Ao criar um segundo servidor sql de Dev, usei uma conta admin simples e senha, mas você pode e deve alocar essas informações também no Key Vault. Deixei o desafio para vocês. Script de restore está logo mais abaixo e não está associado ao cofre. Não criem ou publiquem chaves e senhas em scripts, seja de produção ou não, o intuito é der ideia que o processo é possível. Avalie também o export do seu banco, tamanho e impacto para esta exportação.

Storage Account

Azure Key Vault

Resultado do Export

Script em shell para importação

Obs. altere os dados de acordo com os seus recursos: script no mesmo repositório

az sql db import —admin-user <seu usuario> –admin-password <suasenha> \
–name crm-database –resource-group <resource-group> –server sqldevteste \
–storage-key <chavedostorage> –storage-key-type “StorageAccessKey” \
–storage-uri “https://dbbaseselnomecontaine.blob.core.windows.net/sqldatabases/nomedoarquivo.bacpac&#8221;

Conclusão

Ao adotar essa arquitetura, conseguimos garantir segurança, eficiência e governança em processos de backup e restore de bases SQL PaaS no Azure. O uso de identidade gerenciada, Key Vault e RBAC reduz riscos de exposição de credenciais, enquanto a automação com Runbooks traz agilidade e consistência.

Essa prática é recomendada para empresas que desejam preservar a integridade do ambiente produtivo, mantendo um fluxo seguro e auditável para exportação e restauração de dados.