Erreur 3154 lors de la restauration d'une sauvegarde à l'aide de WITH REPLACE

16

J'ai installé SQL 2012 avec SP1 sur mon ordinateur. J'ai fait une sauvegarde d'une base de données test.bak.

J'ai une base de données avec le nom test2qui est la même base de données, mais les données ont changé.

Je veux restaurer test.baksur la test2base de données.

Je reçois toujours l'erreur:

Erreur 3154: le jeu de sauvegarde contient une sauvegarde d'une base de données autre que la base de données existante.

J'ai essayé:

  1. J'ai fait un clic droit test2 -> Restore database -> From device

    J'ai choisi test.baket vérifié With Replacemais j'obtiens l'erreur.

  2. J'ai ensuite essayé de faire un clic droit sur test2 -> Restore file and filegroups

    J'ai choisi test.baket vérifié With Replacemais j'obtiens l'erreur.

Je peux supprimer mon ancienne base de données, puis restaurer ma sauvegarde avec le bon nom, mais lorsque j'utilisais SQL 2008, je n'ai eu aucun problème à restaurer sur une base de données existante.

Il semble que depuis que j'utilise SQL2012, je reçois beaucoup cette erreur!

Danielle Paquette-Harvey
la source

Réponses:

12

Vous devez utiliser WITH REPLACEet en général éviter d'utiliser les trucs pointer-cliquer dans Management Studio - ils sont inflexibles et comportent souvent des bogues.

Cela a fonctionné pour moi:

USE [master];
GO

CREATE DATABASE test;
GO

CREATE DATABASE test2;
GO

BACKUP DATABASE test TO DISK = 'c:\temp\test.bak' WITH INIT, COMPRESSION;
GO

RESTORE DATABASE test2
  FROM DISK = 'c:\temp\test.bak'
  WITH REPLACE,
  MOVE 'test' TO 'c:\temp\test2.mdf',
  MOVE 'test_log' TO 'c:\temp\test2.ldf';

Vous devez également vous assurer que lorsque vous sauvegardez des bases de données que vous utilisez WITH INITet / ou ne pointez pas le périphérique vers un fichier qui contient déjà une sauvegarde (car il ne s'agit peut-être pas de la même base de données que vous sauvegardez maintenant - surtout si vous réutilisez des noms comme test...).

Aaron Bertrand
la source
@AaronBertrand fyi, cette fonctionnalité existe. Ce que je fais habituellement, c'est d'utiliser l'interface utilisateur et de l'écrire pour m'assurer que tout va bien. Il y a beaucoup de bugs, oui.
usr
2

1) À utiliser WITH REPLACElors de l'utilisation de la RESTOREcommande.

2) DROPl'ancienne base de données en conflit et restaurer à nouveau à l'aide de la RESTOREcommande.

Il n'y a aucun problème avec la version de SQL Server. Comme l'a souligné Aaron, je peux également restaurer la base de données de 2008 à 2012 et les mêmes versions également.

Kin Shah
la source
2

Vous restaurez la mauvaise base de données. Ne pensez pas à cela comme "restauration test2avec une sauvegarde à partir de test", pensez à "restaurer ma sauvegarde de testmais renommez-la comme test2". Vous pouvez choisir la tâche de restauration à partir testet mettre test2dans la « base de données To: ».

Comme Aaron le mentionne, apprenez le script plutôt que de vous fier à l'assistant - il est plus clair de savoir ce qui se passe où.

SQLFox
la source
2

Vous pouvez toujours le faire, mais cela nécessite une étape supplémentaire.

Ouvrez la boîte de dialogue de restauration, faites vos sélections habituelles selon les habitudes de 2008. Si la base de données d'origine est DB, choisissez le périphérique DB.bak pour la source et remplacez le nom de destination par DBTest. Ensuite, sous Sélectionnez une page (coin supérieur gauche), où vous voyez Général / Fichiers / Options - choisissez Fichiers. Regardez dans la grille. Vous verrez des colonnes pour le nom de fichier d'origine et la restauration en tant que nom de fichier. Élargissez manuellement ce dernier et saisissez le nouveau nom (si le nom d'origine de la base de données est DB et que vous souhaitez créer DBTest, remplacez .... \ DB.mdf par ... \ DBTest.mdf, etc.)

Cela acceptera votre fichier .bak pour DB comme source et DBTest comme destination. Vous devrez peut-être également accéder à la page Options et choisir Avec remplacer. Je dois le faire pour d'autres raisons, donc je ne peux pas le tester sans cette option.

Debby
la source
2

Comme indiqué, la bonne réponse consiste à utiliser l' WITH REPLACEoption.

Je veux juste souligner que vous pouvez obtenir l'erreur dans la question même lors de l'utilisation WITH REPLACE, si vous essayez de restaurer à partir d'une sauvegarde différentielle (sans la sauvegarde complète).

Brimstedt
la source
Je n'avais probablement pas assez de points pour commenter au moment de cette réponse, je voulais juste souligner que vous pouvez obtenir l'erreur même en utilisant "AVEC REMPLACER" si vous essayez de restaurer à partir d'une sauvegarde différentielle (sans la sauvegarde complète)
Brimstedt
0

J'espère que cela fonctionnera.

  1. Une fois que vous avez défini le chemin d'accès pour restaurer le fichier.
  2. Cliquez sur "Options" sur le côté gauche.
  3. Cochez la case - "Fermer les connexions existantes à la base de données de destination".
  4. Cliquez sur OK. entrez la description de l'image ici
Vinu M Shankar
la source
-4

Veuillez arrêter votre serveur en cours d'exécution puis restaurer la base de données, cela vous aidera. :)

Dupinder Singh
la source