
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”
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.

