Beschleunigte Datenbank Wiederherstellung (ADR) mit SQL Server 2019

Mit dem SQL Server 2019 wurde von Microsoft ein neues Feature mit dem Namen ADR (Accelerated Database Recovery) vorgestellt. Eigentlich handelt es sich dabei nicht um ein neues Feature, sonder viel mehr um die Überarbeitung der Wiederherstellungs-Mechanismen, wie man sie aus den Vorgängerversionen kennt.

Eine neue Komponente mit dem Namen Persistenter Versionsspeicher (PVS) wird benutzt, um Zeilen nach Änderungen über einen längeren Zeitraum noch verfügbar zu machen. In Verbindung mit sog. logischer Wiederherstellung kann so die Transaktionsverarbeitung erheblich beschleunigt werden. Zusätzlich sorgt ein neuer sLog (eng. secondary log stream, also ein sekundärer Protokolldatenstrom) dafür, dass Wartezeiten im Prozess der Transaktionsverarbeitung verkürzt werden.

Mit Hilfe dieses neuen Aufbaus gelingt es Microsoft die Wiederherstellung erheblich zu verbessern. Sowohl für einzelne Datenbanken, als auch Pooldatenbanken – egal ob on-premise oder in der Cloud.
Nach eigener Aussage ist diese Überarbeitung vor allem sehr interessant für Kunden

  • die über eine Arbeitsbelastung mit zeitintensiven Transaktionen verfügen,
  • bei denen aktive Transaktionen in manchen Fällen dazu führen, dass die Transaktionsprotokolle sehr groß werden, oder
  • bei denen es vorkommt, dass die Datenbank über einen längeren Zeitraum nicht verfügbar war, da die Wiederherstellung zu lange gedauert hat (wie beispielsweise bei einem unerwarteten Neustart des Servers oder einem manuellen Transaktionsrollback).

Der Beitrag von Microsoft bezüglich ADR ist hier zu finden.

Wiederherstellungsprozess

Im folgenden möchten wir den Ablauf des neuen Mechanismus weiter durchleuchten:

Der Ablauf beginnt mit der Analyse. Diese Phase ist der ersten Phase im alten Mechanismus sehr ähnlich, mit dem kleinen Unterschied, dass zusätzlich der sLog wiederhergestellt wird.

In der Zeiten Phase kann nun der zuvor wiederhergestellte sLog dafür genutzt werden, den Log-Bereich von der ältesten unverarbeiteten Transaktion bis zum letzten Checkpoint zu verarbeiten. Der tLog (Transaktions-Protokolldatenstrom) wird nur für den Bereich vom letzten Checkpoint bis zum Ende des Logs benutzt.

In der letzten Phase kann nun mit Hilfe des sLog rückwirkend alle Änderungen verarbeitet werden. Dabei beschränkt sich der Bereich in dem der tatsächliche Transaktions-Log verarbeitet werden muss auf ein Minimum (im Diagramm der rot hinterlegte Balken).

ADR im Test

Die tatsächliche Auswirkung des ADR wird bereits in einem kleinen, trivialen Test deutlich, wie beispielsweise in diesem Artikel von mssqltips.com beschrieben.

In dem Artikel werden zum Test zwei Datenbanken erzeugt:


CREATE DATABASE AlteWiederherstellung; 
GO 
CREATE DATABASE NeueWiederherstellung; 
ALTER DATABASE NeueWiederherstellung SET ACCELERATED_DATABASE_RECOVERY = ON; 
GO

Als nächstes wird in zwei unterschiedlichen Abfragefenstern eine zeitaufwendige Abfrage ausgeführt. Diese Abfrage wartet auf das erreichen einer bestimmten Uhrzeit, bevor sie ausgeführt wird. Diese muss angepasst werden.

WAITFOR TIME '13:45:00';
USE AlteWiederherstellung;
GO
DROP TABLE IF EXISTS dbo.fl1, dbo.fl2, dbo.fl3;
SELECT s2.* INTO dbo.fl1 FROM sys.all_columns AS s1 CROSS JOIN sys.all_objects AS s2;
SELECT s2.* INTO dbo.fl2 FROM sys.all_columns AS s1 CROSS JOIN sys.all_objects AS s2;
SELECT s2.* INTO dbo.fl3 FROM sys.all_columns AS s1 CROSS JOIN sys.all_objects AS s2;
WAITFOR TIME '13:45:00';
USE NeueWiederherstellung;
GO
DROP TABLE IF EXISTS dbo.fl1, dbo.fl2, dbo.fl3;
SELECT s2.* INTO dbo.fl1 FROM sys.all_columns AS s1 CROSS JOIN sys.all_objects AS s2;
SELECT s2.* INTO dbo.fl2 FROM sys.all_columns AS s1 CROSS JOIN sys.all_objects AS s2;
SELECT s2.* INTO dbo.fl3 FROM sys.all_columns AS s1 CROSS JOIN sys.all_objects AS s2;

In einem dritten Abfragefenster muss ein SHUTDOWN provoziert werden, um eine Unterbrechung der beiden zuvor ausgeführten Abfragen zu erzwingen und damit eine Wiederherstellung hervorzurufen.

WAITFOR DELAY '00:02:30';
SHUTDOWN WITH NOWAIT;

Nachdem alle Abfragen ausgeführt wurden, kann mit Hilfe des Configuration Managers der SQL Server erneut gestartet werden. Im error-log sind die Unterschiede bereits deutlich zu erkennen:

Die Wiederherstellung der Datenbank AlteWiederherstellung hat insgesamt 23 Sekunden gedauert. Davon wurden 8507 ms in der Analyse verbracht, 9623 ms im redo und abschließend 3776 ms im undo. Im Vergleich dazu dauerte die Wiederherstellung der Datenbank NeueWiederherstellung gerade einmal 5 Sekunden, wovon 2537 ms in der Analyse, 1146 ms im redo und lediglich 87 ms im undo verbracht wurden. Und auch in der Dateigröße lässt sich ein deutlicher Unterschied zwischen den beiden Datenbanken feststellen: Die Log-Datei der Datenbank NeueWiederherstellung benötigt nur ein Viertel des Speichers der Log-Datei der Datenbank AlteWiederherstellung. Dafür ist die tatsächliche Datenbank-Datei (.mdf) rund ein Viertel Größer.

Abschluss

Wie bereits oben beschrieben handelt es sich bei dem zuvor durchgeführten Testen um keine besonders aussagekräftige Umgebung um die Auswirkung von ADR in einem “realistischen” Szenario beurteilen zu können. Doch bereits jetzt wird deutlich, dass Microsoft eine enorme Verbesserung im Vergleich zu den alten Mechanismen gelungen ist, was in Zukunft das Arbeiten mit dem SQL Server konsistenter und angenehmer gestalten wird.

Schreibe einen Kommentar