it-swarm.com.de

SQL Server: Datenbank bleibt im Status "Wiederherstellen"

Ich habe eine Datenbank gesichert:

BACKUP DATABASE MyDatabase
TO DISK = 'MyDatabase.bak'
WITH INIT --overwrite existing

Und dann versucht es wieder herzustellen:

RESTORE DATABASE MyDatabase
   FROM DISK = 'MyDatabase.bak'
   WITH REPLACE --force restore over specified database

Und jetzt steckt die Datenbank im Wiederherstellungszustand.

Einige Leute haben die Theorie aufgestellt, dass dies darauf zurückzuführen ist, dass sich in der Sicherung keine Protokolldatei befand und dass diese mithilfe der folgenden Elemente aktualisiert werden musste:

RESTORE DATABASE MyDatabase
WITH RECOVERY 

Außer dass das natürlich fehlschlägt:

Msg 4333, Level 16, State 1, Line 1
The database cannot be recovered because the log was not restored.
Msg 3013, Level 16, State 1, Line 1
RESTORE DATABASE is terminating abnormally.

Und genau das, was Sie in einer katastrophalen Situation wollen, ist eine Wiederherstellung, die nicht funktioniert.


Die Sicherung enthält sowohl eine Daten- als auch eine Protokolldatei:

RESTORE FILELISTONLY 
FROM DISK = 'MyDatabase.bak'

Logical Name    PhysicalName
=============   ===============
MyDatabase    C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\MyDatabase.mdf
MyDatabase_log  C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\MyDatabase_log.LDF
514
Ian Boyd

Sie müssen die Option WITH RECOVERY zusammen mit dem Befehl RESTORE Ihrer Datenbank verwenden, um Ihre Datenbank als Teil des Wiederherstellungsvorgangs online zu schalten.

Dies ist natürlich nur dann der Fall, wenn Sie keine Transaktionsprotokollsicherungen wiederherstellen möchten, d. H. Sie möchten nur eine Datenbanksicherung wiederherstellen und dann auf die Datenbank zugreifen können.

Ihr Befehl sollte so aussehen,

RESTORE DATABASE MyDatabase
   FROM DISK = 'MyDatabase.bak'
   WITH REPLACE,RECOVERY

Mit dem Wiederherstellungsdatenbank-Assistenten in SQL Server Management Studio haben Sie möglicherweise mehr Erfolg. Auf diese Weise können Sie bestimmte Dateispeicherorte, die Überschreibungsoption und die Option WITH Recovery auswählen.

409
John Sansom

Ich hatte in dieser Situation eine Datenbank in einer Instanz von SQL Server 2005 Standard Edition mit Symantec Backup Exec 11d wiederhergestellt. Nach Abschluss des Wiederherstellungsjobs blieb die Datenbank im Status "Wiederherstellen". Ich hatte keine Probleme mit dem Festplattenspeicher - die Datenbank kam einfach nicht aus dem Status "Wiederherstellen". 

Ich habe die folgende Abfrage mit der SQL Server-Instanz ausgeführt und festgestellt, dass die Datenbank sofort nutzbar wurde:

RESTORE DATABASE <database name> WITH RECOVERY
622
Evan Anderson

So machen Sie es:

  1. Beenden Sie den Dienst (MSSQLSERVER).
  2. Benennen oder löschen Sie die Datenbank- und Protokolldateien (C:\Programme\Microsoft SQL Server\MSSQL.1\MSSQL\Data ...) oder wo immer Sie die Dateien haben.
  3. Starten Sie den Dienst (MSSQLSERVER).
  4. Löschen Sie die Datenbank mit dem Problem.
  5. Stellen Sie die Datenbank erneut wieder her.

Viel Glück!

94
Tipu Delacablu

Ich hatte einen ähnlichen Vorfall beim Stoppen eines sekundären Servers zum Protokollversand ... Nach dem Befehl zum Entfernen des Servers vom Protokollversand und zum Stoppen des Protokollversands vom primären Server blieb die Datenbank auf dem sekundären Server nach dem Befehl im Wiederherstellungsstatus stehen

RESTORE DATABASE <database name> WITH RECOVERY

Die Datenbankmeldungen:

RESTORE DATABASE hat 0 Seiten in 18.530 Sekunden erfolgreich verarbeitet (0,000 MB/s).

