Restaurer une sauvegarde SQL Server 2012 vers une base de données SQL Server 2008?


41

Existe-t-il un moyen de restaurer une sauvegarde de base de données SQL Server 2012 vers un serveur SQL Server 2008?

J'ai essayé de joindre un fichier, cela ne fonctionne pas.



Il y a une autre question égale à celle-ci et la réponse est très bonne: superuser.com/questions/468578/…
Cavaleiro

1
Il existe ici une excellente solution à ce problème (migration, pas sauvegarde / restauration): stackoverflow.com/questions/19837886/…
Don Jewett

Réponses:


30

Vous avez deux options:

Option A : Script de base de données en mode de compatibilité en utilisant l'option Générer un script:

Remarque: Si vous écrivez une base de données avec un schéma et des données en sortie de script, en fonction de la taille de vos données, le script sera volumineux et ne sera pas géré par SSMS, sqlcmd ou osql (éventuellement en Go).

entrez la description de l'image ici

Option B:

Commencez par rédiger en script les tables avec tous les index, les FK, etc., puis créez des tables vides dans la base de données de destination - option avec SCHEMA ONLY (pas de données).

Utiliser BCP pour insérer des données

  1. bcp sur les données en utilisant le script ci-dessous. Définissez SSMS en mode texte et copiez la sortie générée par le script ci-dessous dans un fichier 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. Exécutez le fichier bat qui générera les fichiers .dat dans le dossier que vous avez spécifié.

  3. Exécutez le script ci-dessous sur le serveur de destination avec SSMS en mode texte à nouveau.

    --- 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. Exécutez la sortie à l'aide de SSMS pour insérer des données dans les tables.

C'est une méthode très rapide, car elle utilise le mode natif.


Très utile - la méthode B a fonctionné pour moi (SQL généré par la méthode A était de 7 Go et SSMS n'en avait aucune). Certains SSID et serveurs liés ne sont pas passés correctement, mais quand est-ce que quelque chose ayant un rapport avec les serveurs liés fonctionne déjà pour la première fois? Pas sûr que je serais heureux de l'utiliser en production, mais pour obtenir un environnement de test rapide à 95%, c'était parfait.
aucuparia

@aucuparia Some SSIDs and linked servers didn't go across properly. Les serveurs liés doivent être scriptés manuellement. Les SSID peuvent être transférés à l'aide de sp_helprevlogin. Les tâches SQLAgent, les packages ssis, etc. doivent être déplacés selon vos besoins. Le but de cette méthode est d’obtenir les données aussi rapidement que possible lorsque vous rétrogradez ou fusionnez 2 bases de données.
Kin Shah

L'option B était la seule méthode qui fonctionnait pour moi, car les scripts générés étaient trop volumineux
JumpingJezza

23

Non, vous ne pouvez pas revenir en arrière, mais en avant. Vous pouvez créer une base de données vide en 2008, puis utiliser l'assistant de génération de scripts de Management Studio pour créer un script du schéma et des données (ou des outils de comparaison tiers de Red Gate et d'autres). Assurez-vous de définir la bonne version cible en 2008 et vous devrez préciser les éléments incompatibles (par exemple, OFFSET ou FORMAT) que vous auriez peut-être utilisés en 2012.


8

Il n'y a pas de moyen supporté pour cela, car SQL Server n'autorise pas ce type de compatibilité.

Ce que tu peux faire c'est de

  1. restaurer la base de données sur SQL 2012

  2. générer des scripts pour les objets et les données

  3. nettoyer les scripts de tous les détails propres à SQL 2012
  4. exécuter des scripts sur 2008

Si vous ne possédez pas SQL Server 2012, vous pouvez utiliser des outils tiers pour lire les sauvegardes et extraire les données et la structure.

Dans ce cas, créez simplement une base de données vide sur SQL 2008 et utilisez des outils tels que ApexSQL Diff et ApexSQL Data Diff pour synchroniser les objets et les données. Vous pouvez les trouver chez d'autres grands fournisseurs tels que Red-Gate ou Idera.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.