Freigeben über


Übersicht über FILESTREAM

Ein Großteil der Daten, die täglich erstellt werden, ist unstrukturiert, z. B. Textdokumente, Bilder und Videos. Diese unstrukturierten Daten werden oft außerhalb der Datenbank, getrennt von den strukturierten Daten gespeichert. Diese Trennung kann die Datenverwaltung erschweren. Wenn die Daten mit dem strukturierten Speicher verknüpft sind, können dadurch die Dateistreamingfunktionen und die Leistung beeinträchtigt werden.

FILESTREAM integriert SQL Server Database Engine (Datenbankmodul) in ein NTFS-Dateisystem, indem BLOB (Binary Large Object)-Daten vom Typ varbinary(max) im Dateisystem gespeichert werden. Mit Transact-SQL-Anweisungen können FILESTREAM-Daten eingefügt, aktualisiert, abgefragt, durchsucht und gesichert werden. Die Win32-Dateisystemschnittstellen stellen Streamingzugriff auf die Daten bereit.

FILESTREAM verwendet den NT-Systemcache zum Zwischenspeichern von Dateidaten. Dies wirkt allen negativen Auswirkungen entgegen, die FILESTREAM-Daten auf die Database Engine (Datenbankmodul)-Leistung haben könnten. Der SQL Server-Pufferpool wird nicht verwendet, deshalb steht dieser Arbeitsspeicher für die Anfragebearbeitung zur Verfügung.

HinweisHinweis

FILESTREAM-Daten werden nicht verschlüsselt, auch dann nicht, wenn die transparente Datenverschlüsselung aktiviert ist.

Eine exemplarische Vorgehensweise, die zeigt, wie FILESTREAM verwendet wird, finden Sie unter Erste Schritte mit FILESTREAM-Speicherung.

Verwendungsbereiche von FILESTREAM

In SQL Server kann es sich bei BLOBs um Standarddaten des Typs varbinary(max) handeln, die in Tabellen gespeichert werden, oder um FILESTREAM-Objekte des Typs varbinary(max), deren Daten im Dateisystem gespeichert werden. Größe und Verwendung der Daten bestimmen, ob Sie sie in einer Datenbank oder im Dateisystem speichern sollten. Wenn die folgenden Bedingungen zutreffen, sollten Sie die Verwendung von FILESTREAM in Betracht ziehen:

  • Die Objekte, die gespeichert werden, sind im Durchschnitt größer als 1 MB.

  • Schneller Lesezugriff ist wichtig.

  • Sie entwickeln Anwendungen, die eine mittlere Ebene für die Anwendungslogik nutzen.

Bei kleineren Objekte ist die Streamingleistung oft besser, wenn varbinary(max)-BLOBs in der Datenbank gespeichert werden.

FILESTREAM-Speicherung

Die FILESTREAM-Speicherung wird als varbinary(max)-Spalte implementiert, deren Daten als BLOBs im Dateisystem gespeichert werden. Die Größe der BLOBs wird nur durch die Volumegröße des Dateisystems beschränkt. Die für varbinary(max) definierte Standarddateigrößenbeschränkung von 2 GB gilt nicht für BLOBs, die im Dateisystem gespeichert werden.

Um anzugeben, dass die Daten einer Spalte im Dateisystem gespeichert werden sollten, geben Sie das FILESTREAM-Attribut für eine varbinary(max)-Spalte an. Dies bewirkt, dass Database Engine (Datenbankmodul) alle Daten der betreffenden Spalte im Dateisystem, aber nicht in der Datenbankdatei speichert..

FILESTREAM-Daten müssen in FILESTREAM-Dateigruppen gespeichert werden. Eine FILESTREAM-Dateigruppe ist eine besondere Dateigruppe, die Dateisystemverzeichnisse statt der Dateien selbst enthält. Diese Dateisystemverzeichnisse werden als Datencontainer bezeichnet. Datencontainer bilden die Schnittstelle zwischen der Database Engine (Datenbankmodul)-Speicherung und der Dateisystemspeicherung.

Bei Verwendung von FILESTREAM sind die folgenden Punkte zu beachten:

  • Wenn eine Tabelle eine FILESTREAM-Spalte enthält, muss jede Zeile über eine eindeutige Zeilen-ID, die nicht NULL ist, verfügen.

  • FILESTREAM-Datencontainer können nicht geschachtelt werden.

  • Wenn Sie Failoverclustering verwenden, müssen sich die FILESTREAM-Dateigruppen auf freigegebenen Datenträgerressourcen befinden.

  • FILESTREAM-Dateigruppen können auf komprimierten Volumes erstellt werden.

Integrierte Sicherheit

