web-dev-qa-db-fra.com

Erreur lors de la restauration de la sauvegarde de la base de données

J'obtiens une erreur lors de l'utilisation de SQL Server 2012 lors de la restauration d'une sauvegarde effectuée avec une version précédente (SQL Server 2008). En fait, j'ai plusieurs fichiers de sauvegarde de la même base de données (pris à des moments différents dans le passé). Les plus récents sont restaurés sans aucun problème; Cependant, l'un d'eux donne l'erreur suivante:

System.Data.SqlClient.SqlError: Recherche dans le répertoire pour le fichier "C:\PROGRAM FILES\Microsoft SQL SERVER\MSSQL.1\MSSQL\DATA\MYDB_ABC.MDF" a échoué avec l'opération. erreur système 3 (le système ne trouve pas le chemin spécifié.) . (Microsoft.SqlServer.SmoExtended)

Il s’agit d’un ordinateur x64 et mes fichiers de base de données se trouvent à l’emplacement suivant: c:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL.

Je ne comprends pas pourquoi il essaie de restaurer sur MSSQL.1 et non pas MSSQL11.MSSQLSERVER

18
Marius Bancila

J'ai réussi à le faire à partir de code. Ce n'était pas assez 

Restore bkp = new Restore();
bkp.PercentCompleteNotification = 1;
bkp.Action = RestoreActionType.Database;
bkp.Database = sDatabase;
bkp.ReplaceDatabase = true;

La propriété RelocateFiles doit être renseignée avec les noms et les chemins des fichiers à déplacer. Pour chaque fichier, vous devez spécifier le nom du fichier et le nouveau chemin physique. Donc, ce que j'ai fait a été de regarder la PrimaryFilePath de la base de données à laquelle je restaurais et de l'utiliser comme emplacement physique. Quelque chose comme ça:

if (!string.IsNullOrEmpty(sDataFileName) && !File.Exists(sDataFileName))
{
   if (originaldb != null)
   {
      if (string.Compare(Path.GetDirectoryName(sDataFileName), originaldb.PrimaryFilePath, true) != 0)
      {
         string sPhysicalDataFileName = Path.Combine(originaldb.PrimaryFilePath, sDatabase + ".MDF");
         bkp.RelocateFiles.Add(new RelocateFile(sLogicalDataFileName, sPhysicalDataFileName));
      }                  
   }
}

Idem pour le fichier journal.

5
Marius Bancila

On dirait que la sauvegarde a été effectuée sur une machine dont les chemins ne correspondent pas. Essayez d'effectuer la sauvegarde en utilisant T-SQL au lieu de l'interface utilisateur. Assurez-vous également que les chemins que vous spécifiez existent réellement et qu’il n’y a pas déjà une copie de ces fichiers mdf/ldf.

RESTORE DATABASE MYDB_ABC FROM DISK = 'C:\path\file.bak'
WITH MOVE 'mydb' TO 'c:\valid_data_path\MYDB_ABC.mdf',
MOVE 'mydb_log' TO 'c:\valid_log_path\MYDB_ABC.ldf';
33
Aaron Bertrand

La sauvegarde stocke l'emplacement d'origine des fichiers de la base de données et, par défaut, tente de restaurer au même emplacement. Étant donné que votre nouvelle installation de serveur se trouve dans de nouveaux répertoires et que, vraisemblablement, les anciens répertoires n'existent plus, vous devez modifier les répertoires par défaut afin qu'ils correspondent à l'emplacement que vous souhaitez utiliser.

Selon la façon dont vous restaurez la base de données, la manière de procéder différera. Si vous utilisez SSMS, parcourez les onglets et les listes jusqu'à ce que vous trouviez la liste des fichiers et leurs emplacements de disque associés. Vous pouvez ensuite modifier ces emplacements avant la restauration.

8
Daniel Renshaw

J'ai eu le même problème et cela a été corrigé sans code C #:

USE [master]
ALTER DATABASE [MyDb] 
SET SINGLE_USER WITH ROLLBACK IMMEDIATE
RESTORE DATABASE [MyDb] 
FROM  DISK = N'D:\backups\mydb.bak' 
WITH  FILE = 1,  
MOVE N'MyDb' TO N''c:\valid_data_path\MyDb.mdf',  
MOVE N'MyDb_log' TO N'\valid_log_path\MyDb.ldf',  
NOUNLOAD,  
REPLACE,  
STATS = 5
ALTER DATABASE [MyDb] SET MULTI_USER

