Dienstag, 21. Juni 2011

Was ist Datenbankdatei-Initialisierung?

Wenn Sie große Datenbanken administrieren, haben Sie sicherlich schon mehr als einmal auf den SQL Server gewartet, zum Beispiel beim
  • Erstellen von Datenbanken
  • Vergrößern von Datendateien
  • Hinzufügen neuer Datendateien
  • Wiederherstellen einer Datenbank aus einem Backup
Es gibt ein recht unbekanntes Feature, mit dem Sie diese Wartezeiten deutlich verkürzen können. Dieses hat den Namen Sofortige Dateiinitialisierung (Instant File Initialization). Um einen Eindruck von der Beschleunigung zu bekommen, habe ich auf meinem Notebook eine 20GB große Datenbank angelegt. Hier die Zeiten:
  • ohne sofortige Dateiinitialisierung: 2:10 Minuten
  • mit sofortiger Dateiinitialisierung: 0:02 Minuten
Wie funktioniert es?
Normalerweise füllt SQL Server eine neue Daten- oder Transaktionsprotokoll-Datei direkt nach der Erstellung mit "0"-Werten. Wenn sofortige Dateiinitialisierung aktiviert ist, dann werden bei Datendateien keine "0"-Werte geschrieben (bei Transaktionsprotokoll-Dateien wird das in jedem Fall gemacht). Eigentlich wird die Datendatei also nicht initialisiert, wenn sofortige Dateiinitialisierung aktiv ist - aber die Namensgebung ist nun einmal so.

Wie wird es aktiviert?
Der Grund, warum dieses Feature so wenig bekannt ist, ist wahrscheinlich darin begründet, dass es nicht eine Option des SQL Servers ist, sondern dass es von den Berechtigungen des SQL Server Dienstkontos abhängig ist. Um die Berechtigung zu erteilen, starten Sie das Programm secpol.msc.
Hier wählen Sie unter "Sicherheitseinstellungen" - "Zuweisen von Benutzerrechten" - "Durchführen von Volumenverwaltungsaufgaben" und fügen im nachfolgenden Dialog das Benutzerkonto, mit dem der SQL Server Dienst ausgeführt wird, hinzu.
Falls das Konto bereits Mitglied der lokalen Administratoren-Gruppe ist, dann ist dieser Schritt nicht erforderlich, denn diese Windows Gruppe hat bereits diese Berechtigung. Aber mal ehrlich: so etwas haben Sie doch nicht gemacht, oder? Um SQL Server sicher zu betreiben, ist es äußerst wichtig, dass er mit einem Dienstkonto ausgeführt wird, das minimale Berechtigungen hat. Und die Mitgliedschaft in der Gruppe lokaler Administratoren ist ziemlich genau das Gegenteil von minimalen Rechten ;-)
Erstellen Sie also für jede SQL Server Instanz ein eigenes neues Benutzerkonto (Domänenkonto oder lokales Konto) und nutzen Sie dann das Programm SQL Server Configuration Manager, um dieses Konto dem SQL Server Dienst zuzuweisen.
Der Configuration Manager sorgt dafür, dass das SQL Server Dienstkonto mit allen erforderlichen Berechtigungen ausgestattet wird (Zugriff auf Registry Einträge, Zugriff auf Dateien, etc.). Es ist also ganz einfach, ein Dienstkonto mit minimalen Berechtigungen auszustatten.

Wo ist der Haken?
Für jeden Vorteil müssen wir bezahlen. Beim SQL Server bezahlen wir in der Regel entweder mit Geld (Hardware, Lizenzen) oder indem wir Nachteile an anderer Stelle in Kauf nehmen. In diesem Fall ist der Preis eine verringerte Sicherheit. Dadurch, dass die Datendatei nicht initialisiert wird, enthält sie die Inhalte der Festplatte, die vorher dort gespeichert waren. Diese Inhalte kann man sich anschauen:
  • mit DBCC PAGE (undokumentierte Option) bei laufender Datenbank
  • mit einem Dateieditor, nachdem die Datendatei abgehängt wurde
  • in der Datensicherung
Ist das für Ihre SQL Server Instanz ein Problem? Das müssen Sie entscheiden. Ich denke, dass dies in den allermeisten Fällen akzeptabel ist, da Sie ja sowieso dafür sorgen, dass Datendateien und Backups nicht in falsche Hände gelangen können.

Links
Hier habe ich die Informationen für diesen Beitrag gefunden:
http://msdn.microsoft.com/de-de/library/ms175935.aspx
http://www.sqlskills.com/blogs/kimberly/post/Instant-Initialization-What-Why-and-How.aspx
http://www.brentozar.com/sql/blitz-minute-sql-server-takeovers/