Déplacer la base de données de SQL Server 2012 vers 2008


29

J'ai une base de données sur une instance SQL Sever 2012 que je voudrais copier sur un serveur 2008. Le serveur 2008 ne peut pas restaurer les sauvegardes créées par un serveur 2012 (j'ai essayé).

Je ne trouve aucune option en 2012 pour créer une sauvegarde compatible 2008. Suis-je en train de manquer quelque chose?

Existe-t-il un moyen facile d'exporter le schéma et les données vers un format indépendant de la version que je peux ensuite importer en 2008?

La base de données n'utilise aucune fonctionnalité spécifique à 2012. Il contient des tables, des données et des procédures stockées.

Voici ce que j'ai essayé jusqu'à présent

J'ai essayé TâchesGénérer des scripts sur le serveur 2012 et j'ai pu générer le schéma (y compris les procédures stockées) en tant que script SQL. Cependant, cela n'a inclus aucune des données.

Après avoir créé ce schéma sur ma machine 2008, j'ai pu ouvrir l'assistant "Exporter les données" sur la machine 2012, et après avoir configuré 2012 comme machine source et 2008 comme machine cible, on m'a présenté une liste de tableaux que j'ai pourrait copier. J'ai sélectionné toutes mes tables (300+) et j'ai cliqué sur l'assistant. Malheureusement, il passe beaucoup de temps à générer ses scripts, puis échoue avec des erreurs comme «Échec de l'insertion dans la colonne en lecture seule« FOO_ID »».

J'ai également essayé le "Copier l'assistant de base de données", qui prétendait pouvoir copier "de 2000 ou plus tard à 2005 ou plus tard". Il a deux modes:

  1. "Détacher et attacher", qui a échoué avec une erreur:

    Message: Index was outside the bounds of the array.
    StackTrace:    at Microsoft.SqlServer.Management.Smo.PropertyBag.SetValue(Int32 index, Object value)
    ...
    at Microsoft.SqlServer.Management.Smo.DataFile.get_FileName()
    
  2. Méthode d'objet de gestion SQL qui a échoué avec une erreur

    Impossible de lire la propriété IsFileStream. Cette propriété n'est pas disponible sur SQL Server 7.0. "


Pouvez-vous exporter directement? Je ne sais pas quelle est la taille de votre base de données, mais c'est ce que je ferais en travaillant avec des bases de données plus petites.
Dave

2
Aucune ancienne version de SQL Server ne peut restaurer des sauvegardes à partir de versions plus récentes. C'est par conception. Utilisez la fonction d'exportation, extrayez les tables et les données par script et définissez la cible de script sur SQL 2008.

4
"Essayer de comprendre pourquoi quelqu'un de sensé migrerait vers l'arrière." - J'ai un serveur de production exécutant 2012, mais ma machine de développement n'a que 2008. J'aimerais une copie locale de la base de données pour faciliter le développement, mais je ne veux pas installer 2012 sur ma machine de développement car je ne l'ai pas fait cet espace libre restant, et je ne veux pas passer des heures à l'installer. (Je passe donc des heures à essayer de migrer vers l'arrière à la place ... mais c'est juste moi.)
Rich

1
Tu es presque là. La section d'exportation dans laquelle vous êtes entré a une option pour inclure les données ainsi que le schéma.

1
Je voulais juste ajouter pour Ramhound: pour ma part, j'ai mis à niveau SQL 2008 R2 vers SQL 2012 sur mon environnement de développement, puis, après avoir changé beaucoup de schémas et de données dans mon instance mise à niveau, j'ai réalisé que VS 2010 ne pouvait pas comparer le schéma ou les données avec SQL 2012. SSDT pour VS 2010 et VS 2012 peut comparer le schéma avec SQL 2012 mais n'est pas compatible avec les projets de base de données VS 2010 d'origine et ne peut pas comparer les données. Pour faire court, je préfère revenir à SQL 2008 R2 et attendre qu'une décision soit prise au niveau de l'entreprise pour passer à 2012. Mais j'aimerais enregistrer mon nouveau schéma / mes nouvelles données. AFAIK Je suis dans mon bon sens.
GFK

Réponses:


40

Faites un clic droit sur la base de données dans 2012 SQL Management Studio et choisissez "Tâches -> Générer des scripts". Cliquez devant l'écran de bienvenue, choisissez "Script de la base de données entière et de tous les objets de base de données". Sur la page "spécifier comment les scripts doivent être enregistrés", cliquez sur "avancé". Sous "Général" dans la page des propriétés contextuelles, remplacez "Types de données à script" de "Schéma uniquement" par "Schéma et données" et modifiez "Script pour la version du serveur" de "2012" à "2008".

J'ai ensuite dû trouver un moyen d'éditer le début de ce fichier SQL massif, pour modifier la façon dont la base de données serait créée - voir ce q: https://stackoverflow.com/questions/102829/best-free-text-editor -soutien à plus de 4 Go de fichiers

Et enfin, j'ai dû trouver un moyen d'exécuter le script SQL, qui était trop volumineux pour être ouvert dans SQL Management Studio - voir ce q: https://stackoverflow.com/questions/431913/how-do-you-run- fichier-300mb-ms-sql-sql


qu'avez-vous modifié au début du fichier?
JonoRR

1
Je ne me souviens pas exactement, désolé. Des trucs spécifiques aux applications, je pense. Peut-être le nom de la base de données ou quelque chose comme ça. Je pense que je l'aurais ajouté ici s'il était pertinent pour les personnes ayant le même problème.
Rich

3
@JonoRR Vous souhaiterez très probablement modifier l'instruction CREATE DATABASE et définir les chemins du fichier de données sur ce qui est logique sur le serveur de destination.
Igby Largeman

