Comment déplacer une base de données de SQL Server 2012 vers SQL Server 2005

30

Quelles sont mes options si je dois déplacer une base de données de SQL Server 2012 (32 bits) vers SQL Server 2005 (64 bits)?

Je sais que je ne peux pas:

  • restaurer une sauvegarde de la base de données sur SQL Server 2005
  • détacher et attacher

Je sais que je peux:

  • utiliser l'assistant d'importation de données, et je l'ai essayé sur une seule base de données, mais cela ne déplace que les données, et même cela était gênant car j'avais besoin de beaucoup de travail pour créer des tables temporaires pour maintenir les colonnes d'identité, recréer tous les FK, index, etc.

Existe-t-il une option plus simple?

Greg Balajewicz
la source
12
Pour être honnête, l'option la plus simple serait de mettre à niveau la destination en 2012.
Aaron Bertrand

Réponses:

40

Vous pouvez suivre n'importe quelle méthode ci-dessous:

Remarque: Si vous utilisez de nouvelles fonctionnalités telles que de nouveaux types de données, etc., vous devez tester car cela générera des erreurs.

MÉTHODE 1: Utilisation d'outils natifs

  1. Scriptez la base de données SCHEMA_ONLY et recréez une base de données vide sur le serveur de destination. Voici les captures d'écran:

    entrez la description de l'image ici

    entrez la description de l'image ici

    entrez la description de l'image ici

  2. Utilisez BCP OUT et BULK INSERT pour insérer des données.

Voici le script qui vous aidera avec la partie 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éthode 2: utiliser des outils tiers

Créez une base de données vide sur le serveur de destination. Utilisez la comparaison de schéma et la comparaison de données de Redgate pour créer et charger des données dans le serveur de destination.

Remarque: J'ai utilisé le schéma et la comparaison de données de Redgate et ce sont les meilleurs outils pour ce type de tâche et donc si vous utilisez des outils tiers, alors ma recommandation serait Redgate.

Kin Shah
la source
7
+1, mais gardez à l'esprit qu'il y a certaines choses qui ne fonctionneront tout simplement pas à destination (et je ne suis pas sûr de la façon dont les outils tiers élégants géreront tout cela). Objets comme SEQUENCES, code comme OFFSET / FETCH, LAG / LEAD, etc.
Aaron Bertrand
1
Une fois que vous avez créé le schéma en créant des scripts et en exécutant ces scripts sur l'ancienne base de données, une autre option pour transférer les données consiste à copier directement d'une instance à une autre en configurant un serveur lié. Il ne devrait pas être difficile de créer une boucle qui fasse tout le travail. Pour faire face à des contraintes FK vous devez vous assurer que vous copiez les tables dans un ordre approprié ou vous pouvez supprimer les temporairement et les FKs réactivez après la copie. De même, vous souhaiterez désactiver tous les déclencheurs de la destination pendant la copie.
David Spillett
4

En plus des méthodes déjà suggérées ici, vous pouvez également essayer de créer un fichier BACPAC et l'importer dans votre destination. Cela est similaire à la façon dont Microsoft recommande de migrer vos bases de données de bases de données locales vers des bases de données cloud Azure.

L'avantage est qu'il s'agit d'une combinaison d'export de schéma ainsi que de données, et qu'il ne dépend pas de la version de la base de données, vous pouvez donc théoriquement importer des bases de données de n'importe quelle version vers n'importe quelle version.

L'inconvénient est qu'avant de générer le fichier BACPAC à la source, il exécute une sorte de processus de validation strict qui peut facilement échouer si vous avez des références à des objets en dehors de votre base de données (que ce soit des bases de données utilisateur ou système), ou si vous avez objets chiffrés. Mais si vous avez de la chance et que cela n'échoue pas, cela peut être une solution plutôt facile.

Tout ce dont vous avez besoin est l'une des versions les plus récentes de SSMS (17 ou 18): https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms

Pour commencer à créer un fichier BACPAC, cliquez avec le bouton droit sur une base de données et sélectionnez "Exporter l'application de niveau de données ..." (assurez-vous de ne pas être confondu avec "Extraire l'application de niveau de données ..." qui est quelque chose de différent):

Exporter une application au niveau des données ...

Un assistant simple vous sera présenté pour vous guider à travers les étapes. Lorsque vous avez terminé, vous pouvez utiliser "Importer une application de niveau de données ..." dans votre serveur de destination, que vous pouvez voir en cliquant avec le bouton droit sur le nœud "Bases de données" (encore une fois, ne confondez pas avec "Déployer des données" -tier Application ... "):

Importer une application de niveau données ...

Cela vous montrera également un assistant simple pour vous guider à travers les étapes.

Eitan Blumin
la source
-1

Réduire la version de Sql Server est un travail très dur.
Il y a quelques options pour diminuer comme;
Tout d'abord, créez tous les scripts d'objet de base de données et exécutez-les sur le serveur de destination.
Après cela, vous pouvez utiliser;

  • SSIS,
  • Outil d'importation de données,
  • Outil tiers comme RedGate ou autre.

Mais pour l' outil de comparaison de données RedGate ,

vous devez considérer qu'il compare uniquement les tables qui ont des clés primaires. Donc, si vos tables n'ont pas de clé primaire, vous devez utiliser d'autres moyens

hasantatarli
la source
8
Je ne pense pas que cette réponse améliore la réponse de Kins
James Anderson
-3

Il est impossible de rétrograder une base de données sur SQL Server. Cependant, une solution consiste à scripter tous les objets de base de données et à appliquer le script sur la base de données de destination. SSIS est un excellent moyen d'aider à effectuer cela.

Osama Waly
la source
4
Pensez-vous que cela ajoute quelque chose d'important à la réponse de Kin ?
dezso