Die Datenbank war nach diesen 18 Sekunden wieder nutzbar.

80
Hans

Ich hatte ein ähnliches Problem bei der Wiederherstellung mit SQL Management Studio. Ich habe versucht, eine Sicherung der Datenbank auf einer neuen mit einem anderen Namen wiederherzustellen. Zunächst schlug dies fehl und nachdem die Dateinamen der neuen Datenbank korrigiert worden waren, wurde sie erfolgreich ausgeführt. In jedem Fall trat das Problem, das ich beschreibe, erneut auf, selbst wenn ich es vom ersten Mal an richtig verstanden hatte. Nach der Wiederherstellung blieb die ursprüngliche Datenbank neben dem Namen (Wiederherstellen ...). In Anbetracht der Antworten des obigen Forums (Bhusan's) habe ich versucht, im Abfrage-Editor neben der folgenden Seite auszuführen:

RESTORE DATABASE "[NAME_OF_DATABASE_STUCK_IN_RESTORING_STATE]"

was das Problem behoben hat. Ich hatte zunächst Probleme mit dem Datenbanknamen, der Sonderzeichen enthielt. Ich habe das Problem gelöst, indem Sie doppelte Anführungszeichen hinzugefügt haben - einfache Anführungszeichen würden nicht funktionieren und gaben den Fehler "Falsche Syntax in der Nähe ...".

Dies war die minimale Lösung, die ich versucht habe, um dieses Problem zu beheben (festgehaltene Datenbank im Wiederherstellungsstatus), und ich hoffe, dass es auf mehr Fälle angewendet werden kann.

67
Demetris Leptos

OK, ich habe ein ähnliches Problem und genau wie im Fall von Pauk, wurde es verursacht, weil der Server während der Wiederherstellung nicht mehr über genügend Festplattenspeicher verfügte. Dies führte zu einem permanenten Wiederherstellungsstatus. So beenden Sie diesen Status, ohne die SQL Server-Dienste zu stoppen ? 

Ich habe eine Lösung gefunden :)

Drop database *dbname*
33
Marko

Die Option WITH RECOVERY wird standardmäßig verwendet, wenn die Befehle RESTORE DATABASE/RESTORE LOG ausgeführt werden. Wenn Sie sich im Wiederherstellungsprozess befinden, können Sie eine Datenbank in den Online-Status zurückversetzen, indem Sie Folgendes ausführen:

RESTORE DATABASE YourDB WITH RECOVERY
GO

Wenn mehrere Dateien wiederhergestellt werden müssen, benötigen CLI-Befehle WITH NORECOVERY bzw. WITH RECOVERY. Nur die letzte Datei im Befehl sollte WITH RECOVERY enthalten, um die Datenbank wieder online zu schalten:

RESTORE DATABASE YourDB FROM DISK = 'Z:\YourDB.bak'
WITH NORECOVERY
GO
RESTORE LOG YourDB FROM DISK = 'Z:\YourDB.trn'
WITH RECOVERY
GO

Sie können den SQL Server Management Studio-Assistenten auch verwenden:

enter image description here

Es gibt auch einen virtuellen Wiederherstellungsprozess, aber Sie müssen Lösungen von Drittanbietern verwenden. Normalerweise können Sie eine Datenbanksicherung als Live-Online-Datenbank verwenden. ApexSQL und Idera haben eigene Lösungen. Rezension von SQL Hammer über ApexSQL Restore . Die virtuelle Wiederherstellung ist eine gute Lösung, wenn Sie mit einer großen Anzahl von Sicherungen arbeiten. Der Wiederherstellungsvorgang ist viel schneller und kann auch viel Speicherplatz auf der Festplatte sparen. Sie können einen Blick auf Infografik werfen, um einen Vergleich zu erhalten.

29
Marko Krstic

Das mag ziemlich offensichtlich sein, aber es hat mich gerade erst ausgelöst: 

Wenn Sie eine Tail-Log-Sicherung durchführen, kann dieses Problem auch dadurch verursacht werden, dass diese Option im SSMS-Wiederherstellungsassistenten aktiviert ist - "Quelldatenbank im Wiederherstellungsstatus belassen (WITH NORECOVERY)" 

enter image description here

23
TrailJon

Ich habe herausgefunden warum.

