Tenho três bancos de dados que estou migrando para a Instância Gerenciada de SQL do Azure. Um é um banco de dados de utilitários, apenas uma pequena coleção de funções e procedimentos genéricos. Um deles é o banco de dados OLTP para um aplicativo da web. O terceiro é um arquivo somente leitura do banco de dados OLTP contendo dados históricos para análise e relatórios, bem como tabelas de auditoria. Eu preciso ser capaz de restaurar esses bancos de dados para servidores de teste e desenvolvimento no local. Até agora, não tive sucesso.
Minha primeira tentativa foi usar o backup para o Armazenamento de Blobs do Azure. Mas não importa qual versão do SQL Server eu uso localmente, sempre recebo um erro de que o backup somente cópia é de uma versão mais recente e a restauração não é suportada.
Em seguida, tentei o aplicativo de camada de dados de exportação do SSMS v.18.1. Infelizmente, nunca passa da exportação. Recebo dezenas de erros que lêem External references are not supported when creating a package from this platform
. Um dos maiores pontos fortes da instância gerenciada sobre o banco de dados SQL do Azure é a capacidade de fazer consultas entre bancos de dados. Eu tenho várias visualizações e procedimentos que vinculam tabelas nos dois bancos de dados. Além disso, alguns procedimentos no banco de dados OLTP chamam as funções no banco de dados Utility. Como o MI não é o banco de dados SQL do Azure, você pensaria que isso não seria um problema!
Pesquisando no Google, encontrei esta pergunta no Stack Overflow. Então eu tentei a abordagem do Visual Studio proposta como resposta. Embora pareça funcionar, o que significa que cria um arquivo de vários gigabytes na minha máquina local, tentar importar esse arquivo usando o SSMS me dá um erro que diz No data is present in this file.
Então tentei a segunda solução possível usando sqlpackage.exe
. Mas essa solução também não funciona para mim, pois apenas faz referência à exportação do esquema. E se eu tentar exportar todo o banco de dados /Action:Export
, recebo a mesma mensagem de erro que o SSMS fornece.
Eu também examinei esta pergunta dos administradores de banco de dados. Nenhuma ajuda - isso é o que eu tentei originalmente. Se alguém tiver alguma outra opinião, eu agradeceria muito ouvi-la!
Consegui exportar dados de uma instância gerenciada do Azure (MI) para um sistema SQL Server 2012 com êxito sem a necessidade do Visual Studio.
Usando o SQL Server Management Studio (SSMS), clique com o botão direito do mouse no banco de dados que deseja copiar, escolha
Tasks > Export Data-tier Application
. Escolha onde salvar o arquivo .bacpac criado.Se você tiver 7zip, extraia o arquivo bacpac para ver o conteúdo. Caso contrário, você pode renomear as extensões de arquivo de .bacpac para .zip e extraí-lo usando o Explorador de Arquivos (clique com o botão direito do mouse > Extrair tudo...)
Abra o arquivo model.xml em seu editor de texto favorito e procure o atributo chamado
CompatibilityMode
. Isso terá sido definido para o nível de compatibilidade do MI (atualmente 150). Altere-o para o nível de compatibilidade para o qual você está importando. Eu estava importando para o SQL 2012, então mudei para 110.Remova quaisquer outros recursos incompatíveis comentando a linha relevante em model.xml.
Definir o
Value
como false também pode funcionar.Você deve obter uma saída como esta:
Abra o arquivo Origin.xml dos arquivos bacpac extraídos e procure uma linha como esta no final e substitua o valor de hash existente pelo novo:
Certifique-se de não adicionar espaços ou caracteres estranhos.
Agora feche os arquivos de volta, certificando-se de que o nível superior do arquivo seja os arquivos e não a pasta que você extraiu tudo também. Se você abrir o novo arquivo, deverá ver os arquivos xml e não um único nome de pasta.
Agora você deve poder importar o bacpac para seu banco de dados SQL não Azure.
Algumas notas sobre backups bacpac:
Eles podem não ser transacionalmente consistentes. Para que uma exportação seja transacionalmente consistente, você deve garantir que nenhuma atividade de gravação esteja ocorrendo durante a exportação ou que você esteja exportando de uma cópia transacionalmente consistente do banco de dados SQL do Azure.
Se você estiver exportando para o armazenamento de blobs, o tamanho máximo de um arquivo BACPAC é 200 GB. Para arquivar um arquivo BACPAC maior, exporte para armazenamento local.
Bacup-restore de um MI não é suportado. A extração do backpac falha quando encontra poucas dependências ou recursos não suportados. Isso ocorre porque o SSMS verifica sua extração. Tente usar o SSDT (Visual STudio) e você pode pular a extração de verificação (esta é, por padrão, desmarcada):
Selecione Extrair esquema e dados.
Isso terá sucesso.
Dados e esquema:
Curiosamente, a
Extract
ação também recebe umExtractAllTableData
parâmetro que permite incluir os dados.Basta adicionar
/p:ExtractAllTableData=True
ao comando.