Was passiert mit schmutzigen Seiten, wenn das System vor dem nächsten Prüfpunkt ausfällt?

8

Angenommen, eine Datenbank verwendet das vollständige Wiederherstellungsmodell. Wenn ein Datensatz in SQL Server (von INSERT/ UPDATEetc) geschrieben wird, wird durch die Vorausschreibprotokollierung sichergestellt, dass die Änderung in die Protokolldatei geschrieben wird, bevor die Datenseite geändert wird.

Sowohl die Protokoll- als auch die Datenseiteneinträge werden im RAM vorgenommen und später von einem Prüfpunkt auf die Festplatte übertragen.

Wenn es zu einem Systemabsturz kommt (Stromausfall aus Gründen der Argumentation), was mit schmutzigen Seiten passiert (IE-Daten, die im RAM geändert, aber nicht auf die Festplatte übertragen werden), da der Inhalt des RAM den Systemneustart nicht überlebt, gehen diese Daten verloren ?

BEARBEITEN

Nach einigen Tests kann ich feststellen, dass die schmutzigen Seiten nicht verloren gehen, aber ich bin mir nicht sicher, warum:

mit diesem Tutorial

Erstellen Sie eine Testdatenbank

CREATE DATABASE DirtyPagesDB
GO
USE DirtyPagesDB
GO

automatische Kontrollpunkte ausschalten

DBCC TRACEON(3505, -1);
DBCC TRACESTATUS();

Erstellen Sie eine Tabelle, fügen Sie einige Daten ein und geben Sie einen Prüfpunkt aus:

CREATE TABLE t1 (Speaker_Bio CHAR(8000))
GO
INSERT INTO t1 VALUES ('SQL'),('Authority')
GO
CHECKPOINT

Bestätigen Sie keine schmutzigen Seiten

-- Get the rows of dirtied pages
SELECT
database_name = d.name,
OBJECT_NAME =
CASE au.TYPE
WHEN 1 THEN o1.name
WHEN 2 THEN o2.name
WHEN 3 THEN o1.name
END,
OBJECT_ID =
CASE au.TYPE
WHEN 1 THEN p1.OBJECT_ID
WHEN 2 THEN p2.OBJECT_ID
WHEN 3 THEN p1.OBJECT_ID
END,
index_id =
CASE au.TYPE
WHEN 1 THEN p1.index_id
WHEN 2 THEN p2.index_id
WHEN 3 THEN p1.index_id
END,
bd.FILE_ID,
bd.page_id,
bd.page_type,
bd.page_level
FROM sys.dm_os_buffer_descriptors bd
INNER JOIN sys.databases d
ON bd.database_id = d.database_id
INNER JOIN sys.allocation_units au
ON bd.allocation_unit_id = au.allocation_unit_id
LEFT JOIN sys.partitions p1
ON au.container_id = p1.hobt_id
LEFT JOIN sys.partitions p2
ON au.container_id = p2.partition_id
LEFT JOIN sys.objects o1
ON p1.OBJECT_ID = o1.OBJECT_ID
LEFT JOIN sys.objects o2
ON p2.OBJECT_ID = o2.OBJECT_ID
WHERE is_modified = 1
AND d.name = 'DirtyPagesDB'
AND
(
o1.name = 't1'
OR o2.name = 't1'
);
GO

Bestätigen Sie die Zeit des letzten Kontrollpunkts

SELECT  f1.[Checkpoint Begin], f2.[Checkpoint End]
FROM    fn_dblog(NULL, NULL) f1
        JOIN fn_dblog(NULL, NULL) f2
             On f1.[Current LSN] = f2.[Previous LSN]
WHERE   f2.Operation IN (N'LOP_BEGIN_CKPT', N'LOP_END_CKPT');

Fügen Sie weitere Zeilen hinzu

INSERT INTO t1 VALUES ('SQL'),('Authority')

Verwenden Sie die obige Abfrage, um zu bestätigen, dass schmutzige Seiten vorhanden sind

Beenden Sie die SQL Server-Task im Task-Manager, um ein Ausschalten zu simulieren.

Starten Sie den Dienst

Führen Sie den obigen Befehl erneut aus, um die letzte Prüfpunktzeit zu erhalten. Es war dieselbe (dh es wurden keine anderen Prüfpunkte als die manuell ausgeführten ausgeführt).

Aus der Tabelle t1 ausgewählt und alle vier Datensätze waren da

SEarle1986
quelle

Antworten:

15

Sowohl die Protokoll- als auch die Datenseiteneinträge werden im RAM vorgenommen und später von einem Prüfpunkt auf die Festplatte übertragen.

Diese Aussage ist nicht ganz richtig. Es ist richtig, dass Datenseiten von Checkpoint (und Lazy Writer) auf die Festplatte geschrieben werden. Protokolldatensätze werden jedoch physisch auf die Festplatte geschrieben, wenn die Transaktion festgeschrieben wird, um die Dauerhaftigkeit der Transaktion zu gewährleisten. Festgeschriebene Transaktionsdaten sind niemals nur speicherresident (außer bei verzögerter Haltbarkeit).

Alle Datenänderungen werden zuerst in das Protokoll geschrieben ( Write-Ahead-Protokollierung ) und anschließend werden schmutzige Seiten geschrieben. Seiten und Protokolldatensätze können sowohl festgeschriebene als auch nicht festgeschriebene Daten auf der Festplatte enthalten.

Unabhängig vom Wiederherstellungsmodell durchsucht SQL Server das Protokoll während der Wiederherstellung nach einem Absturz bis zum letzten Prüfpunkt, setzt alle Datenänderungen von diesem Punkt an fort und setzt schließlich nicht festgeschriebene Transaktionen zurück.

Dan Guzman
quelle
@ SEarle1986, froh, dass diese Antwort Ihrem Verständnis geholfen hat. In der Dokumentation, auf die ich verwiesen habe, sind die wichtigsten Punkte vergraben, die ich zusammengefasst habe: "SQL Server verfügt über eine Logik, die verhindert, dass eine fehlerhafte Seite gelöscht wird, bevor der zugehörige Protokolldatensatz geschrieben wird. Protokolldatensätze werden beim Festschreiben der Transaktionen auf die Festplatte geschrieben."
Dan Guzman
Bei minimal protokollierten Vorgängen werden die Speicherplatzzuweisungen (Änderungen an IAM-, PFS- und GAM-Strukturen) vorwärts und dann zurückgesetzt, wenn sie nicht festgeschrieben werden, sodass der Vorgang vollständig oder gar nicht ausgeführt wird. Änderungen, die durch Masseneinfügung an Datenseiten vorgenommen wurden, müssen nicht vorwärts gerollt werden, da diese während des Vorgangs physisch geschrieben wurden (was sich von normal protokollierten Vorgängen unterscheidet, bei denen die Datendatei-E / A über Lazywriter und Checkpoint asynchron ist).
Dan Guzman