Restaurar o backup do SQL Server 2012 em um banco de dados do SQL Server 2008?

41

Existe uma maneira de restaurar um backup do banco de dados do SQL Server 2012 para um SQL Server 2008?

Eu tentei anexar o arquivo, ele não funciona.

Aaron Bertrand
fonte
A verificação dessas referências ajudaria você: msdn.microsoft.com/en-us/library/ms140052.aspx dba.stackexchange.com/questions/5511/… Obrigado
Existe outra pergunta igual a esta e é muito bem respondida: superuser.com/questions/468578/…
Cavaleiro
1
Há uma grande resposta de trabalho para este problema aqui (migração, não backup / restore): stackoverflow.com/questions/19837886/...
Don Jewett

Respostas:

30

Você tem algumas opções:

Opção A : Script fora do banco de dados no modo de compatibilidade usando a opção Gerar script:

Nota: Se você criar um script do banco de dados com esquema e dados, dependendo do tamanho dos dados, o script será massivo e não será tratado pelo SSMS, sqlcmd ou osql (também pode estar em GB).

insira a descrição da imagem aqui

Opção B:

Primeiro, escreva as tabelas primeiro com todos os índices, FKs, etc. e crie tabelas em branco no banco de dados de destino - opção com SOMENTE ESQUEMA (sem dados).

Use o BCP para inserir dados

  1. bcp os dados usando o script abaixo. defina o SSMS no modo de texto e copie a saída gerada pelo script abaixo em um arquivo bat.

    -- save below output in a bat file by executing below in SSMS in TEXT mode
    
    -- clean up: create a bat file with this command --> del D:\BCP\*.dat 
    
    select '"C:\Program Files\Microsoft SQL Server\100\Tools\Binn\bcp.exe" ' /* path to BCP.exe */
        +  QUOTENAME(DB_NAME())+ '.' /* Current Database */
        +  QUOTENAME(SCHEMA_NAME(SCHEMA_ID))+'.'            
        +  QUOTENAME(name)  
        +  ' out D:\BCP\'  /* Path where BCP out files will be stored */
        +  REPLACE(SCHEMA_NAME(schema_id),' ','') + '_' 
        +  REPLACE(name,' ','') 
        + '.dat -T -E -SServerName\Instance -n' /* ServerName, -E will take care of Identity, -n is for Native Format */
    from sys.tables
    where is_ms_shipped = 0 and name <> 'sysdiagrams'                       /* sysdiagrams is classified my MS as UserTable and we dont want it */
    /*and schema_name(schema_id) <> 'unwantedschema'    */                             /* Optional to exclude any schema  */
    order by schema_name(schema_id)
  2. Execute o arquivo bat que irá gerar os arquivos .dat na pasta que você especificou.

  3. Execute o script abaixo no servidor de destino com o SSMS no modo de texto novamente.

    --- Execute this on the destination server.database from SSMS.
    
    --- Make sure the change the @Destdbname and the bcp out path as per your environment.
    
    declare @Destdbname sysname
    set @Destdbname = 'destinationDB' /* Destination Database Name where you want to Bulk Insert in */
    select 'BULK INSERT ' 
    /*Remember Tables must be present on destination database */ 
    + QUOTENAME(@Destdbname) + '.' 
    + QUOTENAME(SCHEMA_NAME(SCHEMA_ID)) 
    + '.' + QUOTENAME(name) 
    + ' from ''D:\BCP\' /* Change here for bcp out path */ 
    + REPLACE(SCHEMA_NAME(schema_id), ' ', '') + '_' + REPLACE(name, ' ', '') 
    + '.dat'' with ( KEEPIDENTITY, DATAFILETYPE = ''native'', TABLOCK )' 
    + char(10) 
    + 'print ''Bulk insert for ' + REPLACE(SCHEMA_NAME(schema_id), ' ', '') + '_' + REPLACE(name, ' ', '') + ' is done... ''' 
    + char(10) + 'go'
       from sys.tables
       where is_ms_shipped = 0
    and name <> 'sysdiagrams' /* sysdiagrams is classified my MS as UserTable and we dont want it */
    and schema_name(schema_id) <> 'unwantedschema' /* Optional to exclude any schema */
        order by schema_name(schema_id) 
  4. Execute a saída usando o SSMS para inserir dados novamente nas tabelas.

Este é um método bcp muito rápido, pois usa o modo nativo.

Kin Shah
fonte
Muito útil - o método B funcionou para mim (o SQL gerado pelo método A tinha 7 GB e o SSMS não possuía nada disso). Alguns SSIDs e servidores vinculados não foram exibidos corretamente, mas quando é que alguma coisa relacionada aos servidores vinculados funciona pela primeira vez? Não tenho certeza se eu ficaria feliz em usar isso na produção, mas para obter um ambiente de teste rapidamente 95% mais rápido, era perfeito.
Aucuparia
@aucuparia Some SSIDs and linked servers didn't go across properly. Os servidores vinculados precisam ser scripts manualmente. Os SSIDs podem ser transferidos usando sp_helprevlogin. Trabalhos SQLAgent, pacotes ssis etc. devem ser movidos conforme suas necessidades. O objetivo deste método é obter os dados o mais rápido possível quando você está desatualizando ou mesclando 2 bancos de dados.
Kin Shah
Opção B era o único método que funcionou para mim, como os scripts gerados eram muito grandes nas outras maneiras
JumpingJezza
23

Não, você não pode voltar atrás, apenas avançar. Você pode criar um banco de dados vazio em 2008 e, em seguida, usar o assistente Gerar Scripts no Management Studio para criar scripts do esquema e dos dados (ou ferramentas de comparação de terceiros do Red Gate e outros). Certifique-se de definir a versão de destino correta como 2008 e precisará definir coisas incompatíveis (por exemplo, OFFSET ou FORMAT) que você pode ter usado em 2012.

Aaron Bertrand
fonte
8

Não há maneira suportada de fazer isso, porque o SQL Server não permite esse tipo de compatibilidade.

O que você pode fazer é

  1. restaurar banco de dados no SQL 2012

  2. gerar scripts para objetos e dados

  3. limpar scripts de todos os detalhes exclusivos do SQL 2012
  4. executar scripts em 2008

Se você não possui o SQL Server 2012, pode usar ferramentas de terceiros para ler o backup e extrair dados e estrutura.

Nesse caso, basta criar um banco de dados vazio no SQL 2008 e usar ferramentas como ApexSQL Diff e ApexSQL Data Diff para sincronizar objetos e dados. Você também pode encontrar outros fornecedores importantes, como Red-Gate ou Idera.

David Smithers
fonte