web-dev-qa-db-fra.com

Comment copier une base de données SQL Server 2012 sur une instance localdb?

Je cherche à copier une base de données SQL Server 2012 Standard sur mon instance localdb. J'ai essayé l'assistant qui se plaint que localdb n'est pas une SQL Server 2005 ou une instance plus récente de Express . J'ai également effectué une sauvegarde/restauration mais lors de la restauration dans ma localdb, l'erreur suivante s'affiche:.

En cours d'exécution ...

RESTORE DATABASE CSODev
FROM DISK = 'C:\MyBckDir\CSODev.bak'
WITH MOVE 'CSOdev_Data' TO 'C:\Users\cblair\CSOdev_Data.mdf',
MOVE 'CSOdev_Log' TO 'C:\Users\cblair\CSOdev_Log.ldf',
REPLACE

Message d'erreur que je reçois ...

8752 pages traitées pour la base de données 'CSODev', fichier 'CSOdev_Data' sur le fichier 1.
Traité 5 pages pour la base de données 'CSODev', fichier 'CSOdev_Log' du fichier 1.

Msg 1853, niveau 16, état 1, ligne 1
Le fichier de base de données logique 'CSOdev_Log' est introuvable. Spécifiez le chemin complet du fichier.
Msg 3167, Niveau 16, Etat 1, Ligne 1
RESTORE n'a pas pu démarrer la base de données 'CSODev'.
Msg 3013, niveau 16, état 1, ligne 1
RESTORE DATABASE se termine de manière anormale.

La base de données se termine en mode "Récupération en attente". Il semble que le fichier journal pose des problèmes. J'ai essayé 2 sauvegardes différentes au cas où l'une d'entre elles serait simplement corrompue.

23
Corey Blair

Il y a limitation connue (un vrai bogue, en fait) pour localDB. Toute restauration avec MOVE échouera si vos fichiers de base de données sont situés dans des dossiers différents. 

Vous devez restaurer dans les dossiers d'origine (pas MOVE). Utilisez l'outil cmd tel que SUBST si vous devez simuler un lecteur:/chemin.

15
BernardV

J'ai eu le même problème. Ce qui a finalement fonctionné était le suivant:

  1. Essayer de restaurer la base de données (obtenir l'erreur dans l'OP)
  2. Détachement de la base de données
  3. Rattacher la base de données

Lors de la dernière étape, SSDT a mis à niveau les fichiers de données, apparemment dans un format plus ancien. Quand cela a été fini, la base de données a commencé à fonctionner sans problème!

5
MEMark

J'avais le même problème et après avoir fait une petite recherche en ligne, j'ai trouvé un moyen ingénieux de le faire fonctionner (bien que tout à fait hacky). En gros, vous:

  1. Créez une instance SqlLocalDb (SqlLocalDb c tmp -s).
  2. Restaurez la base de données comme vous l’avez fait précédemment (par exemple, SqlCmd -E -S <localdb connection string> -Q "RESTORE DATABASE ...").
  3. Arrêtez l'instance SqlLocalDb (SqlLocalDb p tmp).
  4. Supprimez l'instance SqlLocalDb (SqlLocalDb d tmp).
  5. Créez une nouvelle instance SqlLocalDb (SqlLocalDb c persistent -s).
  6. Créez la base de données dans la nouvelle instance en la reliant (SqlCmd -E -S <persistent connection string> -Q "Create Database <dbname> On (Filename = '<Mdf file location'), (Filename = '<Ldf Filename'>) For Attach".

Et j'espère que cela devrait fonctionner. Voir ici pour l'idée originale.

Edit: Added Jason Brady 'correction de la commande create.

4
ktr

Essayez d’écrire votre base de données sous forme de schéma et de données, puis d’exécuter le script localement.

3
Srb1313711
RESTORE FILELISTONLY
FROM DISK = 'D:\SQLBackups\yourdatabase.BAK'


ALTER DATABASE yourdatabasename
SET SINGLE_USER WITH
ROLLBACK IMMEDIATE

RESTORE DATABASE yourdatabasename
FROM DISK = 'D:\SQLBackups\yourdatabase.BAK'
with replace,
move 'logical name from file stream' to
'C:\yourdatabase.mdf',
move 'logical name from file stream' to 'C:\Yourdatabase.ldf'
ALTER DATABASE Qatar_DB SET MULTI_USER
2
Kiran M R

J'ai eu le même problème. Essayez d’exécuter Visual Studio en tant qu’administrateur et essayez la commande suivante

RESTORE DATABASE CSODev
FROM DISK = 'C:\MyBckDir\CSODev.bak'
WITH NORECOVERY, MOVE 'CSOdev_Data' TO 'C:\Users\cblair\CSOdev_Data.mdf',
MOVE 'CSOdev_Log' TO 'C:\Users\cblair\CSOdev_Log.ldf',

MISE À JOUR: Cela n'a pas fonctionné exactement! 

Bien que l'instruction ci-dessus ne génère aucune erreur et se termine correctement, la base de données reste à l'état "PENDING RECOVERY" et n'est accessible d'aucune façon. Lorsque j'ai essayé de "RESTORE WITH RECOVER" pour mettre la base de données en ligne, j'ai eu la même erreur que dans la question ci-dessus.

Donc, dans mon cas, j'ai fini par restaurer la sauvegarde sur un serveur DEV que j'ai exécuté avec MSSQL 2008 R2, puis choisi: Tâches -> Générer des scripts -> choisi des objets dans le script & Suivant -> cliquez sur le bouton "Avancé" -> sélectionnez " types de données au script ": Schéma et données. Exécutez maintenant le script généré sur la base de données locale.

1
cleftheris

Même problème, merci pour l'aide. Ma base de données locale est MS SQL 2014. Ouvrir "SQL Server 2014 Management Studio"

  1. Faites un clic droit sur la base de données, allez dans "Tâches", cliquez sur "Déconnecter"
  2. Détachez la base de données
  3. Joindre la base de données

Cela fonctionne pour moi. Après avoir sauvegardé la base de données, vous pouvez restaurer la base de données sans erreur. Merci.

1
Stephen

Essayez ces scripts (par exemple avec adventureworks2012 que j’ai personnellement testé):

RESTORE FILELISTONLY
FROM DISK = 'c:\temp\adv2012.bak'

Cela fera apparaître les noms de fichiers comme:

AdventureWorks2012      C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQL2012RTM\MSSQL\DATA\AdventureWorks2012.mdf
AdventureWorks2012_log  C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQL2012RTM\MSSQL\DATA\AdventureWorks2012_log.ldf

Utilisez ces noms de fichiers pour structurer votre script final de la manière suivante:

RESTORE DATABASE AdventureWorks2012
FROM DISK = 'C:\temp\adv2012.bak'

WITH MOVE 'AdventureWorks2012' TO 'C:\cnom_WS\Local-Databases\AdventureWorks\AdventureWorks2012.mdf',
MOVE 'AdventureWorks2012_log' TO 'C:\cnom_WS\Local-Databases\AdventureWorks\AdventureWorks2012_log.ldf',
REPLACE;

BTW, je les exécute via Visual Studio (Explorateur d’objets SQL Server), mais j’imagine fort que cela pourrait s’exécuter facilement sur SSMS ;-)

0
cnom