Compatibilidade com versões anteriores do SQL Server 2012 para backups com 2008

14

Eu tenho vários clientes com o SQL Server 2008 e é isso que também tenho aqui no meu servidor. Uso arquivos de backup para enviar e voltar bancos de dados entre clientes e no meu escritório.

Eu li que, quando você cria um backup do SQL Server 2012, não há como restaurá-lo em uma instância de 2008. Eu assumi que o nível de compatibilidade resolveria esse problema, mas não. Portanto, não sei como atualizar. Além de atualizar todos os meus clientes de uma só vez, o que é impossível, não consigo pensar em nenhuma maneira limpa de fazer isso.

Eu tenho a necessidade de enviar um banco de dados para um cliente, bem como receber um banco de dados de um cliente. Esta é a minha primeira atualização de versão no SQL Server, por isso sou novo nesse problema. Alguma idéia de como proceder?

Jeff Stock
fonte
4
Você pode ter uma instância do SQL Server 2008 e uma instância do SQL Server 2012 instaladas no servidor ao mesmo tempo com nomes de instâncias diferentes. Talvez isso resolvesse seus problemas com clientes em versões diferentes?
Mikael Eriksson
Pergunta semelhante no SO: stackoverflow.com/q/1744808/95710
DForck42

Respostas:

16

Há duas coisas envolvidas aqui: o número da versão do arquivo e o nível de compatibilidade. Quando você anexa um banco de dados a uma versão principal mais nova (como de 2008 a 2008R2 ou 2008R2 a 2012), a versão do banco de dados é alterada permanentemente e não é possível anexar esse banco de dados a uma versão mais antiga.

O nível de compatibilidade é para analisar o T-SQL obsoleto da velha escola que costumava funcionar em versões mais antigas do SQL Server. Não muda como os dados são armazenados no disco.

Para fornecer o banco de dados a alguém em uma versão mais antiga do SQL Server, você precisará exportar os dados e importá-los para outro banco de dados. Ferramentas como a Comparação de dados do Red Gate são úteis para isso.

Brent Ozar
fonte
Sim, eu já tive esse mesmo problema antes. Acabou com o script de todo o banco de dados e depois com o script de todos os dados. O SQL Compare e o Data Compare do Red Gate vieram em socorro naquele dia.
DForck42
@ DForck42: No meu caso, o banco de dados era muito grande para gerar scripts com dados, então acabei escrevendo o esquema e depois movendo os dados bcp.
Ivan_pozdeev 28/05
@ivan_pozdeev você está dizendo que exportou usando o SQL Server 2012 BCP e importou usando o SQL Server 2008R2 BCP? É ótimo saber que os formatos de arquivo são compatíveis, obrigado.
315 Chris
2
@Chris msdn.microsoft.com/en-us/library/ms162802.aspx "No SQL Server 2014, o utilitário bcp suporta arquivos de dados nativos compatíveis com o SQL Server 2000, SQL Server 2005, SQL Server 2008, SQL Server 2008 R2 e SQL Server 2012. "
Ivan_pozdeev 29/05
Obrigado @ivan_posdeev, esta foi uma revelação. Documentei minhas etapas abaixo , caso isso ajude outras pessoas.
30515 Chris
6

A configuração do nível de compatibilidade é usada pelo SQL Server para determinar como certos novos recursos devem ser tratados. Dessa forma, um banco de dados pode ser migrado para uma versão mais recente do SQL sem ter problemas com o aplicativo. O nível de compatibilidade pode ser alterado para frente e para trás.

Infelizmente, os arquivos de backup não são compatíveis com versões anteriores. Um método seria usar a importação / exportação para mover seus dados do banco de dados atual para a instância da versão mais antiga.

StanleyJohns
fonte
3

Para migrações SQL, use o Assistente de Migração de Banco de Dados SQL de código aberto e gratuito.

Eu tinha um banco de dados de 5 GB com alguns ~ 10 milhões de registros e tentei a rota via Generate Script e a executei com sqlcmd.exe. Primeiro de tudo, o script gerado nem sempre estava funcionando corretamente. Em segundo lugar, o sqlcmd.exe também pode falhar em arquivos grandes, reclamando da memória disponível. o osql.exe funciona, mas leva apenas idades (e tem os mesmos argumentos da linha de comando).

