18

Ich erhalte einen Fehler bei der Verwendung von SQL Server 2012 beim Wiederherstellen einer mit einer früheren Version (SQL Server 2008) erstellten Sicherung. Ich habe tatsächlich mehrere Backup-Dateien der gleichen Datenbank (zu verschiedenen Zeiten in der Vergangenheit genommen). Die neuesten werden ohne Probleme wiederhergestellt; aber einer von ihnen gibt die folgenden Fehler:Fehler beim Wiederherstellen der Datenbanksicherung

System.Data.SqlClient.SqlError: Directory lookup for the file "C:\PROGRAM FILES\MICROSOFT SQL SERVER\MSSQL.1\MSSQL\DATA\MYDB_ABC.MDF" failed with the operating system error 3(The system cannot find the path specified.). (Microsoft.SqlServer.SmoExtended)

Dies ist eine x64-Maschine, und meine Datenbankdatei (en) ist in diesem Ort: c:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL.

Ich verstehe nicht, warum es versucht, auf MSSQL.1 und nicht MSSQL11.MSSQLSERVER wiederherzustellen.

+3

Dies hat nichts mit Versionsproblemen zu tun. (Die Nachricht sagt Ihnen das) – usr

+0

@marc_s, warum fühlen Sie sich verpflichtet, die Fragen zu ändern? Ich könnte das Fett verstehen, aber nicht den Titel, das Zitat, das Ende usw. –

+0

@ usr, ich erwähnte SQL Server 2012, weil die Probleme nicht auf Maschinen mit SQL Server 2008 auftreten. Also, ich denke, es gibt ein Verbindung. –

Antwort

5

Ich habe es aus dem Code geschafft. Das war nicht genug

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

Die RelocateFiles Eigenschaft muss mit den Namen und Pfade der Dateien verlegt werden gefüllt werden. Für jede Datei müssen Sie den Namen der Datei und den neuen physischen Pfad angeben. Was ich also gemacht habe, war die PrimaryFilePath der Datenbank, die ich wiederhergestellt habe, und diese als physischen Speicherort zu verwenden. Etwas wie dieses:

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)); 
     }     
    } 
} 

Das gleiche für die Protokolldatei.

+0

Sie wissen, dass C# auch einen RESTORE DATABASE-Befehl erstellen und senden kann. –

+0

Ja. Ich hatte diesen Code, der gut funktionierte, bis wir SQL Server 2012 ausprobierten. Also musste ich einige Korrekturen vornehmen, damit es funktionierte.Ich weiß nicht, was 2012 geändert wurde, so dass es nicht wie 2008 funktioniert. –

+0

Nichts, außer dass deine Wege anders waren, das ist alles. Es hat nichts mit der Version zu tun. Das Gleiche wäre passiert, wenn Sie verschiedene benannte Instanzen von SQL Server 2008 hätten. –

31

Hört sich an, als ob das Backup auf einem Computer erstellt wurde, dessen Pfade nicht mit Ihrem übereinstimmen. Versuchen Sie, die Sicherung mit T-SQL anstelle der Benutzeroberfläche auszuführen. Stellen Sie außerdem sicher, dass die Pfade, die Sie angeben, tatsächlich existieren und dass sich dort noch keine Kopie dieser MDF/LDF-Dateien befindet.

+0

die Sicherung wurde auf einer anderen Maschine ja übernommen. Ich mache die Wiederherstellung von Code, aber ich bekomme das gleiche Ergebnis, wenn ich es von SQL Server 2012 UI mache. Keine Probleme auf Computern mit SQL Server 2008 –

+0

in meinem SQL Server 2012 (Computer 1) ist der Standarddatenbankspeicherort C: \ Programme \ Microsoft SQL Server \ MSSQL11.MSSQLSERVER \ MSSQL \ DATA. In SQL Server 2008 (Computer 2) ist der Standarddatenbankspeicherort C: \ Programme \ Microsoft SQL Server \ MSSQL10_50.MARIUSPC \ MSSQL \ DATA. Die Wiederherstellung aus derselben detabase schlägt mit SQL Server 2012 fehl, ist aber mit SQL Server 2008 erfolgreich. Was heißt also, dass die Einstellung "Wenn der Standardspeicherort von der Sicherung auf diesem Computer nicht verfügbar ist" die Standardeinstellung verwendet? Weil es so aussieht, als ob es mit 2008 passiert –

+0

thx, löste es für mich – nozzleman

7

Die Sicherung speichert den ursprünglichen Speicherort der Datenbankdateien und versucht standardmäßig, denselben Speicherort wiederherzustellen. Da sich die neue Serverinstallation in neuen Verzeichnissen befindet und vermutlich die alten Verzeichnisse nicht mehr existieren, müssen Sie die Verzeichnisse von den Standardeinstellungen an den Speicherort anpassen, den Sie verwenden möchten.

