MDF- und LDF-Inhalte in SQL Server

8

Angenommen, ich habe eine Datenbank mit einer Single .mdfund einer .ldfDatei.

Die Datenbank ist getrennt, es gibt keine Transaktionen und SQL Server wird gestoppt.

Ich gehe davon aus, dass alle Daten bereits in der .mdfDatei sind?

Die .ldfDatei ist im Wesentlichen leer? Wenn die .ldfDatei nicht leer ist, was enthält sie?

Wenn ich die .ldfDatei lösche und manuell eine neue 0 Byte lange .ldfDatei mit demselben Namen wie zuvor erstelle , kann ich die Datenbank ohne Datenverlust erneut anhängen?

Eduard
quelle
Ich bin mir nicht sicher, warum es abgelehnt wurde ... Könnten Sie einen Kommentar abgeben? Vielleicht kann ich dann die Frage wiederholen
Probieren Sie aus, was Sie vorgeschlagen haben (Löschen der .ldfProtokolldatei und Erstellen einer neuen), und sehen Sie, was passiert. Wenn Sie das getan haben, kommen Sie bitte zurück, teilen Sie uns mit, was Sie gefunden haben, und markieren Sie oder @ antworten Sie mir. Vielen Dank.
Kev
Diese Frage kann helfen: stackoverflow.com/questions/5801675/…
EJ Brennan
Was versuchst du zu erreichen oder bist du nur neugierig, was passieren wird?
Jon Seigel
Ich bin gespannt, was passieren wird und vor allem möchte ich ein Gefühl dafür haben, was es enthalten könnte. Ich hatte keine tiefen Kenntnisse über Datenbanken, aber wenn LDF nur Transaktionsinformationen enthält, wenn der Datenbankserver gestoppt und die Datenbank getrennt wird, sehe ich keinen Grund dafür, dass die ldf-Datei überhaupt etwas enthält.
Eduard

Antworten:

6

(Haftungsausschluss für Peeps, die von Google einfliegen: Ich empfehle nicht , die in dieser Frage beschriebene Methode zu verwenden, um Speicherplatz für Protokolldateien zurückzugewinnen. Verwenden Sie DBCC SHRINKFILEstattdessen.)

Ich gehe davon aus, dass sich alle Daten bereits in der MDF-Datei befinden.

Ja, durch das Trennen wird ein CHECKPOINTin der Datenbank initiiert , sodass alle fehlerhaften Datenseiten auf die Festplatte gelangen.

Eine Datenbank kann nicht getrennt werden , wenn das Transaktionsprotokoll von einem anderen Prozess benötigt wird (Spiegelung, Replikation usw.) oder wenn kein exklusiver Zugriff möglich ist (alle offenen Transaktionen in der Datenbank müssen festgeschrieben oder zurückgesetzt werden). Daher enthält das Protokoll niemals Transaktionen während des Flugs, wie Sie möglicherweise sehen, wenn die Stromversorgung plötzlich ausgeschaltet wird (dh ein Absturz).

Die .ldf-Datei ist im Wesentlichen leer? Wenn die .ldf-Datei nicht leer ist, was enthält sie?

  • SIMPLEWiederherstellung: Die Protokolldatei enthält die Protokolldatensätze, die die Ereignisse beschreiben CHECKPOINT, die vor dem Herunterfahren der Datenbank aufgetreten sind. (A CHECKPOINTlöscht auch das Protokoll in diesem Modus.)

  • BULK_LOGGEDund FULLWiederherstellung: Die Protokolldatei enthält alle Protokolldatensätze, die noch nicht gelöscht wurden. (Der einzige Prozess, der das Protokoll in diesem Modus löscht, ist eine Protokollsicherung.)

Tipp: Protokolldatensätze in der Protokolldatei können mit dem undokumentierten TVF überprüft werden sys.fn_dblog.

Wenn ich die .ldf-Datei lösche und manuell eine neue .ldf lange .ldf-Datei mit demselben Namen wie zuvor erstelle, kann ich die Datenbank ohne Datenverlust erneut anhängen?

Dadurch werden die Datei-Header-Informationen zerstört und die Protokolldatei beschädigt.

Damit die Datenbank angehängt werden kann, müssen Sie die Protokolldatei entfernen / umbenennen und die Datenbank anhängen ATTACH_REBUILD_LOG, damit SQL Server am Standardspeicherort eine neue Protokolldatei von Grund auf neu erstellt.

Vorausgesetzt, Sie haben das getan,

  • Bei der SIMPLEWiederherstellung gehen keine Benutzerdaten verloren, da nur relativ unwichtige CHECKPOINTProtokolldatensätze verschwunden sind .

  • In den anderen Wiederherstellungsmodellen würde dies die Protokollsicherungskette unterbrechen, und offensichtlich konnten alle gelöschten Protokolldatensätze nicht mehr gesichert werden (und waren wahrscheinlich noch nicht gesichert). Dies hat offensichtliche Auswirkungen, falls die Datenbank wiederhergestellt werden muss.

