Olá, espero que você esteja bem! 😉
Dando continuidade à nossa série sobre migração de banco de dados on-premise.
Se você ainda não leu o primeiro post da série, dê uma olhada, ficou bem completo. Usei o método “Deploy Database to Microsoft Azure SQL Database”, detalhando cada passo. Você vai gostar! 😉
Hoje, nesta Parte 2, abordaremos o método de migração que utiliza o Backup BACPAC e Importação. Este método é bastante utilizado, para transferir bancos de dados SQL Server para o Azure SQL Database.
- Backup bacpac com import
Também conhecido como “export x import”, pois envolve exportar o banco como um arquivo .bacpac , em seguida importá-lo no Azure SQL Database.
O formato BACPAC é um arquivo que contém o esquema do banco de dados e seus dados, permitindo uma migração “fácil” e eficiente.
Vantagens:
- Portabilidade: O arquivo .bacpac é portátil, podendo ser movido facilmente entre diferentes servidores, ambientes ou até mesmo armazenado como backup.
- Controle de Tamanho e Escopo: Ele contém apenas o esquema e os dados (sem objetos de sistema), o que reduz o tamanho e simplifica a migração.
- Suporte Amplamente Disponível: O método é suportado por ferramentas como SSMS e o Portal do Azure, proporcionando flexibilidade.
Desvantagens:
- Limitações de Dados: Dados corrompidos, muito grandes ou incompatíveis podem causar falhas durante a exportação e/ou importação.
- Tempo de Processamento: Pode levar tempo para criar e importar o .bacpac, dependendo do tamanho do banco de dados.
- Não Suporta Algumas Configurações Avançadas: Configurações específicas do servidor, como permissões de login, não são incluídas no arquivo .bacpac.
2.1 – Preparação do Ambiente:
Assim como mencionado no post inicial, por segurança, é bom sempre ter um backup atualizado antes de iniciar qualquer processo.
E também certifique-se de que o banco de dados de origem é compatível com o Azure SQL Database, incluindo o suporte às features utilizadas.
Outro ponto importante saber:
- Espaço Disponível: O .bacpac pode ocupar bastante espaço dependendo do banco.
2.2 – Exportar BACPAC:
- Abra o SQL Server Management Studio (SSMS) e conecte-se ao banco de dados de origem.
Neste exemplo vamos exportar a database AdventureWorks2014.

- Clique com o botão direito no banco de dados que deseja exportar.
Vá em Task > Export Data-tier Application.

Siga as instruções do assistente:

Tem-se duas opções para salvar o arquivo .bacpac :

Opção1
Escolha uma pasta e de nome ao arquivo que deseja salvar.
Lembrando que o tamanho da base influenciará no tempo para salvar, e também é necessário validar se você possui espaço suficiente disponível no disco.

Confira as informações antes de prosseguir.

- Pronto, o arquivo .bacpac será salvo.
Ao confirmar, o exporting se iniciará.

Concluído.

Arquivo salvo em disco local.
Observa que neste nosso exemplo o arquivo possui em tamanho “minúsculo”.

Simples né, concorda? Mas no dia a dia nem tudo é maravilha.
Como dizem: Pra que facilitar se podemos complicar!? Algo assim …. rsrs
Databases geralmente são grandes e esse processo de salvar no servidor local, nem sempre vai ser possível devido ao espaço em discos disponíveis.
Outro ponto importante é o hardware e a rede, que podem impactar, fazendo com que demore muito a conclusão do download e/ou upload de arquivo.
Sendo assim, que tal salvar esse arquivo diretamente no Azure? Facilitando depois nosso import. Bora!? 😉
2.3 – Storage Account
Acesse o Portal do Azure
- Entre no portal do Azure: https://portal.azure.com.
- Faça login na sua conta.
Para seguir, vamos usar um storage Account.
- Criar um Storage Account (ou use um seu, caso já tenha criado)
- Acesse o serviço de Storage Accounts
- No menu esquerdo, clique em “Storage accounts”.
- Clique em “Create”