Wenn der Client, der den Befehl RESTORE DATABASE ausgegeben hat, die Verbindung während der Wiederherstellung abbricht, wird die Wiederherstellung unterbrochen.

Es ist seltsam, dass der Server, wenn er von einer Clientverbindung aufgefordert wird, eine Datenbank wiederherzustellen, die Wiederherstellung nicht beendet, es sei denn, der Client bleibt die ganze Zeit verbunden.

15
Ian Boyd

dieser hat gearbeitet:

http://social.msdn.Microsoft.com/Forums/de/sqldatabaseengine/thread/8dd1b91d-3e14-4486-abe6-e3a550bfe457

Ich hatte eine Situation, in der meine Datenbank den Wiederherstellungsstatus anzeigte, ich keine Abfragen ausführen konnte und keine Verbindung zu unserer Software herstellen konnte.

Was ich getan habe, um aus dieser Situation herauszukommen, ist:

  1. Stoppen Sie alle SQL-bezogenen Dienste von Windows-Diensten.

  2. Ich habe den Ordner DATA geöffnet, in dem sich die Ldf- und Mdf-Dateien im SQL-Verzeichnis befinden. Normalerweise sieht das folgendermaßen aus: "C:\Programme ***********\MSSQL\DATA

  3. Dann kopierte ich die Ldf- und Mdf-Dateien der Datenbank: [Datenbankname] .mdf und [Datenbankname] _log.ldf

Ich habe beide Dateien in einen anderen Ordner kopiert.

  1. Dann habe ich alle SQL-bezogenen Dienste (in Schritt 1) ​​erneut von Windows-Diensten gestartet.

  2. Ich habe mein MS SQL Management Studio mit normalem Login gestartet.

  3. Klicken Sie mit der rechten Maustaste auf die Täter-Datenbank und drücken Sie ENTF (um die Datenbank überhaupt zu löschen).

  4. Alle LDF- und MDF -Dateien, die sich auf diese Datenbank beziehen, sind aus dem DATA-Ordner (in Schritt 2 erwähnt) gegangen.

  5. Erstellt eine neue Datenbank mit demselben Namen (derselbe Name wie die, die ich in Schritt 6 gelöscht habe - die Täterdatenbank).

  6. Dann [Datenbankname] -> Rechtsklick -> Aufgaben -> Offline schalten.

  7. Ich kopierte dann beide Dateien (aus Schritt 3) zurück in den Ordner DATA (Schritt 2).

  8. [Datenbankname] -> Rechtsklick -> Aufgaben -> Online schalten.

9
Ameen Abuhilal

Ich hatte ein . in meinem Datenbanknamen, und die Abfrage funktionierte deswegen nicht (falsche Syntax in der Nähe von '.') Dann wurde mir klar, dass ich eine Klammer für den Namen brauche:

RESTORE DATABASE [My.DB.Name] WITH RECOVERY
5
Ashkan Sirous

In meinem Fall war es ausreichend, dass die Datenbank gelöscht wurde mit dem SQL-Befehl im Status "Wiederherstellen ..." hing 

 drop database <dbname> 

in einem Abfragefenster. 

Dann habe ich mit der rechten Maustaste auf Datenbanken geklickt und Aktualisieren ausgewählt, wodurch der Eintrag in Management Studio entfernt wurde. Danach habe ich eine neue Wiederherstellung durchgeführt, die einwandfrei funktioniert hat (Beachten Sie, dass das Offline-Bringen nicht funktionierte, ein Neustart des SQL-Dienstes nicht funktionierte, ein Neustart des Servers funktionierte nicht).

4
Matt

Standardmäßig wird jeder RESTORE DATABASE mit RECOVERY eingerichtet. Die 'NORECOVERY'-Optionen teilen dem SQL Server im Wesentlichen mit, dass die Datenbank auf weitere Wiederherstellungsdateien wartet (möglicherweise eine DEF -Datei und LOG -Datei. Log-Backup-Datei, falls möglich) ..__: Mit den Optionen 'RECOVERY' werden alle Transaktionen abgeschlossen und die Datenbank kann für die Ausführung von Transaktionen bereit sein.