Also ... technisch gesehen, nein, es würde keinen unmittelbaren Datenverlust geben. Diese Methode ist jedoch sicherlich keine gute Praxis, insbesondere in einem anderen Wiederherstellungsmodell als SIMPLE.

Jon Seigel
quelle
Vielen Dank. Ich müsste weitere Informationen zu CHECKPOINT und Backups lesen. Wenn bei der vollständigen Wiederherstellung ein CHECKPOINT auftritt, werden die Daten auch in der MDF-Datei gespeichert? Bei einer vollständigen Sicherung entspricht die .bak-Datei nur der MDF-Datei? Eine Protokollsicherung im SIMPLE-Wiederherstellungsmodell hat keinen Sinn, oder?
Eduard
@Eduard: Schreibt CHECKPOINTimmer schmutzige Datenseiten auf die Festplatte, unabhängig vom Wiederherstellungsmodell. Bei der SIMPLEWiederherstellung CHECKPOINTlöscht a auch das Protokoll. Eine vollständige Sicherung enthält alle Datenbereiche und den erforderlichen Teil des Protokolls, um die Daten in der Sicherung zum Zeitpunkt des Abschlusses des Datenleseteils (alle Wiederherstellungsmodelle) transaktionskonsistent zu machen. Richtig, eine Protokollsicherung bei der SIMPLEWiederherstellung ist nicht möglich.
Jon Seigel
3

Wenn LDF nur Transaktionsinformationen enthält, wenn der Datenbankserver gestoppt und die Datenbank getrennt wird, sehe ich keinen Grund dafür, dass die ldf-Datei überhaupt etwas enthält.

Es hört sich so an, als ob Ihnen die Bedeutung historischer Transaktionsprotokolle fehlt.

Das Transaktionsprotokoll enthält genügend Informationen, um alle Änderungen rückgängig zu machen, die im Rahmen einer einzelnen Transaktion an der Datendatei vorgenommen wurden.

Wenn Sie einen Datensatz mit dem Wert X haben, der auf den Wert Y geändert wird, wird diese Änderung im Transaktionsprotokoll aufgezeichnet. Wenn Sie einfach Ihre Datendatei sichern und die Protokolle leeren, haben Sie den ursprünglichen Wert von X für immer verloren, da jetzt nur noch ein Datensatz von Y vorhanden ist. In der Transaktionsprotokolldatei können Sie diese Änderung bei Bedarf zurücksetzen.

Das Transaktionsprotokoll ist eine Aufzeichnung darüber, wie Sie den aktuellen Inhalt der Datendatei erstellt haben, und ermöglicht Ihnen das Zurücksetzen auf einen beliebigen Zeitpunkt und nicht nur auf die spezifischen Intervalle, in denen Sie Ihre Datendatei gesichert haben.

Es gibt Fälle, in denen dies wichtig ist. Zum Beispiel Transaktionsdatenbanken, die eine E-Commerce-Site betreiben. Möglicherweise möchten Sie Sicherungen des Transaktionsprotokolls beibehalten, auch wenn Sie die tatsächlichen Datendateien gesichert haben.

Es gibt Fälle, in denen dies nicht so wichtig ist, z. B. Staging-Tabellen für ein Data Warehouse, in denen die "Rohdaten" einfach aus der Quelle geladen werden können, um neu zu beginnen.

Matt
quelle
Danke Matt. Jetzt denke ich, dass ich den Sinn habe, FULL (oder BULK_LOGGED) als Wiederherstellungsmodell zu verwenden! Es ermöglicht nicht nur "kleine" Dateisicherungen (die Protokollsicherungsdateien), der Hauptpunkt ist, dass Sie zu jedem Zeitpunkt zurückspulen können! Sie haben also eine vollständige überprüfbare Datenbank. Mit SIMPLE erhalten Sie nur das, was Sie in der Sicherung gespeichert haben, genau zum Zeitpunkt der Ausführung der Sicherung.
Eduard
0

Die .LDF-Datei muss nicht unbedingt leer sein. Abhängig von mehreren Faktoren (einschließlich des Wiederherstellungsmodells Ihrer Datenbank, des Prüfpunktintervalls, unabhängig davon, ob Optionen wie Replikation oder CDC aktiviert sind) kann es durchaus Transaktionen in Ihrem Protokoll geben, die entweder angewendet oder zurückgesetzt werden müssen.

Sie könnten sicherlich das tun, was Sie verlangen, und die LDF-Datei löschen. Sie haben jedoch die Möglichkeit, die Transaktion zu verlieren oder eine beschädigte Datenbank zu erhalten. Tun Sie dies also auf eigenes Risiko.

Nic
quelle
Wenn der Datenbankserver gestoppt und die Datenbankdateien freigegeben werden, kann die LDF immer noch nicht abgeschlossene Transaktionen enthalten?
Eduard
Entschuldigung, ich sollte hinzufügen, dass ich über das einfache Wiederherstellungsmodell nachdenke. Entschuldigung
Eduard
Sogar in der einfachen Wiederherstellung könnten Sie in Flugtransaktionen haben, die Dinge beeinflussen würden (oder wie ich Replikation / CDC usw. erwähnte)
Nic