Transferência de dados de backup de uma nova versão do MS SQL Server para uma versão anterior

Antecedentes

Certa vez, para reproduzir um bug, precisei de um backup do banco de produção.

Para minha surpresa, encontrei as seguintes limitações:

  1. O backup do banco foi feito na versão SQL Server 2016 e não era compatível com minha SQL Server 2014.
  2. No meu computador de trabalho, o sistema operacional utilizado era Windows 7, portanto, não consegui atualizar SQL Server para a versão 2016
  3. O produto suportado fazia parte de um sistema maior com uma arquitetura legada fortemente interligada e também se referia a outros produtos e bancos, portanto, sua implementação em outra estação poderia levar muito tempo.

Tendo em vista o exposto, cheguei à conclusão de que era hora de soluções alternativas.

Recuperação de dados do backup

Decidi usar uma máquina virtual Oracle VM VirtualBox com Windows 10 (pode-se obter uma imagem de teste para o navegador Edge daqui). Na máquina virtual, foi instalado o SQL Server 2016 e nela foi restaurado o banco de dados do aplicativo a partir do backup (um guia).

Configuração de acesso ao SQL Server na máquina virtual

Em seguida, era necessário tomar algumas medidas para permitir o acesso ao SQL Server externamente:

  1. Adicionar uma regra ao firewall para permitir solicitações à porta 1433.
  2. Preferencialmente, o acesso ao servidor deve ser feito não por autenticação do Windows, mas pelo SQL com login e senha (é mais fácil configurar o acesso). No entanto, nesse caso, não se deve esquecer de habilitar nas propriedades do SQL Server a possibilidade de autenticação SQL.
  3. Nas configurações do usuário no SQL Server, na aba User Mapping indicar para o banco restaurado o papel do usuário db_securityadmin.

Transferência de dados

Na verdade, a transferência de dados consiste em duas etapas:

  1. Transferência do esquema de dados (tabelas, visões, procedimentos armazenados, etc.)
  2. Transferência dos próprios dados

Transferência do esquema de dados

Realizamos as seguintes operações:

  1. Escolhendo Tasks -> Generate Scripts para o banco a ser transferido.
  2. Selecionamos os objetos necessários para a transferência ou deixamos o valor padrão (nesse caso, serão criados scripts para todos os objetos do banco).
  3. Indicamos as configurações para salvar o script. O mais conveniente é salvar o script em um único arquivo com codificação Unicode. Assim, em caso de falha, não será necessário repetir todas as etapas.

Após salvar o script, ele pode ser executado no SQL Server original (versão antiga) para criar o banco necessário.

Atenção: Após a execução do script, é necessário verificar se as configurações do banco a partir do backup estão de acordo com o banco criado pelo script. No meu caso, o script não tinha a configuração para COLLATE, o que resultou em falhas na transferência de dados e em manobras para recriar o banco com o script ajustado.

Transferência de dados

Antes de transferir dados, é necessário desativar a verificação de todas as restrições no banco:

EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'

Transferimos os dados usando o assistente de importação de dados Tarefas -> Importar Dados no SQL Server onde o banco criado pelo script está localizado:

  1. Especificamos as configurações de conexão à origem (SQL Server 2016 em uma máquina virtual). Eu usei o Data Source SQL Server Native Client e a autenticação SQL mencionada anteriormente.
  2. Especificamos as configurações de conexão ao destino (SQL Server 2014 na máquina host).
  3. Em seguida, configuramos o mapeamento. É necessário selecionar todos não somente leitura objetos (por exemplo, não é preciso selecionar visualizações). Como opções adicionais, deve-se escolher "Permitir inserção em colunas de identidade", se tais colunas forem utilizadas.
    Atenção: se ao tentar selecionar várias tabelas e definir a propriedade "Permitir inserção em colunas de identidade" a propriedade já tiver sido definida anteriormente para pelo menos uma das tabelas selecionadas, no diálogo será indicado que a propriedade já está configurada para todas as tabelas selecionadas. Esse fato pode confundir e levar a erros na transferência.
  4. Iniciamos a transferência.
  5. Restauramos a verificação de restrições:
    EXEC sp_msforeachtable 'ALTER TABLE ? CHECK CONSTRAINT all'

Se ocorrerem erros, verificamos as configurações, removemos o banco criado com erros, o recriamos a partir do script, realizamos as correções e repetimos a transferência de dados.

Conclusão

Essa situação ocorre com bastante raridade e surge apenas devido às restrições mencionadas. Na maior parte das vezes, a solução é atualizar o SQL Server ou conectar-se a um servidor remoto, se a arquitetura do aplicativo permitir. No entanto, ninguém está a salvo de código legado e desenvolvimentos mal feitos. Espero que você não precise desta instrução, mas se precisar, que ela ajude a economizar muito tempo e nervos. Obrigado pela atenção!

Lista de fontes utilizadas

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster