Home Unternehmen             Portfolio             Trainingsshop    Kunden & Partner Aktuelles    Kontakt
Home  Pfeil  ORDIX News  Pfeil  3/2009  Pfeil  Datenbanken
suche: 
Dieser Artikel richtet sich an Administratoren von Microsoft SQL Servern sowie an Datenbank-Entwickler, die sich einen Überblick über die hinzugekommenen Funktionalitäten der neuen Version verschaffen möchten.

Glossar

LSN
Log Sequence Number (oder Protokollfolgenummer). Die LSN ist eine für jede Datenbanktransaktion eindeutig und aufsteigend vergebene Nummer.
UNC-Pfad
Uniform Naming Convention (auch Universal Naming Convention) wird weitgehend als Standard zur Bezeichnung von Adressen freigegebener Ressourcen in einem Rechnernetz genutzt. Die UNC-Adresse stellt einen Netzwerkpfad dar, über den man Ressourcen anderer Rechner in dem Netzwerk ansprechen und nutzen kann.
Titelbild


MS SQL Server 2008 New Features (Teil III)

FILESTREAM - Eine performante Speicherung umfangreicher Binärdaten

Große Binärdateien, wie beispielsweise umfangreiche Dokumente, Musik- oder Video-Dateien, werden häufig auf Dateiservern in Verzeichnisstrukturen gespeichert. Diese Speicherart ist übersichtlich und bietet eine gute Performance beim Zugriff auf die Inhalte. Wer jedoch eine Transaktionssteuerung für den konfliktfreien Zugriff auf Daten benötigt, speichert die Inhalte in BLOB-Feldern in einer Datenbank. Hierbei muss jedoch mit Performance-Nachteilen gerechnet werden.

Die neue Option FILESTREAM des SQL Servers 2008 bietet nun die Möglichkeit, beide Technologien miteinander zu kombinieren: Transaktionssteuerung durch Transact-SQL und hohe Performance durch eine Win32-API für den Zugriff auf die im Dateisystem gespeicherten Datenbankinhalte.

Abb. 1: Nachträgliche Aktivierung der FILESTREAM-Option im Konfigurationsmanager.
Abb. 1: Nachträgliche Aktivierung der FILESTREAM-Option im Konfigurationsmanager. Vergrößern
EXEC sp_configure filestream_access_level, 2
RECONFIGURE
Abb. 2: T-SQL-Befehle zur Aktivierung der FILESTREAM-Option.
ALTER DATABASE beispiel
ADD FILEGROUP fs_group CONTAINS FILESTREAM;

ALTER DATABASE beispiel
ADD FILE (NAME = fs_dir, FILENAME = 'c:\db\fs_dir')
TO FILEGROUP fs_group;
Abb. 3: Erweiterung einer vorhandenen Datenbank um eine FILESTREAM-Dateigruppe mit einem FILESTREAM-Verzeichnis.
CREATE TABLE beispiel..dokumente
( id        UNIQUEIDENTIFIER ROWGUIDCOL
, name      VARCHAR(100)
, dokument  VARBINARY(MAX) FILESTREAM
, CONSTRAINT dokumente_pk PRIMARY KEY (id)
) FILESTREAM_ON fs_group;
Abb. 4: Anlegen einer Tabelle mit einer FILESTREAM-Spalte zur Speicherung der Dokumente.
INSERT INTO beispiel..dokumente (id, name, dokument)
VALUES (NEWID(), 'Lebenslauf', 
        CAST('Geboren im schönen Berlin' AS VARBINARY(MAX)));
Abb. 5: Speicherung eines Dokumentes.
Abb. 6: Ablage des Dokumentes im Dateisystem.
Abb. 6: Ablage des Dokumentes im Dateisystem. Vergrößern
Abb. 7: Die Funktion PathName() liefert einen UNC-Pfad zum Dokument für den Zugriff durch die Win32-API.
Abb. 7: Die Funktion PathName() liefert einen UNC-Pfad zum Dokument für den Zugriff durch die Win32-API. Vergrößern

Vorbereitungen

FILESTREAM muss nicht separat installiert, nur aktiviert werden: Entweder direkt bei der Installation oder später im Konfigurationsmanager (siehe Abbildung 1). Zusätzlich ist die Instanz noch mit der Prozedur sp_configure zu konfigurieren (siehe Abbildung 2). Der Parameter bestimmt dabei den Zugriffsmodus:
0 = deaktiviert
1 = nur Transact-SQL-Zugriff
2 = zusätzl. E/A-Streaming-Zugriff (Win32-API)

