web-dev-qa-db-fra.com

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

J'ai une base de données sur une instance SQL Server 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 déjà essayé).

Je ne trouve aucune option en 2012 pour créer une sauvegarde compatible 2008. Est-ce que je manque quelque chose?

Existe-t-il un moyen simple 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 de 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âches Générer des scripts sur le serveur 2012 et j'étais capable de générer le schéma (y compris les procédures stockées) en tant que script SQL. Cela n'incluait aucune des données, cependant.

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é la machine source 2012 et la machine cible 2008, une liste de tables que j'ai pourrait copier. J'ai sélectionné toutes mes tables (plus de 300) et j'ai cliqué sur l'Assistant. Malheureusement, il passe des siècles à générer ses scripts, puis échoue avec des erreurs telles que "Echec lors de l'insertion dans la colonne en lecture seule 'FOO_ID'".

J'ai également essayé "l'Assistant de copie 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 l'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 ayant échoué avec une erreur

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

29
Rich

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

Je devais alors trouver un moyen de modifier le début de cet énorme fichier SQL pour modifier la manière dont la base de données serait créée - voir q: https://stackoverflow.com/questions/ 102829/best-free-text-editor-support-more-than-4gb-files

Enfin, je devais trouver un moyen d’exécuter le script SQL, trop volumineux pour pouvoir l’ouvrir dans SQL Management Studio. Voir q: https://stackoverflow.com/questions/431913/comment-pouvez-vous exécuter un fichier-300mb-ms-sql-sql

40
Rich

Pour les migrations SQL, utilisez l’assistant de migration de base de données SQL gratuit et à source ouverte.

J'avais une base de données de 5 Go avec quelques ~ 10 millions d'enregistrements et j'ai essayé l'itinéraire via Generate Script et que 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 siècles (et a les mêmes arguments en ligne de commande).

Ensuite, je suis tombé sur un outil formidable pour la migration de 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 la copie en bloc. Il existe une version graphique et une version en ligne de commande (batch) disponibles et open source. Voir http://sqlazuremw.codeplex.com/ . Dans mon cas, l'opération a pris 16 minutes.

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

12
lvmeijer

Je connais 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 en tant que base de données de destination. Ça a marché.

3
Fernando

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

2
Paul

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 les suivantes:

  • Modifiez les noms de fichiers logiques et assurez-vous que le chemin est correct. Je devais aussi changer le nom du journal généré, sinon il essayait de remplacer le fichier mdf par le journal, puis renvoyait cette erreur https://stackoverflow.com/questions/7534664/sql-server. -script-error-database-is-déjà-en-utilisation

    CREATE DATABASE [xxxxx] ON PRIMARY (NOM = xxxxx ', NOMFICHIER = N'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\xxxxx.mdf', SIZE = 14400 Ko, MAXSIZE = UNLIMITED, FILEGROWTH = 1024 Ko) SE CONNECTER (NOM = N'xxxxxldld ', NOMFICHIER = N'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\xxxxx_log.ldf' , TAILLE = 18560KB, MAXSIZE = 2048GB, FILEGROWTH = 10%) GO

  • Je devais commenter la section générée et ajouter ensuite les autorisations utilisateur manuellement

    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
    

A couru, et voilà que je peux maintenant restaurer ma nouvelle base de données Umbraco 7.1.2 sur mon serveur Web qui n'a que SQL Server 2008 R2!

1
ladygargar

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é la machine source 2012 et la machine cible 2008, une liste de tables que j'ai pourrait copier. J'ai sélectionné toutes mes tables (plus de 300) et j'ai cliqué sur l'Assistant. Malheureusement, il passe des siècles à générer ses scripts, puis échoue avec des erreurs telles que "Echec lors de l'insertion dans la colonne en lecture seule 'FOO_ID'".

Le problème est qu’il n’est pas possible d’insérer les colonnes d’ID, alors:

  1. Sélectionnez toutes les tables en les cochant
  2. Sélectionnez toutes les tables (cliquez sur la première, maintenez la touche Maj enfoncée et cliquez sur la dernière table).
  3. Cliquez sur "Edit Mappings" - 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'identité", puis cliquez sur Suivant et continuez, cela devrait fonctionner. Cela a fonctionné pour moi.
1
Jaimee Jose

Regardez Comparaison de schémas xSQL et Comparaison de données xSQL . Vous pouvez d'abord synchroniser le schéma avec la comparaison de schéma, puis copier les données.

Avertissement: je suis affilié à xSQL.

0
Endi Zhupani