Configure as informações básicas:
- Subscription: Selecione a assinatura onde o Storage Account será criado.
- Resource Group: Crie um novo grupo de recursos ou selecione um existente.
- Storage Account Name: Defina um nome único para o Storage Account (deve ser em letras minúsculas e sem caracteres especiais).
- Region: Escolha a região mais próxima para melhor desempenho.
- Performance: Escolha “Standard” (geralmente suficiente para uploads).
- Redundância: Escolha uma opção de redundância (ex.: LRS, ZRS, etc.).
OBS: Escolha as opções que melhor atendam às suas necessidades, considerando fatores como frequência de acesso, performance requerida e custo estimado, pois essas escolhas impactam diretamente tanto o desempenho quanto o orçamento do seu projeto.
Para este lab optei por estas:

Clique em “Next” até chegar ao final e clique em “Review + Create”.
- Revise as configurações e clique em “Create”.
Deploy concluído.

2.4 – Blob Container
Vamos precisar agora criar um blob container.
- No Storage Account recém-criado, pesquise por Containers.

- Clique e vá em “+ Container”.
- Nome: Defina um nome para o container (ex.: upbacpac).
- Public access level: Escolha “Private (no anonymous access)” (mais seguro) ou “Blob (public read access for blobs only)” se deseja que os arquivos sejam acessíveis publicamente.
- Clique em “Create”.

Concluído.

Por padrão, o Azure Blob Storage requer um método de autenticação para permitir uploads. Portanto, como vamos enviar um arquivo .bacpac para o Blob Container, precisaremos configurar permissões de acesso.
Temos algumas opções:
- Usar um Storage Account Key (Menos Seguro)
Podemos usar para autenticar o upload, mas não é recomendado para acesso compartilhado. A Storage Account Key funciona, mas dá acesso total à conta de armazenamento, o que pode ser um risco.
- Definir o Blob como Público (Menos Seguro)
Se quiser permitir uploads sem autenticação, pode alterar o Blob Container para acesso público, mas isso expõe o armazenamento a acessos não controlados, devendo ser evitado principalmente para dados sensíveis.
- Usar um SAS Token (Método Recomendado)
Ao invés de alterar permissões globais, pode gerar um SAS Token para permitir uploads temporários.
Afinal de conta, qual método usar?

O SAS Token (Shared Access Signature) é o método mais seguro e flexível para permitir uploads de arquivos .bacpac no Blob Storage.
Este método não é ativado por padrão, portanto, precisamos gerar um SAS Token antes de realizar o upload.
2.5 – Gerar um SAS Token (Shared Access Signature)
- No Azure Portal, acesse o Storage Account e vá até “Shared access signature”.

Configure as opções:
- Permissões: Marque Write, Read, e Create (para permitir upload e leitura do arquivo).
- Start and Expiry date/time: Defina um período de validade seguro.
- Clique em “Generate SAS and connection string”.

- Copie a Blob service SAS URL, pois ela será usada para o upload.

2.6 – Fazer upload com o SAS Token (Exemplo via AzCopy):
Vamos testar se o AzCopy está instalado.
1 |
azcopy --version |
Não reconhecido.

Vamos baixar ele e instalar. Seguindo passos no site da microsoft.
Copiar ou mover dados para o Armazenamento do Microsoft Azure com o AzCopy v10 | Microsoft Learn

Executaremos ele seguindo diretório que foi salvo o exe.
PS C:\Users\vagrant\Downloads\azcopy> .\azcopy.exe
Instalação concluída.
Validando versão.

