web-dev-qa-db-fra.com

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

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?

31
Greg Balajewicz

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 des 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:

    enter image description here

    enter image description here

    enter image description here

  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: utilisation d'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 des données de Redgate et ce sont les meilleurs outils pour ce type de tâche et donc si vous utilisez des outils tiers, ma recommandation serait Redgate.

42
Kin Shah

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):

Export Data-tier Application...

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 ... "):

Import Data-tier Application...

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

6
Eitan Blumin

Réduire la version de Sql Server est un travail très dur.
Il existe des 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 RedGate Data Compare outil,

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

0
hasantatarli