ALLER

4
Paul W

Comme cela a déjà été dit à plusieurs reprises, la restauration d'une sauvegarde où les nouveaux et anciens chemins d'accès des fichiers mdf et ldf ne correspondent pas peut être à l'origine de cette erreur. Il existe déjà plusieurs bons exemples de la façon de traiter cela avec SQL. Aucun d’entre eux n’a cependant fonctionné pour moi jusqu’à ce que j’ai réalisé que dans mon cas, j’avais besoin d’inclure les extensions ".mdf" et ".ldf" dans la partie de la déclaration 'MOVE', par exemple:

RESTORE DATABASE [SomeDB] 
FROM DISK = N'D:\SomeDB.bak' 
WITH MOVE N'SomeDB.mdf' TO N'D:\SQL Server\MSSQL12.MyInstance\MSSQL\DATA\SomeDB.mdf', 
MOVE N'SomeDb_log.ldf' TO N'D:\SQL Server\MSSQL12.MyInstance\MSSQL\DATA\SomeDB_log.ldf'

J'espère que cela épargnera un peu de peine à quelqu'un, je ne comprenais pas pourquoi SQL suggérait que je devais utiliser l'option WITH MOVE alors que je le faisais déjà.

2
tomRedox

Lors de la restauration, sous Fichiers, cochez la case "Déplacer tous les fichiers dans un dossier".

 check 'Relocate all files to folder'

1
Hypenate

Veuillez essayer de décocher l'option «Sauvegarde du journal de sauvegarde» sur la page Options de la boîte de dialogue Restaurer la base de données.

0
user5167194

Essayez de redémarrer le service SQL. Travaillé pour moi 

0
Chris

Juste au cas où cela serait utile pour une personne travaillant directement avec Powershell (en utilisant la bibliothèque SMO ), dans ce cas particulier, il y avait également des fichiers de données secondaires. J'ai légèrement amélioré le script en supprimant tous les processus ouverts, puis en effectuant la restauration. 

Import-module SQLPS
$svr = New-Object ("Microsoft.SqlServer.Management.Smo.Server") "server name";
$svr.KillAllProcesses("database_name");
$RelocateData1 = New-Object "Microsoft.SqlServer.Management.Smo.RelocateFile, Microsoft.SqlServer.SmoExtended, Version=13.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" ("primary_logical_name","C:\...\SQLDATA\DATA\database_name.mdf")
$RelocateData2 = New-Object "Microsoft.SqlServer.Management.Smo.RelocateFile, Microsoft.SqlServer.SmoExtended, Version=13.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" ("secondary_logical_name_2","C:\...\SQLDATA\DATA\secondary_file_2.mdf")
$RelocateData3 = New-Object "Microsoft.SqlServer.Management.Smo.RelocateFile, Microsoft.SqlServer.SmoExtended, Version=13.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" ("secondary_logical_name_3","C:\...\SQLDATA\DATA\secondary_file_3.mdf")
$RelocateLog = New-Object "Microsoft.SqlServer.Management.Smo.RelocateFile, Microsoft.SqlServer.SmoExtended, Version=13.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" ("database_name_log","C:\...\SQLDATA\LOGS\database_name_log.ldf")
Restore-SqlDatabase -ServerInstance "server-name" -Database "database_name" -BackupFile "\\BACKUPS\\database_name.bak" -RelocateFile @($RelocateData1, $RelocateData2, $RelocateData3, $RelocateLog) -ReplaceDatabase
0
Saul Cruz

Il y a un problème de version dans ceci. Vous pouvez migrer votre base de données vers 2012 par 2 autres méthodes: -

1) déconnectez la base de données> copiez les fichiers .mdf et .ldf dans le dossier de données du serveur cible et attachez la base de données. se référer à ceci: - https://dba.stackexchange.com/questions/30440/how-do-i-attach-a-database-in-sql-server

2) Créez un script de la base de données complète avec schema & Data et exécutez-le sur le serveur cible (le processus très lent prend du temps). reportez-vous à ceci: - Générer un script dans SQL Server Management Studio

0
vinod meena