In SQL Server werden FILESTREAM-Daten wie alle anderen Daten geschützt: indem Berechtigungen auf der Tabellen- oder Spaltenebene gewährt werden. Wenn ein Benutzer über Berechtigungen zum Öffnen der FILESTREAM-Spalte einer Tabelle verfügt, dann er die zugehörigen Dateien öffnen.

HinweisHinweis

FILESTREAM-Daten können nicht verschlüsselt werden.

Nur das Konto, unter dem das SQL Server-Dienstkonto ausgeführt wird, erhält NTFS-Berechtigungen für den FILESTREAM-Container. Wir empfehlen, dass keinem anderen Konto Berechtigungen für den Datencontainer gewährt werden.

Integrierte Verwaltung

Weil FILESTREAM als varbinary(max)-Spalte implementiert und direkt in Database Engine (Datenbankmodul) integriert ist, können die SQL Server-Verwaltungstools und -Funktionen für FILESTREAM-Daten eingesetzt werden, ohne in irgendeiner Weise geändert werden zu müssen. Beispielsweise können Sie alle Sicherungs- und Wiederherstellungsmodelle mit FILESTREAM-Daten verwenden, und die FILESTREAM-Daten werden zusammen mit den strukturierten Daten in der Datenbank gesichert. Wenn Sie die FILESTREAM-Daten nicht zusammen mit relationalen Daten sichern möchten, können Sie eine Teilsicherung durchführen, um die FILESTREAM-Dateigruppen auszuschließen.

Duales Programmiermodell für den Zugriff auf BLOB-Daten

Nachdem Daten in einer FILESTREAM-Spalte gespeichert wurden, können Sie über Transact-SQL-Transaktionen oder mithilfe von Win32-APIs auf die Dateien zugreifen.

Zugriff über Transact-SQL

Mit Transact-SQL können Sie FILESTREAM-Daten einfügen, aktualisieren und löschen:

  • Mit einem Einfügevorgang können Sie ein FILESTREAM-Feld vorab mit einem Nullwert, einem leeren Wert oder relativ kurzen Inlinedaten füllen. Große Datenmengen lassen sich jedoch effizienter in eine Datei streamen, wenn Win32-Schnittstellen verwendet werden.

  • Wenn Sie ein FILESTREAM-Feld aktualisieren, ändern Sie die zugrunde liegenden BLOB-Daten im Dateisystem. Wenn ein FILESTREAM-Feld auf NULL festgelegt wird, werden die dem Feld zugeordneten BLOB-Daten gelöscht. Eine segmentierte Aktualisierung in Transact-SQL, die als UPDATE**.**Write() implementiert wird, kann nicht zur teilweisen Aktualisierung der Daten eingesetzt werden.

  • Wenn Sie eine Zeile löschen oder eine Tabelle, die FILESTREAM-Daten enthält, löschen oder abschneiden, löschen Sie auch die zugrunde liegenden BLOB-Daten im Dateisystem.

Dateisystem-Streamingzugriff

Die Win32-Streamingunterstützung funktioniert im Kontext von SQL Server-Transaktionen. Im Rahmen einer Transaktion können Sie mithilfe von FILESTREAM-Funktionen, einen logischen UNC-Pfad für eine Datei ermitteln. Sie verwenden dann die OpenSqlFilestream-API, um ein Dateihandle zu erhalten. Dieses Handle kann dann von Win32-Dateistreamingschnittstellen, wie ReadFile() und WriteFile(), verwendet werden, um über das Dateisystem auf die Datei zuzugreifen und diese zu aktualisieren.

Weil Dateivorgänge transaktionsgebunden sind, können Sie FILESTREAM-Dateien nicht über das Dateisystem löschen oder umbenennen.

Anweisungsmodell

Der FILESTREAM Dateisystemzugriff modelliert eine Transact-SQL-Anweisung, indem die Datei geöffnet und geschlossen wird. Die Anweisung beginnt, wenn ein Dateihandle geöffnet wird, und endet, wenn das Handle geschlossen wird. Wenn beispielsweise ein Handle zum Schreiben geschlossen wird, dann wird ein möglicherweise für die Tabelle registrierter AFTER-Trigger so ausgelöst, als wäre eine UPDATE-Anweisung abgeschlossen worden.

Storage Namespace

Bei FILESTREAM wird der BLOB-physische Dateisystemnamespace für BLOB von Database Engine (Datenbankmodul) gesteuert. Eine neue intrinsische Funktion namens PathName liefert den logischen UNC-Pfads des BLOBs, das mit jeder einzelnen FILESTREAM-Zelle der Tabelle verknüpft ist. Die Anwendung verwendet diesen logischen Pfad, um das Win32-Handle zu erhalten und die BLOB-Daten mithilfe der gewöhnlichen Win32-Dateisystemschnittstellen zu bearbeiten. Die Funktion gibt NULL zurück, wenn der Wert der FILESTREAM-Spalte gleich NULL ist.

Transaktiver Dateisystemzugriff

Die neue intrinsische Funktion GET_FILESTREAM_TRANSACTION_CONTEXT () gibt das Token zurück, das die aktuelle Transaktion darstellt, mit der die Sitzung verknüpft ist. Die Transaktion muss bereits gestartet, aber noch nicht abgebrochen oder eingetragen worden sein. Durch den Bezug eines Tokens bindet die Anwendung die FILESTREAM-Dateisystem-Streamingvorgänge an eine gestartete Transaktion. Die Funktion gibt NULL zurück, wenn keine explizit gestartete Transaktion vorliegt.

Alle Dateihandles müssen geschlossen werden, bevor die Transaktion abgebrochen oder eingetragen wird. Wenn ein Handle nach Abschluss einer Transaktion geöffnet bleibt, verursachen weitere Lesevorgänge unter Verwendung des Handles einen Fehler. Weitere Schreibvorgänge unter Verwendung des Handles werden zwar ausgeführt, aber die Daten werden nicht auf den Datenträger geschrieben. Wenn die Datenbank oder die Database Engine (Datenbankmodul)-Instanz geschlossen wird, werden alle geöffneten Handles ungültig.

Dauerhaftigkeit von Transaktionen

Bei Verwendung von FILESTREAM wird beim Eintragen einer Transaktion von Database Engine (Datenbankmodul) die Dauerhaftigkeit von Transaktionen für FILESTREAM-BLOB-Daten sichergestellt, die über einen Streamingzugriff auf das Dateisystem geändert werden.

Isolationssemantik

Die Isolationssemantik wird durch die Database Engine (Datenbankmodul) Transaktionsisolationsstufen bestimmt. Für den Dateisystemzugriff wird nur die Read Committed-Isolationsstufe unterstützt. Wiederholbare Lesevorgänge sowie die Isolationsstufen Serializable und Snapshot werden unterstützt, wenn über Transact-SQL auf die FILESTREAM-Daten zugegriffen wird. Das Lesen von geänderten Daten, für die kein Commit ausgeführt wurde, wird nicht unterstützt.

Bei Dateisystemzugriffvorgängen zum Öffnen von Dateien wird auf keine Sperren gewartet. Stattdessen schlagen die Öffnungsvorgänge sofort fehl, wenn wegen der Transaktionsisolation nicht auf die Daten zugegriffen werden kann. Die Streaming-API-Aufrufe schlagen mit dem Ergebnis ERROR_SHARING_VIOLATION fehl, wenn der Öffnungsvorgang wegen einer Isolationsverletzung nicht fortgesetzt werden kann.

Teilaktualisierungen

Damit Teilaktualisierungen durchgeführt werden können, kann die Anwendung einen Dateisystembefehl (FSCTL_SQL_FILESTREAM_FETCH_OLD_CONTENT) ausgeben, um den alten Inhalt in die Datei zu laden, auf die das geöffnete Handle verweist. Daraufhin kopiert der Server den alten Inhalt. Um das Leistungsverhalten der Anwendung zu verbessern und zu vermeiden, dass bei der Arbeit mit sehr großen Dateien Wartezeitüberschreitungen auftreten, wird die Verwendung asynchroner E/A empfohlen.

Wenn der FSCTL-Befehl ausgegeben wird, nachdem in die durch das Handle bezeichnete Datei geschrieben wurde, dann werden die Daten des letzten Schreibvorgangs gespeichert, alle zuvor geschriebenen Daten gehen verloren.

Direktes Schreiben von Remoteclients

Der Remotedateisystemzugriff auf FILESTREAM-Daten wird über das SMB (Server Message-Block)-Protokoll ermöglicht. Wenn der Client remote ist, werden Schreibvorgänge nicht auf der Clientseite zwischengespeichert. Die Schreibvorgänge werden immer an den Server gesendet. Die Daten können auf der Serverseite zwischengespeichert werden. Es wird empfohlen, dass Anwendungen, die auf Remoteclients ausgeführt werden, kleine Schreibvorgänge konsolidieren, sodass weniger Schreibvorgänge mit größeren Datenmengen durchgeführt werden.

Die Erstellung von Speicherabbildern (E/A mit Speicherabbildern) mit einem FILESTREAM-Handle wird nicht unterstützt. Wenn Speicherabbilder für FILESTREAM-Daten verwendet werden, kann Database Engine (Datenbankmodul) weder die Konsistenz und Dauerhaftigkeit der Daten noch die Datenbankintegrität garantieren.