Transaktionsprotokoll im RAM oder in der physischen Datei?

9

Ich bin ein Anfänger in der Transaktion, nur eine Frage im Transaktionsprotokoll. Wir wissen, dass beim Festschreiben einer Transaktion die Änderungen in das Transaktionsprotokoll geschrieben werden. Befindet sich das Transaktionsprotokoll jedoch im RAM oder in physischen Dateien? Wenn es sich im RAM befindet und ein Systemfehler auftritt, wird der RAM offensichtlich erneut gelöscht, sodass wir die Transaktionsinformationen verlieren. Wie können wir also das Commit wiederherstellen?


quelle

Antworten:

15

Eine ziemlich umfassende Anleitung zu dieser Frage finden Sie hier . Zusammenfassend lässt sich sagen, dass SQL Server die Kontrolle nicht an die Anwendung zurückgibt, die eine Transaktion festgeschrieben hat, bis diese Transaktion auf die Festplatte gehärtet wurde. Insbesondere kann die Steuerung zurückgegeben werden, sobald sie in der Transaktionsprotokolldatei gehärtet wurde.

Zu diesem Zeitpunkt werden die Daten möglicherweise nicht in die Datendatei gehärtet, sondern befinden sich möglicherweise noch im Datenpuffer-Cache. Da sie jedoch im Transaktionsprotokoll gehärtet wurden, kann die Datenbankwiederherstellung im Falle eines Fehlers diese wiederherstellen Transaktion und behalten Sie die Änderungen sicher bei.

Im Speicher befindet sich ein Protokollpuffer-Cache, mit dem die Auswirkungen der sequentiellen Schreibvorgänge in Transaktionsprotokolle auf die Leistung verringert werden. Der Puffer wird unter verschiedenen Bedingungen auf die Festplatte geleert, eine davon ist jedoch ein Transaktions-Commit. Bis diese Daten gehärtet wurden, wird die Kontrolle nicht an den Aufrufer zurückgegeben. Selbst wenn Sie während dieser Pufferbereinigung einen Fehler haben, bleibt die Transaktionskonsistenz erhalten, da diese Transaktion noch nicht als festgeschrieben gilt. Sie verlieren die Datenänderungen in dieser Transaktion, aber da sie nicht festgeschrieben wurden, würde Ihre Anwendung diese Änderungen bereits als verloren betrachten, da die Festschreibung nie abgeschlossen wurde.

HandyD
quelle
2
Hier dokumentiert: docs.microsoft.com/en-us/sql/relational-databases/…
David Browne - Microsoft
4

Eine Datenbank besteht aus zwei Dateien, einer Datendatei und einer Transaktionsprotokolldatei. Diese werden auf der Festplatte gespeichert.

Jede Datenbank verfügt über einen Protokollcache im RAM. Wenn eine Transaktion festgeschrieben wird, wird sie in den Protokollcache verschoben und wartet darauf, auf die Festplatte geleert zu werden. Wenn sich eine Transformation festgeschrieben hat und darauf wartet, auf die Festplatte geschrieben zu werden, befindet sie sich daher vorübergehend im Speicher. Letztendlich wird sie jedoch auf der Festplatte in der Datei und nicht im RAM gespeichert.

Ich bin hier zu stark vereinfacht. Ich schlage vor, Sie lesen die Transaktionsprotokolle nach. Ich empfehle hier eine Vorlesung von Paul Randals

https://youtu.be/LvlFgxZZOj4

kevinnwhat
quelle
@ kevinwhat Danke für deine Antwort. Wenn wir also eine Transaktion festschreiben und diese im Protokollcache aktualisiert wird, schlägt das System fehl, bevor der Protokollcache auf die Festplatte geleert wird. Wie können wir also die Transaktion wiederherstellen?
1
@slowjams In diesem Fall werden die von der Transaktion vorgenommenen Änderungen rückgängig gemacht, da sie zum Zeitpunkt des Absturzes auf der Festplatte im Protokoll nicht stabil waren.
Sean Gallardy
3
slowjamsm was du beschreibst passiert nicht. Das Festschreiben ist synchron - es wird erst beendet, wenn alle Protokollaufzeichnungen bis zu diesem Zeitpunkt auf die Festplatte geschrieben wurden ("gehärtet").
Tibor Karaszi
0

Wie von den anderen Personen geschrieben, wird das Transaktionsprotokoll immer auf die Festplatte geschrieben, bevor eine COMMITSteuerung an Ihre Anwendung zurückgegeben wird. Aus diesem Grund sollte die Protokolldatei immer auf einer schnellen SSD abgelegt werden.

Der Vollständigkeit halber: Mit mindestens Windows Server 2016 und SQL Server 2016 können Sie Ihrem Server NVDIMMs (nichtflüchtiges DIMM = Flash oder batteriegepuffertes RAM) hinzufügen. In diesem Fall würde SQL Server diese NVDIMMs verwenden, um das "heiße" Transaktionsprotokollende auf den NVDIMMs zu platzieren, da sie ein Ausschaltereignis pro Definition überleben.

Dies würde die Schreibgeschwindigkeit drastisch erhöhen (da RAM viel schneller ist als selbst eine SSD), aber Sie werden es nur in einer Datenbank mit vielen kleinen Schreib- / Commits erwähnen (z. B. der Datenbank hinter einem geschäftigen Online-Shop oder einem Online-Spiel mit vielen gleichzeitige Spieler).

Thomas Franz
quelle
3
Dies ist keine wirkliche Antwort auf die Frage, sondern ein Stecker für schnellere Festplatten. Protokolle müssen nicht immer schnell gespeichert werden, es gibt viele geschäftliche Gründe dafür, dass sie nicht gespeichert werden. Wenn Sie schnell wollen, kaufen Sie schnell, wenn Sie keine Geschwindigkeit brauchen ...
James Jenkins