Ab Microsoft SQL Server 2005 ist es möglich Datenbank Snapshots zu erstellen (ab der Enterprise Edition). Durch diese Technologie wird ein Abbild der Quell-Datenbank in eine Datendatei (je nach Menge der enthaltenen Datendateien) geschrieben, womit es möglich ist, die Datenbank abzufragen ohne das Laufende Änderungen aus der eigentlichen Datenbank in das Ergebnis aus dem Snapshpt einfließen. Der Datenbank Snapshot ist schreibgeschützt (verfügt über kein Transaktionsprotokoll) und es können keine Daten- oder Strukturellen Änderungen am Snapshot vorgenommen werden, lediglich Lesende Anweisungen sind zugelassen und es können auch keine Benutzer oder Rollen hinzugefügt werden.
Zur Praxis: Ein Datenbank Snapshot wird folgendermaßen erzeugt:
CREATE DATABASE DBSNAPSHOT ON (name=LOGISCHER_DATEINAME, filename='PHSISCHER_PFAD_UND_DATEINAME') AS SNAPSHOT OF DATENBANK
Durch diesen Befehl wird erstmal ein Container erzeugt in dem keine Datenseiten enthalten sind. Sobald eine Datenseite in der Quell-Datenbank verändert wird, wird diese in den Snapshot rüberkopiert. Das bedeutet, das Abfragen auf den Snapshot auf unveränderte Daten in der Produktiven Datenbanken in die eigentliche Datenbank umgeleitet werden. Sobald Daten verändert worden sind, werden diese Datenseiten aus dem Snapshot gelesen.
Strukturelle Änderungen (DDL) die auf der Produktiven Datenbank vorgenommen werden, werden nicht in den Snapshot übernommen, sondern sind lediglich in der eigentlichen Datenbank enthalten, da diese nicht zum Zeitpunkt des Snapshots existierten.
Besteht eine Datenbank aus meheren Datendateien, müssen diese ebenfalls mit angegeben werden. Es können keine Dateien oder Dateigruppen ausgelassen werden.
Möchte man eine Datenbank wiederherstellen, muss zuerst der Datenbank Snapshot entfernt werden, da ansonsten keine Rücksicherung möglich ist. Das begründet sich durch die Verlinkung der Seiten, da der Snapshot auf die unveränderten Datenseiten der Produktiven Datenbank zurückgreift und der Snapshot sonst inkonsistent wäre. Ein Snapshot wird durch ein einfaches DROP DATABASE entfernt.
Weiter kann man auch aus einem Datenbank Snapshot Datenänderungen zurücknehmen, indem man die Datenbank aus dem Snapshot wiederherstellt:
RESTORE DATABASE DATENBANK FROM DATABASE_SNAPSHOT = 'DBSNAPSHOT'
Dadurch werden alle im Snapshot enthaltenen Datenseiten in die eigentliche Datenbank zurückgeschrieben, bzw. überschrieben.
Wichtig: Wenn man dies auf einer Datenbank macht, die mit einer Transaktionsprotokollsicherung gesichert wird, muss danach eine Vollsicherung durchgeführt werden, da ab diesem Zeitpunkt keine konsistente Vollsicherung mehr vorliegt.
Für das Verwalten/Erstellen/Löschen von Snapshots benötigt man die Server-Sicherheitsrolle „dbcreator“.
Fazit:
Snapshots eigenen sich hervorragend für Auswertungszwecke von Daten aus einem Live System, sofern hier nicht das Motto gilt: „Traue keiner Statistik, die Du nicht selbst gefälscht hast“. :-)
Ansonsten eignet sich dies auch als „kleines Backup“ vor einer größeren Datenänderung.