Warum dauert die Datenbankwiederherstellung so lange?

7

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_requestszeigt, 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_requestsInformationen, 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.

dwjv
quelle
1
Können Sie nach Abschluss der Wiederherstellung überprüfen, wie viele VLFs Sie haben?
Remus Rusanu
Ich werde es tun, aber ich habe diese erst vor kurzem aussortiert, da es ein so großer Blog ist. Ich glaube, dies wirkt sich ohnehin nur auf Phase 1 der Wiederherstellung aus (ich bin jetzt in Phase 3).
Dwjv
@RemusRusanu wie versprochen: Es gibt 825 VLFs in dieser DB.
Dwjv

Antworten:

7

Ich hatte einen großen Transaktionsfehler, weil 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.

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

Rollback-Vorgänge werden ebenfalls protokolliert. Jede Transaktion reserviert Speicherplatz im Transaktionsprotokoll, um sicherzustellen, dass genügend Protokollspeicherplatz vorhanden ist, um ein Rollback zu unterstützen, das entweder durch eine explizite Rollback-Anweisung oder durch Auftreten eines Fehlers verursacht wird. Die Menge des reservierten Speicherplatzes hängt von den in der Transaktion ausgeführten Vorgängen ab, entspricht jedoch im Allgemeinen der Menge an Speicherplatz, die zum Protokollieren jeder Operation verwendet wird. Dieser reservierte Speicherplatz wird freigegeben, wenn die Transaktion abgeschlossen ist

Sie können es also jetzt verstehen.

Was ich nicht verstehen kann, warum es so lange dauert?

Der Abfrage-Rollback-Vorgang kann mostly single threadedwä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.

select    
session_id,     
command,     
status,     
percent_complete    
from sys.dm_exec_requests    
where command IN ('killed/rollback','rollback','db_startup')

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

session_id  command status  percent_complete
35  DB STARTUP  background  86.06061

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.

2012 x64 Standard SP2

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.

Eine andere Sache, die Rollback-Sitzung (35), blockiert selbst die Ausführung von CHECKPOINT durch einen anderen Systemprozess

Ja, es kann und Sie können nichts tun, da Sie keine Kontrolle über den Systemprozess haben, da Sie ihn nicht beenden können.

Shanky
quelle
Vielen Dank für die Antwort, ich nehme nicht an, dass es einen Unterschied macht, aber die Transaktion wird nicht zurückgesetzt, die Datenbank wird wiederhergestellt (mir ist klar, dass dies die Wiederherstellung ist). Die Sitzung, die ich verfolge, sys.dm_exec_requestsist DB_STARTUP.
Dwjv
Können Sie den sp_readerrorlogBefehl 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.
Shanky
Keine Zeilen. Frage mit angefordertem Fehlerprotokoll aktualisiert.
Dwjv
Auf keinen Fall blockiert. select blocking_session_id from sys.dm_exec_requests where session_id=35kehrt zurück0
dwjv
Aus Neugier haben Sie eine Enterprise- oder Standard-Edition oder eine andere Edition. Was ist outpupt vonselect @@Version
Shanky