Agora estamos apto a fazer o upload do bacpac via script no powershell.
Enviando o arquivo .bacpac para meu Blob Storage.
Segue script padrão. Basta substituir os campos conforme seu portal.
1 2 |
<strong>azcopy copy</strong> "C:\caminho\<strong>seuarquivo</strong>.bacpac" "https://<<strong>NOME_STORAGE_ACCOUNT</strong>>.blob.core.windows.net/<<strong>CONTAINER_NAME</strong>>/<strong>seuarquivo</strong>.bacpac?<<strong>SAS_TOKEN</strong>>" |
Este vai ser o meu script:
1 2 |
azcopy copy "C:\Users\vagrant\Downloads\bacpac_20250204\bacpac_20250204.bacpac" "https://stabacpac.blob.core.windows.net/upbacpac/bacpac_20250204.bacpac?sv=2022-11-02&ss=bfqt&srt=sco&sp=rwdlacupuytfx&se=2025-02-06T09:17:35Z&st=2025-02-05T01:17:35Z&spr=https&sig=aKe5NUGcs45UTCi%2FogBGr2xftyej1PYz8JGhquE3UPs%3D" |
Solução Rápida: Rodar o AzCopy Diretamente
Como alternativa imediata, tente rodar o comando utilizando o caminho completo do executável, assim:
1 |
C:\Users\vagrant\Downloads\azcopy> C:\Users\vagrant\Downloads\azcopy\azcopy copy "C:\Users\vagrant\Downloads\bacpac_20250204\bacpac_20250204.bacpac" "https://stabacpac.blob.core.windows.net/upbacpac/bacpac_20250204.bacpac?sv=2022-11-02&ss=bfqt&srt=sco&sp=rwdlacupuytfx&se=2025-02-06T09:17:35Z&st=2025-02-05T01:17:35Z&spr=https&sig=aKe5NUGcs45UTCi%2FogBGr2xftyej1PYz8JGhquE3UPs%3D" |
Em pouco tempo o upload foi concluído.

Arquivo inserido.

Lembra da Opção2 para salvar o arquivo .bacpac? Bônus! 😉
Vamos fazer ela também para você escolher a melhor, conforme sua realidade.

Faça login na sua conta e escolha o Storage Account e o Blob Container, conforme criamos anteriormente.

Dê um nome para seu arquivo .bacpac que será exportado.
Veja que estou atribuindo um nome diferente do primeiro.
Temos uma novidade, sabe o que é este Temporary file name?

O Temporary File Name é o local onde o arquivo temporário do .bacpac será criado.
- Antes de enviar o arquivo diretamente para o Azure Blob Storage, o SQL Server Management Studio (SSMS) exporta o conteúdo do banco de dados para um arquivo temporário no local especificado.
- Este arquivo temporário contém os dados e metadados do banco de dados.
Upload para o Blob Storage:
Após a criação do arquivo temporário, ele será carregado no container do Azure Blob Storage especificado.
Remoção Automática:
Depois que o upload para o Azure for concluído, o arquivo temporário pode ser excluído automaticamente ou permanecer na pasta temporária (dependendo do comportamento do SSMS).
Importante:
Espaço em Disco: Certifique-se de que o local configurado para o arquivo temporário tenha espaço suficiente, especialmente para bancos de dados grandes.
Permissões de Escrita: O caminho configurado deve ter permissões para gravação, caso contrário, o processo pode falhar.
Posso alterar o caminho onde será gravado temporariamente?
Sim, você pode clicar no botão Browse e selecionar outro local no disco onde deseja que o arquivo temporário seja criado. Isso é útil para:
– Redirecionar para um disco com mais espaço.
– Facilitar o acesso ao arquivo, caso precise analisá-lo antes do upload.

Curiosidade que você deve estar se perguntando, o tamanho salvo é o mesmo? A resposta é SIM!
Arquivo que salvamos anteriormente no disco local, na opção1.

Agora o arquivo temporário, conforme passos da opção2.