12

Pour les migrations SQL, utilisez l'assistant de migration de base de données SQL gratuit et open source.

J'avais une base de données de 5 Go avec environ 10 millions d'enregistrements et j'ai essayé l'itinéraire via Generate Script et je l'ai exécuté avec sqlcmd.exe. Tout d'abord, le script généré ne fonctionnait pas toujours correctement. Deuxièmement, sqlcmd.exe peut également échouer sur des fichiers volumineux, se plaignant de la mémoire disponible. osql.exe fonctionne, mais prend juste des âges (et a les mêmes arguments de ligne de commande).

Puis je suis tombé sur un merveilleux outil pour migrer SQL Server vers des bases de données SQL Azure. Cela fonctionne également pour SQL Server vers SQL Server, par exemple si vous souhaitez migrer une base de données SQL 2012 vers 2008 R2. Il utilise bcp.exe, qui utilise une copie en bloc. Il existe une interface graphique et une version en ligne de commande (Batch) disponibles et c'est open source. Voir http://sqlazuremw.codeplex.com/ . Dans mon cas, l'opération a duré 16 minutes.

Dans un écran avancé, vous pouvez sélectionner que votre cible est SQL Server, et non SQL Azure.


1
Où définissez-vous le 2008 R2 dans cet assistant?
JonoRR

Astuce géniale, j'ai restauré une base de données d'Express 2012 à Web 2008. Très facile.
rkawano

Peut confirmer que cela fonctionne comme annoncé. A fait 2014-> 2012, inter-domaines, serveurs SQL locaux. Comment cet outil a-t-il pu éviter mes recherches depuis si longtemps! Incroyable même pour une utilisation non azurée.
Gomibushi

3

Je suis nouveau sur SQL, mais j'ai réussi à migrer de 2012 à 2008. Pour ce faire, j'ai utilisé l'utilitaire d'importation et d'exportation SQL. J'ai choisi le serveur SQL 2012 et la base de données que je souhaite migrer et enfin le serveur 2008 et créé une nouvelle base de données comme base de destination. Ça a marché.


2

Essayez les outils APEXSQL . Ils ont un outil qui scriptera la base de données et scriptera également les données.


"à partir de 299 $" - existe-t-il une alternative gratuite?
Rich

1

Après avoir créé ce schéma sur ma machine 2008, j'ai pu ouvrir l'assistant "Exporter les données" sur la machine 2012, et après avoir configuré 2012 comme machine source et 2008 comme machine cible, on m'a présenté une liste de tableaux que j'ai pourrait copier. J'ai sélectionné toutes mes tables (300+) et j'ai cliqué sur l'assistant. Malheureusement, il passe beaucoup de temps à générer ses scripts, puis échoue avec des erreurs comme «Échec de l'insertion dans la colonne en lecture seule« FOO_ID »».

Le problème est qu'il n'est pas en mesure d'insérer les colonnes ID, donc:

  1. Sélectionnez toutes les tables en les cochant
  2. Sélectionnez toutes les tables (la façon de le faire est de cliquer sur la première et maintenez Shift et cliquez sur la dernière table)
  3. Cliquez sur "Modifier les mappages" - vous pouvez le voir juste au-dessus du bouton suivant et à côté de l'aperçu.
  4. Vous obtiendrez une fenêtre, cochez la case "Activer l'insertion d'identité", puis cliquez sur Suivant et allez-y, cela devrait fonctionner. Ça a marché pour moi.

1

J'ai suivi la solution de Rich https://superuser.com/a/469597/312310 ci-dessus et cela a très bien fonctionné! Merci - je ne peux pas encore voter ici!

Les étapes supplémentaires que j'ai dû faire pour que cela fonctionne sont:

  • Modifiez les noms de fichiers logiques et assurez-vous que le chemin d'accès est correct. J'ai également dû changer le nom du journal généré, sinon il a essayé d'écraser le fichier mdf avec le journal, puis a jeté cette erreur https://stackoverflow.com/questions/7534664/sql-server-script-error-database-is- déjà utilisé

    CRÉER UNE BASE DE DONNÉES [xxxxx] SUR PRIMARY (NAME = xxxxx ', FILENAME = N'C: \ Program Files \ Microsoft SQL Server \ MSSQL11.MSSQLSERVER \ MSSQL \ DATA \ xxxxx.mdf', SIZE = 14400KB, MAXSIZE = UNLIMITED, FILEGROWTH = 1024 Ko) CONNEXION (NOM = N'xxxxxldf ', FILENAME = N'C: \ Program Files \ Microsoft SQL Server \ MSSQL11.MSSQLSERVER \ MSSQL \ DATA \ xxxxx_log.ldf', SIZE = 18560KB, MAXSIZE = 2048GB, FILEGROWTH = 10 %) ALLER

  • J'ai dû commenter la section générée et ajouter manuellement les autorisations utilisateur par la suite

    USE [xxxxx]
    GO
    /****** Object:  User [xxxxx]    Script Date: 30/11/2014 12:44:07 ******/
    CREATE USER [xxxxx] FOR LOGIN [xxxxx] WITH DEFAULT_SCHEMA=[dbo]
    GO
    sys.sp_addrolemember @rolename = N'db_owner', @membername = N'Umbraco'
    GO
    sys.sp_addrolemember @rolename = N'db_datareader', @membername = N'Umbraco'
    GO
    sys.sp_addrolemember @rolename = N'db_datawriter', @membername = N'Umbraco'
    GO
    

Ran it up, et voilà, je peux maintenant restaurer ma nouvelle base de données Umbraco 7.1.2 sur mon serveur Web qui ne dispose que de SQL Server 2008 R2!


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.