So: 

  1. wenn Ihre Datenbank mit dem Wiederherstellungsmodell SIMPLE eingerichtet ist, können Sie eine Wiederherstellung mit FULL nur mit der Variable NORECOVERY durchführen, wenn Sie eine Sicherung DIFF haben. In SIMPLE Wiederherstellungsmodelldatenbank ist keine Sicherung LOG zulässig. 
  2. Andernfalls können Sie, wenn Ihre Datenbank mit FULL oder BULK-LOGGED - Wiederherstellungsmodell eingerichtet ist, eine FULL - Wiederherstellung gefolgt von NORECOVERYoption und dann einen DIFF DURCHF&UUML;HREN gefolgt von NORECOVERY und führt schließlich LOG restore mit der Option RECOVERY aus. 

Denken Sie daran, DIE LETZTE WIEDERHERSTELLUNG QUERY MUSS RECOVERY OPTION haben. Es könnte ein expliziter Weg sein oder nicht. In der Thermik von T-SQL ist die Situation: 

  1. USE [master] GO RESTORE DATABASE Database_name FROM DISK = N'\\path_of_backup_file.bak WITH FILE = 1, [REPLACE],NOUNLOAD, RECOVERY -- This option could be omitted. GO 

Die Option WITH REPLACE muss mit Vorsicht verwendet werden, da dies zu Datenverlust führen kann.

Wenn Sie eine FULL- und DIFF-Sicherung durchführen, können Sie diese verwenden

USE [master]
GO
RESTORE DATABASE Database_name
  FROM DISK = N'\\path_of_backup_file.bak' WITH FILE = 1, 
   NOUNLOAD,NORECOVERY
GO
RESTORE DATABASE Database_name
  FROM DISK =N'\\path_of_**diff**backup_file.bak' WITH FILE = 1, 
 NOUNLOAD, RECOVERY
GO
  1. USE [master] GO -- Perform a Tail-Log backup, if possible. BACKUP LOG Database_name GO -- Restoring a FULL backup RESTORE DATABASE Database_name FROM DISK = N'\\path_of_backup_file.bak' WITH FILE = 1, NOUNLOAD,NORECOVERY GO -- Restore the last DIFF backup RESTORE DATABASE Database_name FROM DISK = N'\\path_of_DIFF_backup_file.bak' WITH FILE = 1, NORECOVERY,NOUNLOAD GO -- Restore a Log backup RESTORE LOG Database_name FROM DISK = N'path_of_LOG_backup_file.trn' WITH FILE = 2, RECOVERY, NOUNLOAD GO

Natürlich können Sie eine Wiederherstellung mit der Option STATS = 10 durchführen, die den SQL Server anweist, alle 10% fertig zu stellen. 

Wenn Sie möchten, können Sie den Prozess beobachten oder in einer auf Echtzeit basierenden Abfrage wiederherstellen.

USE[master]
GO
SELECT session_id AS SPID, command, a.text AS Query, start_time, percent_complete, dateadd(second,estimated_completion_time/1000, getdate()) as estimated_completion_time 
    FROM sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) a 
        WHERE r.command in ('BACKUP DATABASE','RESTORE DATABASE')
GO

Ich hoffe das hilft.

3
BMDaemon

Ich hatte dieses Problem, als ich im Ereignisprotokoll auch einen Fehler TCP erhielt. 

Löschen Sie die Datenbank mit SQL oder klicken Sie mit der rechten Maustaste darauf in manager "delete" Und stellen Sie sie wieder her.

Ich habe eigentlich standardmäßig damit angefangen. Erstellen Sie ein Skript für das Löschen der Datenbank, erstellen Sie es neu und stellen Sie es anschließend wieder her.

3
ZeusT

Es kann auch Probleme beim Löschen einer festgefahrenen Datenbank geben, wenn die Momentaufnahme aktiviert ist. Für mich hat das funktioniert:

  1. Zuerst folgte ich Tipu Delacablu Schritte (ein paar Beiträge lesen)
  2. führen Sie den Befehl aus: drop database [Ihre Datenbank]. Dadurch erhalten Sie eine Fehlermeldung, in der Sie den Namen der Snapshot-Datenbank angeben
  3. führen Sie den Befehl aus: drop database [Momentaufnahmedatenbank] und führen Sie dann den Befehl in Schritt 2 erneut aus.
2
Martin

Haben Sie versucht, NUR VERIFY auszuführen? Nur um sicherzugehen, dass es sich um ein solides Backup handelt.

