Como mover um banco de dados do SQL Server 2012 para o SQL Server 2005

30

Quais são minhas opções se eu precisar mover um banco de dados do SQL Server 2012 (32 bits) para o SQL Server 2005 (64 bits)?

Eu sei que não posso:

  • restaurar um backup do banco de dados no SQL Server 2005
  • desanexar e anexar

Eu sei que posso:

  • use o assistente de importação de dados, e eu tentei em um banco de dados, mas apenas move dados, e isso foi problemático, pois eu precisava trabalhar bastante criando tabelas temporárias para manter as colunas de identidade, recriando todos os FKs, índices etc.

Existe uma opção mais fácil?

Greg Balajewicz
fonte
12
A opção mais fácil seria atualizar o destino para 2012, para ser honesto.
Aaron Bertrand

Respostas:

40

Você pode seguir qualquer método abaixo:

Nota: Se você estiver usando novos recursos, como novos tipos de dados, etc, precisará testá-lo, pois isso gerará erros.

MÉTODO 1: Usando ferramentas nativas

  1. Faça o script do banco de dados SCHEMA_ONLY e recrie um banco de dados vazio no servidor de destino. Abaixo estão as capturas de tela:

    insira a descrição da imagem aqui

    insira a descrição da imagem aqui

    insira a descrição da imagem aqui

  2. Use BCP OUT e BULK INSERT para inserir dados.

Abaixo está o script que irá ajudá-lo com a Parte 2.

/************************************************************************************************************************************************
Author      :   KIN SHAH    *********************************************************************************************************************
Purpose     :   Move data from one server to another*********************************************************************************************
DATE        :   05-28-2013  *********************************************************************************************************************
Version     :   1.0.0   *************************************************************************************************************************
RDBMS       :   MS SQL Server 2008R2 and 2012   *************************************************************************************************
*************************************************************************************************************************************************/

-- 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_OUT\*.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_OUT\'                                           -- 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) <> 'some_schema_exclude'                     -- Optional to exclude any schema 
order by schema_name(schema_id)                         



--- 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 = 'destination_database_Name'               -- 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_OUT\'                             -- 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) <> 'some_schema_exclude'         -- Optional to exclude any schema 
order by schema_name(schema_id)

Método 2: usando ferramentas de terceiros

Crie um banco de dados em branco no servidor de destino. Use a comparação de esquema e comparação de dados do Redgate para criar e carregar dados no servidor de destino.

Nota: Eu usei o esquema e a comparação de dados do Redgate e são as melhores ferramentas para esse tipo de tarefa e, portanto, se você estiver usando ferramentas de terceiros, minha recomendação seria Redgate.

Kin Shah
fonte
7
+1, mas lembre-se de que existem certas coisas que simplesmente não funcionam no destino (e não tenho certeza de como as ferramentas sofisticadas de terceiros lidam com tudo isso). Objetos como SEQUÊNCIAS, código como OFFSET / FETCH, LAG / LEAD, etc.
Aaron Bertrand
1
Depois de criar o esquema criando scripts e executando esses scripts no banco de dados mais antigo, outra opção para transferir os dados é copiar diretamente de uma instância para outra, configurando um servidor vinculado. Não deve ser difícil criar um loop que faça todo o trabalho. Para lidar com as restrições de FK, você deve copiar as tabelas em uma ordem apropriada ou remover os FKs temporariamente e reativá-los após a cópia. Da mesma forma, você deseja desativar todos os gatilhos no destino durante a cópia.
David Spillett
4

Além dos métodos já sugeridos aqui, você também pode tentar criar um arquivo BACPAC e importá-lo para o seu destino. É semelhante à maneira como a Microsoft recomenda migrar seus bancos de dados do local para os bancos de dados em nuvem do Azure.

O benefício disso é que é uma combinação de esquema de exportação e de dados, e não depende da versão do banco de dados; portanto, você pode teoricamente importar bancos de dados de qualquer versão para qualquer versão.

A desvantagem disso é que, antes de gerar o arquivo BACPAC na origem, ele executa algum tipo de processo de validação rigoroso que pode falhar facilmente se você tiver referências a objetos fora do banco de dados (seja banco de dados de usuário ou sistema) ou se tiver objetos criptografados. Mas se você tiver sorte e não falhar, pode ser uma solução bastante fácil.

Tudo o que você precisa é de uma das versões mais recentes do SSMS (17 ou 18): https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms

Para começar a criar um arquivo BACPAC, clique com o botão direito do mouse em um banco de dados e selecione "Exportar aplicativo da camada de dados ..." (certifique-se de não confundir com "Extrair aplicativo da camada de dados ...", que é algo diferente):

Exportar aplicativo da camada de dados ...

Você verá um assistente simples para guiá-lo pelas etapas. Quando terminar, você pode usar "Importar aplicativo da camada de dados ..." no servidor de destino, o que pode ser visto clicando com o botão direito do mouse no nó "Bancos de dados" (novamente, não se confunda com "Implantar dados aplicação de vários níveis ... "):

Importar aplicativo da camada de dados ...

Isso também mostrará um assistente simples para guiá-lo pelas etapas.

Eitan Blumin
fonte
-1

Diminuir a versão do Sql Server é um trabalho muito difícil.
Existem algumas opções para diminuir como;
Primeiro, crie todo o script do objeto de banco de dados e execute no servidor de destino.
Depois disso você pode usar;

  • SSIS,
  • Ferramenta Importar Dados,
  • Ferramenta de terceiros, como RedGate ou outro.

Mas para a ferramenta RedGate Data Compare ,

você deve considerar que ele compara apenas as tabelas que possuem chaves primárias. Portanto, se suas tabelas que não possuem chave primária, você deve usar outras maneiras

hasantatarli
fonte
8
Eu não acho que esta resposta melhora na resposta Kins
James Anderson
-3

É impossível fazer o downgrade de um banco de dados no SQL Server. No entanto, uma solução alternativa é criar scripts para todos os objetos do banco de dados e aplicar o script no banco de dados de destino. O SSIS é uma ótima maneira de ajudar a fazer isso.

Osama Waly
fonte
4
Você acha que isso acrescenta algo importante à resposta de Kin ?
Dez17