Então me deparei com uma ferramenta maravilhosa para migrar o SQL Server para os bancos de dados do SQL Azure. Isso funciona também para o SQL Server para o SQL Server, por exemplo, se você deseja migrar um banco de dados do SQL 2012 para o 2008 R2. Ele usa o bcp.exe, que usa cópia em massa. Existe uma versão da GUI e da linha de comando (Lote) disponível e é de código aberto. Consulte http://sqlazuremw.codeplex.com/ . No meu caso, a operação levou 16 minutos.

Em uma tela avançada, você pode selecionar se seu destino é o SQL Server, não o SQL Azure.

lvmeijer
fonte
2

Eu descobri que o BCP é mais eficaz do que algumas das ferramentas para obter dados em uma versão anterior do SQL Server e para extrair dados do RDS. (Obrigado @ivan_posdeev.)

Primeiro, giro o esquema clicando com o botão direito do mouse no banco de dados do SQL Server Management Studio, Tarefas, Gerar scripts. Marque todos os objetos, em objetos avançados, assegure que tudo o que você precisa seja script (estatísticas, índices, etc.), desmarque "USE database" se o banco de dados de destino tiver um nome diferente, defina a compatibilidade com a versão do banco de dados de destino e gere uma arquivo que cria seu esquema. Criar um banco de dados sobre o seu destino e executar esse arquivo nele (usando osql, sqlcmdou o GUI).

Para mover os dados, execute a consulta a seguir duas vezes no banco de dados de origem , primeiro comentando a segunda coluna para gerar o arquivo em lotes para extrair dados e, em seguida, comentando a primeira coluna para gerar o arquivo em lotes de importação para execução no seu destino. (Você precisa adicionar seus servidores de origem e destino, nomes de instâncias, diretórios de arquivos de saída e entrada, nomes de usuário e senhas. Para usar a segurança integrada, substitua as opções -Ue -Ppor just -T.)

Isso suporta Unicode, se você não precisar disso, altere a -Nopção nas duas instruções para -n.

SELECT 
   'bcp SOURCEDATABASE.' + s.Name + '.' + t.NAME  + ' out d:\dbdump\' + s.Name + '.' + t.NAME  + '.dat -N -S SOURCESERVER\INSTANCE -UUSER -PPASSWORD'
--    'bcp DESTINATIONDATASE.' + s.Name + '.' + t.NAME  + ' in d:\dbdump\' + s.Name + '.' + t.NAME  + '.dat -N -S DESTINATIONSERVER\INSTANCE -UUSER -PPASSWORD -E -h TABLOCK -b 1000 -e d:\dbdump\' + s.Name + '.' + t.NAME  + '.ERRORS.dat'
FROM 
    sys.tables t
INNER JOIN      
    sys.indexes i ON t.OBJECT_ID = i.object_id
LEFT OUTER JOIN 
    sys.schemas s ON t.schema_id = s.schema_id
ORDER BY 
    s.Name, t.NAME

Após executar a verificação, os arquivos denominados schema.tablename.ERRORS.dat - incluirão todas as linhas que falharam, vazias se não houver.

Referência do MSDN para o BCP aqui , passeio mais amigável pelas opções do BCP aqui .

Eu achei isso muito superior à geração de scripts e a qualquer uma das ferramentas que eu tentei. Também é executado em bancos de dados RDS (que não permitem backups). Os arquivos de dados gerados têm 30% do tamanho dos scripts SQL, a execução deles leva uma fração do tempo e é muito mais confiável. (Os scripts gerados pelo SQL Server para dados de script sempre disparavam, às vezes previsivelmente às vezes não, o SQL gerado não era compatível com 2008R2 (por exemplo, usado nvarchar(0), geralmente não era concluído sem motivo aparente) etc. O BCP também replica quaisquer violações de restrição , como integridade referencial.).

Chris
fonte