Infelizmente, pelas pesquisas que fiz, diziam que o arquivo temporário é obrigatório durante o processo de exportação do banco de dados para um arquivo .bacpac. O SQL Server Management Studio (SSMS) sempre precisa criar esse arquivo temporário, mesmo que o destino final seja o Azure Blob Storage.
- Validação:
- O arquivo temporário permite que o SSMS valide os dados antes de transferi-los para o Azure, garantindo integridade e consistência.
- Proibição de Ignorar o Campo:
- Se você tentar deixar o campo vazio ou removê-lo, o processo não continuará porque o SSMS não terá onde salvar temporariamente os dados do banco.
Continuando nossos passos…
Próxima tela, confira se estão tudo ok, e pronto.

Concluído.

Upload concluído com sucesso. Ambos arquivos seguem no blob.

2.7 – Como importar o arquivo .bacpac para o Azure SQL Database
- Acesse o Portal do Azure:
Faça login no Portal do Azure.
- Vá para o Servidor SQL:
No menu esquerdo, selecione Azure SQL.
Não temos nenhum criado, portanto vamos criar um novo.

Criado o serverbacpac.

Após criação, vamos copiar o nome do server, pois será útil depois.
serverbacpac.database.windows.net
Faremos agora o “import database“.

Vamos selecionar o arquivo de backup, ou seja, o .bacpac.

Nosso Storage account.

Nosso Container.

Os dois arquivos .bacpac disponíveis.

Optei pelo segundo, mas sem preferência.

Necessário escolher o Tier e preencher os demais campos conforme necessidade.
Escolhi o Basic Service Tier para esse lab, ele será suficiente para importar a base e realizar validações sem custos elevados.

Pronto, nosso import deu erro, e agora?

{“code”:”ImportExportJobError”,”message”:”The ImportExport operation with Request Id ‘8936391a-e8ad-41a7-b8f4-ea286d9b7d55’ failed due to ‘The ImportExport operation with Request Id ‘8936391a-e8ad-41a7-b8f4-ea286d9b7d55’ failed due to ‘The SQL instance is inaccessible because the public network interface is denied (Error 47073). Please enable public network access on the SQL Server or configure Import/Export to use Private Link as described in https://go.microsoft.com/fwlink/?linkid=2217536.’.’.”}
O erro indica que a operação de importação/exportação falhou porque o acesso público ao SQL Server está desativado. Isso acontece porque o servidor SQL está configurado para negar conexões via rede pública, impedindo o Azure de acessar o destino para a importação.
No SQL server, basta localizar as configurações de Networking.
Por segurança, esta opção por default vem Disable.

Vamos portanto habilitar.

Executando novo import.

Nesta nova tentativa optei por colocar a base nova com name AdventureWork2024_new2.

Hora da verdade! Vamos validar via SSMS.
Usaremos o nome do servidor conforme copiado anteriormente, juntamente com o login e password.

Base restaurada! 😉
Servidor On-Premise x Azure SQL.

Comparativo básico.

Conforme citado no início do post, no Azure SQL alguns conceitos são diferentes e alguns não suportados. Necessário fazer esta análise antes de realizar a migração.
Exemplo:
- No Azure SQL, o conceito de logins no nível de servidor é substituído por usuários dentro do banco de dados.
- Use uma ferramenta alternativa para automação, como Azure Logic Apps, Azure Automation, ou Elastic Jobs para criar jobs equivalentes.
- Linked Servers, não são suportados no Azure SQL Database.
Conclusão
A migração utilizando Backup BACPAC é um método eficiente para transferir bancos de dados SQL Server para o Azure SQL Database. Porém, assim como os demais métodos, precisa ser analisado e planejado com antecedência. Para comprovar se este método realmente vai atender conforme necessidade e regra de negócio.
Ufa, encerramos este POST, espero que tenha contribuído alguma coisa para o seu aprendizado.
Lembrando que darei continuidade nesta “série”.
Aguardem…

Obrigado, e quaisquer dúvidas, sugestões, elogios e reclamações, … podem me enviar! 😉
Seguem alguns links como referências usadas para escrever este post.
Mais um post excelente Éder! Estou aprendendo bastante com suas postagens, obrigado!
Abraço,
Luiz Lima