Je nachdem, wie Sie die Datenbank wiederherstellen, unterscheidet sich die Vorgehensweise. Wenn Sie SSMS verwenden, sehen Sie in den Registerkarten und Listen nach, bis Sie die Liste der Dateien und die zugehörigen Speicherorte für Datenträger gefunden haben. Sie können diese Speicherorte dann vor dem Wiederherstellen bearbeiten.

+0

Ich kann dies mit SSMS reproduzieren, aber ich mache tatsächlich die Wiederherstellung von Code (C#). –

-1

Bitte ändern Sie den .mdf Dateipfad. Erstellen Sie einfach einen Ordner in einem beliebigen Laufwerk, dh - im Laufwerk "D" erstellen Sie einfach einen Ordner mit einem benutzerdefinierten Namen (dbase) und zeigen Sie den Pfad zum neuen Ordner, mssql wird automatisch die Dateien erstellen.

"C: \ Programme \ Microsoft SQL Server \ MSSQL.1 \ MSSQL \ DATA \ MYDB_ABC.MDF" zu "D: \ dbase \ MYDB_ABC.MDF"

3

hatte ich das gleiche Problem, und dies behoben haben es ohne C# -Code:

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 

GO

+0

Das hat auch bei mir funktioniert. Die von mir gesicherte Datenbank hatte andere Pfade als die Zieldatenbank. Es scheint, dass Sie in solchen Situationen die MOVE-Optionen verwenden müssen, wenn Sie RESTORE DATABASE ausführen. Wenn ich die MOVE-Optionen für beide Dateien hinzugefügt habe, die die Speicherorte in der Zieldatenbank bereitstellen (die im Befehl RESTORE erwähnte), wurde die Wiederherstellung erfolgreich abgeschlossen. –

+0

Ich benutze einen Wiederherstellungsbefehl ähnlich wie dieser, mit MOVE und sogar Einzelbenutzer-Sperre, aber die Datenbank beschwert sich immer noch über Dateien auf dem alten Rechner nicht zu finden (wie in OP). Sobald ich einmal eine manuelle Wiederherstellung durchgeführt habe, kann ich das Skript problemlos ausführen. Vielleicht habe ich ein anderes Problem ... Ich bin es gewohnt, Microsoft-Probleme mit Ham-Handed-Methoden zu lösen, also ... – Erk

+0

Vielleicht muss der SQL-Manager als Administrator ausgeführt werden. Es ist möglich, dass die Dateien nicht erstellt werden können. Sie können auch versuchen, leere MOF- und LDF-Dateien am MOVE-Speicherort zu erstellen. Ich gehe davon aus, dass es sich um die Dateien handelt, auf die Sie sich beziehen. –

0

Bitte versuchen sie die „Schwanz-Log Backup“ Option auf der Seite Optionen der Datenbank wiederherstellen zu deaktivieren Dialog

+0

Er hat bereits eine Antwort akzeptiert, also sein Problem gelöst :-) –

0

Es gibt ein Versions-Problem in diesem. Sie können Ihre Datenbank nach 2012 um zwei weitere Methoden migrieren: -

1) die Datenbank offline nehmen> kopieren Sie die MDF- und LDF-Dateien in den Zielserver-Datenordner und hängen Sie die Datenbank an.siehe dazu: - https://dba.stackexchange.com/questions/30440/how-do-i-attach-a-database-in-sql-server

2) Erstellen Sie Skript für die gesamte Datenbank mit Schema & Daten und es auf dem Zielserver läuft (sehr langsamer Prozess braucht Zeit). referenzieren: - Generate script in SQL Server Management Studio

0

Versuchen Sie den SQL-Dienst neu zu starten. Arbeitete für mich.

2

Wie bereits erwähnt, kann das Wiederherstellen einer Sicherung, bei der die neuen und alten Pfade für die MDF- und LDF-Dateien nicht übereinstimmen, diesen Fehler verursachen. Es gibt bereits einige gute Beispiele dafür, wie man damit mit SQL umgehen kann, aber keiner von ihnen hat für mich funktioniert, bis mir klar wurde, dass ich in meinem Fall die Erweiterungen ".mdf" und ".ldf" im Teil von die ‚MOVE‘ Anweisung, zum Beispiel:

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' 

Hoffnung, dass jemand etwas Schmerz erspart, kann ich nicht verstehen, warum SQL vorschlägt ich die WITH MOVE Option zu verwenden, benötigen, wenn ich schon so tat.

0

Bei der Wiederherstellung unter Dateien, überprüft ‚alle Dateien umziehen ins Verzeichnis‘

check 'Relocate all files to folder'

0

Nur falls dies für jemanden nützlich ist die direkte Arbeit mit Powershell (mit der SMO Bibliothek), in diesem speziellen Fall es gab auch sekundäre Datendateien. Ich habe das Skript ein wenig verbessert, indem ich offene Prozesse beendete und dann die Wiederherstellung durchführte.

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 
Verwandte Themen