Auf meiner SQL Server 2012 x64 Std-Instanz hatte ich einen großen Transaktionsfehler, da das Transaktionsprotokoll gestern voll war. Es konnte nicht zurückgesetzt werden und SQL Server hat die spezifische Datenbank neu gestartet, um die Wiederherstellung durchzuführen.
Die Datenbank hat ungefähr 750 GB, wobei der Tlog 170 GB erreicht (sehr großer ETL-Job wurde ausgeführt). Der Job lief nur einige Stunden, aber die Wiederherstellung hat bisher> 24 Stunden gedauert (70% abgeschlossen, in Phase 3 von 3).
Was ich nicht verstehen kann, warum es so lange dauert? Es scheint keinen Druck auf die Festplatten zu geben, sys.dm_exec_requests
zeigt, dass sie warten PAGEIOLATCH_EX/SH
, was ich erwarten würde. Ich hätte in dieser Zeit die gesamte Datenbank wiederherstellen können ...
Wenn jemand Licht ins Dunkel bringen kann, wäre er sehr dankbar.
BEARBEITEN: Wie angefordert, wird die Ausgabe des Fehlerprotokolls abgerufen:
Recovery of database 'MyDB' (6) is 77% complete (approximately 28100 seconds remain). Phase 3 of 3. This is an informational message only. No user action is required.
Recovery of database 'MyDB' (6) is 77% complete (approximately 28095 seconds remain). Phase 3 of 3. This is an informational message only. No user action is required.
Recovery of database 'MyDB' (6) is 77% complete (approximately 28099 seconds remain). Phase 3 of 3. This is an informational message only. No user action is required.
Recovery of database 'MyDB' (6) is 77% complete (approximately 28102 seconds remain). Phase 3 of 3. This is an informational message only. No user action is required.
Recovery of database 'MyDB' (6) is 77% complete (approximately 28097 seconds remain). Phase 3 of 3. This is an informational message only. No user action is required.
Auch die sys.dm_exec_requests
Informationen, nach denen Sie suchen:
session_id command status percent_complete
35 DB STARTUP background 86.06061
IFI und "Volume Maintenance Tasks ausführen" aktiviert / gewährt.
Antworten:
Dies ist nicht ganz korrekt, wenn eine Transaktion in SQL Server gestartet wird. Sie reserviert Speicherplatz im Transaktionsprotokoll, falls die Transaktion zurückgesetzt werden muss. Aus der Transaktionsprotokollarchitektur BOL doc
Sie können es also jetzt verstehen.
Der Abfrage-Rollback-Vorgang kann
mostly single threaded
während der Ausführung derselben Abfrage Parallelität / mehrere Threads verwenden, um denselben Vorgang auszuführen, was ihn im Vergleich zum Rollback sehr schnell macht. Ich schlage vor, Sie lesen, was Bob Dorr über das Rollback zu sagen hat, das lange dauert . Lesen Sie diesen Artikel, um mehr darüber zu erfahren, was während des Rollbacks geschieht . Das Neustarten des SQL Server-Dienstes wird nicht viel helfen, nach dem Neustart musste der Rollbak-Prozess erneut gestartet werden. Sie müssen warten und den Rollback-Vorgang abschließen.Sie können auch sys.dm_exec_requests verwenden, um Ihren Rollback zu verfolgen.
Der andere Grund, den Remus erwähnte, sind zu viele VLFs . Wenn Sie zu viele VLFs haben, kann die Wiederherstellung viel Zeit in Anspruch nehmen. Ein weiterer Faktor, der die Wiederherstellung verzögern kann, ist, wenn kein SQL Server-Dienstkonto vorhanden ist
Perform Volume maintenacce task right or instant file initialization
. Über diesen Link können Sie überprüfen, ob IFI vorhanden ist oder nicht.BEARBEITEN:
Aus der Ausgabe, die Sie gepostet haben
Der Startvorgang wird
86 % complete.
einfach weiter überwacht, schließlich wird er abgeschlossen. Wie bereits erwähnt, kann der Rollback-Prozess blockiert werden und zu Wartezeiten führen. Überwachen Sie dies auch weiterhin.Sie haben eine Standard Edition, die die in der Enterprise Edition vorhandene schnelle Wiederherstellung nicht nutzen kann . Mit der schnellen Wiederherstellung kann die Datenbank nach der zweiten Phase der Wiederherstellung (der Wiederherstellungsphase) online geschaltet werden. Dies ist jedoch immer nicht der Fall. Lesen Sie daher bitte den Artikel. Als zusätzliche Lesung können Sie lesen, wann eine schnelle Wiederherstellung verwendet wird . Die Einschränkung der Standard Edition könnte ein weiterer Grund sein, warum es einige Zeit dauert, bis die Datenbank online ist.
Ja, es kann und Sie können nichts tun, da Sie keine Kontrolle über den Systemprozess haben, da Sie ihn nicht beenden können.
quelle
sys.dm_exec_requests
ist DB_STARTUP.sp_readerrorlog
Befehl ausführen und die für Ihre Datenbank spezifischen Protokolle einsehen? Bitte fügen Sie das der Frage hinzu. Die Protokolle würden mir helfen, Ihnen eine bessere Antwort zu geben.select blocking_session_id from sys.dm_exec_requests where session_id=35
kehrt zurück0
select @@Version