http://msdn.Microsoft.com/de-de/library/ms188902.aspx

1
Sam

Tolle Diskussion. Der häufigste Fehler bei maximalen Benutzern besteht darin, die Datenbank mit der Wiederherstellungsoption mit mehreren Sicherungen wiederherzustellen. Dadurch wird die Datenbank in den Zustand RESTORING versetzt.

Wenn Sie eine Zeitwiederherstellung durchführen, gehen Sie zuerst zur Wiederherstellung mit NoRecovery. Bei der letzten Sicherungsoption müssen Sie Restore mit Recovery verwenden.

Lesen Sie reference1 und reference2 zum Sichern und Wiederherstellen. 

0
Sean Smith

Ich hatte das gleiche Problem ... obwohl ich nicht weiß, warum meine Datenbank dieses Problem hatte, da mein Laufwerk nicht voll war ... Es ist, als wäre es beschädigt worden oder so. Ich habe alle oben genannten Schritte ausprobiert, aber keiner der beiden funktionierte einwandfrei. Ich dachte insbesondere, dass der Vorschlag, den Dienst zu beenden und die MDF- und LDF-Dateien zu löschen, funktionieren würde, aber beim Wiederherstellen erstarrte es trotzdem?

Am Ende habe ich das Problem gelöst, indem ich die Dateien wie erwähnt gelöscht habe, aber anstatt zu versuchen, die Datenbank wieder herzustellen, kopierte ich die neuen .mdf- und .ldf-Dateien und fügte sie mit dem Assistenten für das Frontend-Anhang hinzu. Erleichterung, es hat funktioniert !! 

Es dauerte FOREVER, die neuen Dateien zu kopieren, da ich eine virtuelle Maschine verwende ... also das Kopieren und Einfügen über die Zwischenablage dauerte ungefähr eine Stunde, daher würde ich dies nur als letzten Versuch empfehlen.

0
Anthony Griggs

Ich habe den FallMyDbName (Restore ...)wegen des von SQL Express lizenzierten Limits.

In der Protokolldatei habe ich Folgendes gefunden:

CREATE DATABASE oder ALTER DATABASE fehlgeschlagen, weil die resultierende Die kumulative Datenbankgröße würde Ihr lizenziertes Limit von 10240 MB .__ überschreiten. pro Datenbank.

Wenn Sie also versuchen, eine größere Datenbank wiederherzustellen, müssen Sie Ihren SQL Express-Server auf Developer Edition umstellen zum Beispiel.

0
Dmitry Pavlov

Alle auf WITH RECOVERY basierenden Optionen haben bei mir nicht funktioniert.

Die vollständige Wiederherstellung von Management Studio wurde durchgeführt.

USE [master]
RESTORE DATABASE Sales_SSD
FROM  DISK = N'D:\databaseBackups02\Daily_Sales_20150309_0941.bak' 
WITH  FILE = 1,  
MOVE N'Sales_Data' TO N'C:\Data\SSD\Sales.mdf',  
MOVE N'Sales_Log' TO N'C:\Data\SSD\Sales_1.ldf',  
NOUNLOAD,  REPLACE,  STATS = 5
0
earthling42
  1. Lassen Sie zunächst den SQL Agent-Dienst überprüfen und ausführen.
  2. Verwenden Sie folgendes T-SQL:

    SELECT Dateiname FROM master.sys.sysaltfiles WHERE dbid = DB_ID ('db_name');

  3. T-SQL kontinuierlich verwenden:

    WIEDERHERSTELLEN SIE DATENBANK VON DISK = 'DB_path' WITH

Ich hoffe das hilft!

0
Trung Nguyen
RESTORE DATABASE {DatabaseName}
   FROM DISK = '{databasename}.bak'
   WITH REPLACE, RECOVERY
0
Rony Barua

Was für mich repariert wurde, war 

  1. stoppen der Instanz 
  2. erstellen einer Sicherungskopie der MDF- und LDF-Dateien im Datenordner
  3. Starten Sie die Instanz neu
  4. löschen Sie die Datenbank stecken bei der Wiederherstellung
  5. legen Sie die .mdf- und .ldf-Dateien wieder im Datenordner ab
  6. Hängen Sie die Instanz an die MDF- und LDF-Dateien an
0
ChadJPetersen