Wenn eine Transaktion "festgeschrieben" ist, wird sie dann sicher gespeichert?

12

Wenn eine Transaktion erfolgreich festgeschrieben wurde , kann ich dann zu 100% sicher sein, dass sie in die Datenbank UND in die Protokolldateien geschrieben wurde? Kann ich sicher sein, dass die Daten GESPEICHERT sind?

Heute hatten unsere Protokolldateien das Limit des Laufwerks erreicht und wir haben viele Fehler bekommen. Darüber hinaus stürzten einige andere Dienste ab. Wir haben die Festplatte vergrößert und den Server neu gestartet.

Während des Startvorgangs hat der Server eine "Datenbankwiederherstellung" durchgeführt. Kann ich sicher sein, dass alles wieder in Ordnung ist?

SQL-Polizei
quelle
2
Sie können das Fehlerprotokoll nach Abschluss der Wiederherstellung überprüfen, um festzustellen, wie viele Transaktionen festgeschrieben und wie viele zurückgesetzt wurden. Darauf gibt es keine magische Antwort - wenn eine Festplatte abstürzt, hängt alles vom Status der Transaktionen zu diesem Zeitpunkt ab.
Aaron Bertrand
1
@AaronBertrand Wenn sich eine Transaktion jedoch im Status "Festgeschrieben" befindet (dh Festschreiben war erfolgreich), wie kann es dann möglich sein, dass sie während der Wiederherstellung immer noch verloren geht?
SQL Police
3
@ Giosco: Kann es nicht. "Festgeschrieben" bedeutet, dass es sich in der Protokolldatei der Datenbank befindet. Die einzige Möglichkeit, es danach zu verlieren, besteht darin, entweder 1) die Protokolldatei zu verlieren, bevor sie ebenfalls in der Datendatei gespeichert wird, oder 2) sowohl die Protokolldatei als auch die Datendatei zu verlieren, oder 3) menschliches Versagen. Beachten Sie, dass (3) normalerweise am wahrscheinlichsten ist.
RBarryYoung
2
@ Giosco, woher wissen Sie, dass alle Ihre Transaktionen zum Zeitpunkt des vollständigen Laufwerks erfolgreich festgeschrieben wurden?
Aaron Bertrand
2
Gespeicherte Prozedur <> -Transaktion - Ihre gespeicherte Prozedur kann mehrere explizite Transaktionen enthalten oder nur implizit. Möglicherweise gibt es eine Try / Catch-Logik, eine Transaktionsbehandlung auf der C # -Schicht usw. usw. Wiederum unter der Annahme, dass keine Ausnahme = erfolgreiches Festschreiben vorliegt könnte als pauschale Aussage ein wenig zu gefährlich sein.
Aaron Bertrand

Antworten:

16

Wenn eine Clientanwendung ein COMMIT ausgegeben und einen Erfolgscode zurückerhalten hat, garantiert die Engine, dass die Transaktion dauerhaft ist. Es ist garantiert, dass alle in einer Transaktion vorgenommenen Änderungen auch nach einem Absturz sichtbar sind. Darüber hinaus garantiert die Wiederherstellung, dass jede nicht festgeschriebene Transaktion im Falle eines Absturzes zurückgesetzt wird.

Für mehr Details empfehle ich die Lektüre des ARIES Papers.

Write-Ahead-Protokollierung und Wiederherstellung können keine Garantie übernehmen, wenn die zugrunde liegende Speicherhardware fehlerhaft ist (Beschädigung). Und jedes technische Produkt kann Defekte enthalten.

Ihre Anwendung muss wie alle anderen Anwendungen sorgfältig geschrieben werden, damit sie sich bei Abstürzen (Fehlern) korrekt verhält. Es gibt keine Magie.

Remus Rusanu
quelle
Wenn eine Clientanwendung ein COMMIT ausgegeben hat, aber bis zum Timeout auf der Clientseite keine Antwort von der Datenbank empfangen wird. Was ist mit diesem Commit? Erfolg oder Misserfolg? Wie zu überprüfen?
Gab 是 好人