Einrichtung der Datenbank

Zur Speicherung wird eine spezielle Dateigruppe angelegt. Diese enthält keine Dateien sondern nur Verzeichnisse. In diesen Verzeichnissen werden dann die Inhalte gespeichert und durch den SQL Server verwaltet.

Die angegebenen Verzeichnisse werden vom SQL Server angelegt und konfiguriert. Sie dürfen daher vorher noch nicht existieren (siehe Abbildung 3).

Erstellung einer Tabelle

Um die FILESTREAM-Daten zu verwalten, werden in der Tabelle zwei Spalten benötigt. Zum einen eine Spalte vom Datentyp UNIQUEIDENTIFIER, die mit der Option ROWGUIDCOL angelegt wird und die später im Dateisystem abgelegten Daten eindeutig referenziert. Zum anderen eine Spalte vom Datentyp VARBINARY(MAX), die mit der Option FILESTREAM versehen wird und für den Zugriff auf die Daten mit Transact-SQL dient. Wenn mehrere FILESTREAM-Dateigruppen angelegt wurden, gibt die Tabellen-Option FILESTREAM_ON an, in welcher Dateigruppe und damit in welchem Verzeichnis die Daten abgelegt werden sollen (siehe Abbildung 4).

Zugriff über Transact-SQL

Die Daten können mit normalen SQL-Befehlen bearbeitet werden. Texte (VARCHAR-Daten) müssen dabei mit CAST in den Datentyp VARBINARY konvertiert werden. So legt der in Abbildung 5 angegebene Befehl eine erste Zeile in der Tabelle und damit eine erste Datei im Dateisystem an.

Der SQL Server baut automatisch eine entsprechende Verzeichnisstruktur auf (siehe Abbildung 6). So steht die erste Verzeichnisebene (54f3f625 ...) für die Tabelle und die zweite Verzeichnisebene (01397ed0 ...) für die Spalte. Der Dateiname ist die Log-Sequenz-Nummer (LSN) zum Zeitpunkt der Datenänderung.

Zugriff über die Win32-API

Für den Zugriff über die Win32-API wird ein UNC-Pfad verwendet, der mit der Funktion PathName() ermittelt werden kann (siehe Abbildung 7). Über diesen Pfad kann z. B. mit Hilfe einer C#-Applikation auf die Daten zugegriffen werden. Diese Art des Zugriffs soll hier jedoch nicht weiter erläutert werden. Ein Beispiel finden Sie unter der [2].

Performance-Aspekte

Welche Zugriffsart gewählt werden sollte, hängt von der Datengröße ab. Bis zu BLOB-Größen von etwa einem MB ist der Zugriff über Transact-SQL schneller. Danach ist der Zugriff über die Win32-API wesentlich effizienter. Daher ist es wichtig, dass die Applikation diese Zugriffsart unterstützt, wenn dieser Performance-Vorteil genutzt werden soll.

Sicherheitsaspekte

Die Dateien liegen unverschlüsselt im Dateisystem. Sie sind lediglich geschützt durch die Datei- und Verzeichnisrechte des Betriebssystems. Diese werden vom SQL Server bei der Einrichtung der Verzeichnisse so gesetzt, dass nur das Dienstekonto des SQL Servers sowie die lokalen Administratoren Zugriff haben.

Wichtig ist in diesem Zusammenhang, dass das Löschen von Dateien innerhalb der Verzeichnisse zu einer korrupten Datenbank führen kann.

Arbeiten mit Transaktionen

Im Rahmen von Transaktionen werden die FILESTREAM-Daten genauso wie alle anderen Daten behandelt. Wird der Wert einer FILESTREAM-Spalte geändert, so wird nicht die zugehörige Datei verändert, sondern eine neue Datei mit dem neuen Inhalt angelegt. Zusätzlich werden alle Änderungen im Transaktionsprotokoll vermerkt. Die alte Datei wird erst dann entfernt, wenn ihr Inhalt nicht mehr für Recovery-Zwecke benötigt wird. Dies ist bei der Planung des benötigten Festplattenplatzes zu berücksichtigen.

Fazit

Verwaltet die Applikation große, sich nur selten ändernde Datenmengen, bei denen es auf schnellen Lesezugriff ankommt, z. B. Video-Streaming-Applikationen, so stellt die FILESTREAM-Option eine gute Alternative zur klassischen Speicherung der Daten in BLOB-Feldern dar. Voraussetzung ist allerdings, dass die Applikation die Win32-API verwenden kann.

 

 

 

 

Andreas Jordan (info@ordix.de).