Architektur von Dateien und Dateigruppen

In SQL Server wird eine Datenbank einem Satz von Betriebssystemdateien zugeordnet. Daten und Protokollinformationen werden nie in derselben Datei gemischt, und die einzelnen Dateien werden immer nur von einer einzigen Datenbank verwendet. Dateigruppen sind mit Namen versehene Sammlungen von Dateien, die als Unterstützung bei der Verteilung von Daten und administrativen Tasks, wie z. B. Sicherungs- und Wiederherstellungsvorgängen, verwendet werden.

Datenbankdateien

SQL Server-Datenbanken verfügen über drei Arten von Dateien:

  • Primäre Datendateien

    Die primäre Datendatei bildet den Ausgangspunkt der Datenbank und zeigt auf die anderen Dateien in der Datenbank. Jede Datenbank verfügt über eine primäre Datendatei. Die empfohlene Dateinamenerweiterung für primäre Datendateien ist MDF.

  • Sekundäre Datendateien

    Als sekundäre Datendateien werden alle Datendateien außer der primären Datendatei bezeichnet. Einige Datenbanken verfügen möglicherweise nicht über eine sekundäre Datendatei, wohingegen andere Datenbanken mehrere sekundäre Datendateien verwenden. Die empfohlene Dateinamenerweiterung für sekundäre Datendateien ist NDF.

  • Protokolldateien

    Protokolldateien enthalten sämtliche Protokollinformationen, die zum Wiederherstellen der Datenbank benötigt werden. Für jede Datei muss mindestens eine Protokolldatei vorhanden sein. Eine Datenbank kann jedoch auch über mehrere Protokolldateien verfügen. Die empfohlene Dateinamenerweiterung für Protokolldateien ist LDF.

Die Dateinamenerweiterungen MDF, NDF und LDF werden nicht von SQL Server erzwungen. Diese Erweiterungen werden jedoch empfohlen, um die Verwendungsart der jeweiligen Datei leichter identifizieren zu können.

Bei SQL Server werden die Speicherorte aller Dateien in einer Datenbank in der primären Datei der Datenbank und in der master-Datenbank aufgezeichnet. SQL Server Database Engine (Datenbankmodul) verwendet meist die Informationen zum Dateispeicherort aus der Masterdatenbank. Database Engine (Datenbankmodul) verwendet jedoch die Informationen zum Dateispeicherort aus der primären Datei, um die Einträge zum Dateispeicherort in der Masterdatenbank in folgenden Fällen zu initialisieren:

  • Beim Anfügen einer Datenbank mithilfe der CREATE DATABASE-Anweisung mit der Option FOR ATTACH oder FOR ATTACH_REBUILD_LOG.

  • Beim Update von SQL Server, Version 2000 oder Version 7.0.

  • Beim Wiederherstellen der master-Datenbank.

Logische und physische Dateinamen

SQL Server-Dateien haben zwei Arten von Namen:

logical_file_name

Der logical_file_name ist der Name, der zum Verweisen auf die physische Datei in allen Transact-SQL-Anweisungen verwendet wird. Der logische Dateiname muss den Regeln für SQL Server-Bezeichner entsprechen und innerhalb der logischen Dateinamen in der Datenbank eindeutig sein.

os_file_name

Der os_file_name ist der Name der physischen Datei, einschließlich des Verzeichnispfads. Er muss den betriebssystemspezifischen Regeln für Dateinamen entsprechen.

SQL Server-Daten und -Protokolldateien können auf FAT- oder NTFS-Dateisystemen platziert werden. Es wird empfohlen, dass Sie das NTFS-Dateisystem aufgrund seiner Sicherheitsaspekte verwenden. Datendateigruppen und Protokolldateien für Lese-/Schreibvorgänge können nicht auf einem mit NTFS komprimierten Dateisystem platziert werden. Nur schreibgeschützte Datenbanken und schreibgeschützte sekundäre Dateigruppen können auf einem mit NTFS komprimierten Dateisystem platziert werden. Weitere Informationen finden Sie unter Schreibgeschützte Dateigruppen und Komprimierung.

Wenn mehrere Instanzen von SQL Server auf einem einzelnen Computer ausgeführt werden, erhält jede Instanz ein anderes Standardverzeichnis, um die Dateien für die in der Instanz erstellten Datenbanken zu speichern. Weitere Informationen finden Sie unter Dateispeicherorte für Standard- und benannte Instanzen von SQL Server.

Datendateiseiten

Die Seiten in einer SQL Server-Datendatei erhalten, beginnend mit null (0) für die erste Seite in der Datei, aufeinander folgende Seitennummern. Jede Datei in einer Datenbank verfügt über eine eindeutige ID-Nummer. Um eine Seite in einer Datenbank eindeutig zu identifizieren, ist sowohl die Datei-ID als auch die Seitennummer erforderlich. Im folgenden Beispiel werden die Seitennummern in einer Datenbank dargestellt, die über eine 4 MB umfassende primäre Datendatei und eine 1 MB umfassende sekundäre Datendatei verfügt.

Sequenzielle Seitennummern in zwei Datendateien

Die erste Seite in jeder Datei ist eine Dateiheaderseite, die Informationen zu den Attributen der Datei enthält. Viele der anderen Seiten am Anfang der Datei enthalten ebenfalls Systeminformationen, wie z. B. Zuordnungstabellen. Eine der Systemseiten, die sowohl in der primären Datendatei als auch in der ersten Protokolldatei gespeichert ist, ist eine Datenbank-Startseite, die Informationen zu den Attributen der Datenbank enthält. Weitere Informationen zu Seiten und Seitentypen finden Sie unter Grundlegendes zu Seiten und Blöcken.

Dateigröße

SQL Server-Dateien können automatisch über ihre ursprünglich angegebene Größe wachsen. Wenn Sie eine Datei definieren, können Sie eine bestimmte Schrittweite für die Vergrößerung angeben. Sobald die Datei vollständig aufgefüllt ist, wird sie um den als Schrittweite festgelegten Wert vergrößert. Wenn eine Dateigruppe mehrere Dateien enthält, beginnt die automatische Vergrößerung erst dann, wenn alle Dateien vollständig gefüllt sind. Die Vergrößerung wird dann nach dem Round-Robin-Schema vorgenommen.

Für jede Datei kann zudem eine Maximalgröße angegeben werden. Wenn keine Maximalgröße angegeben wird, kann die Datei so lange vergrößert werden, bis der gesamte verfügbare Speicherplatz auf dem Datenträger verbraucht ist. Diese Funktion ist insbesondere dann hilfreich, wenn SQL Server als Datenbank verwendet wird, die in eine Anwendung eingebettet ist, und der Benutzer sich nicht ohne weiteres mit einem Systemadministrator in Verbindung setzen kann. Der Benutzer kann festlegen, dass die Dateien nach Bedarf automatisch vergrößert werden, sodass die administrative Arbeit reduziert werden kann, die mit der Überwachung des freien Speicherplatzes in der Datenbank und der manuellen Zuordnung von zusätzlichem Speicherplatz verbunden ist.

Datenbank-Momentaufnahmedateien

Das von einer Datenbankmomentaufnahme zum Speichern der Kopie-bei-Schreibvorgang-Daten verwendete Dateiformat hängt davon ab, ob die Momentaufnahme von einem Benutzer erstellt oder intern verwendet wird:

  • Eine von einem Benutzer erstellte Datenbankmomentaufnahme speichert die Daten in mindestens einer Datei mit geringer Dichte. Die Technologie von Dateien mit geringer Dichte ist eine Funktion des NTFS-Dateisystems. Anfangs enthält eine Datei mit geringer Dichte keine Benutzerdaten. Zudem ist dieser Datei kein Speicherplatz für Benutzerdaten zugeordnet. Allgemeine Informationen zum Verwenden von Dateien mit geringer Dichte in Datenbankmomentaufnahmen sowie zum Wachstum von Datenbankmomentaufnahmen finden Sie unter Funktionsweise von Datenbanksnapshots und Grundlegendes zur Größe von Dateien mit geringer Dichte in Datenbankmomentaufnahmen.

  • Datenbankmomentaufnahmen werden intern von bestimmten DBCC-Befehlen verwendet. Zu diesen Befehlen zählen DBCC CHECKDB, DBCC CHECKTABLE, DBCC CHECKALLOC und DBCC CHECKFILEGROUP. Eine interne Datenbankaufnahme verwendet alternative Datenströme mit geringer Dichte der ursprünglichen Datenbankdateien. So wie Dateien mit geringer Dichte stellen auch alternative Datenströme eine Funktion des NTFS-Dateisystems dar. Die Verwendung alternativer Datenströme mit geringer Dichte ermöglicht das Zuordnen mehrerer Datenzuweisungen zu einer einzelnen Datei bzw. zu einem einzelnen Ordner, ohne Auswirkung auf die Dateigröße oder -umfangstatistiken.

Datenbankdateigruppen

Datenbankobjekte und -dateien können zu Verwaltungs- und Zuordnungszwecken zu Dateigruppen zusammengefasst werden. Es gibt zwei Arten von Dateigruppen:

Primäre Dateigruppe

Die primäre Dateigruppe enthält die primäre Datendatei und alle anderen Dateien, die nicht explizit einer anderen Dateigruppe zugewiesen sind. Alle Seiten für die Systemtabellen werden in der primären Dateigruppe zugeordnet.

Benutzerdefinierte Dateigruppe

Als benutzerdefinierte Dateigruppen werden alle Dateigruppen bezeichnet, die mithilfe des FILEGROUP-Schlüsselworts in der Anweisung CREATE DATABASE oder ALTER DATABASE angegeben werden.

Protokolldateien sind niemals Teil einer Dateigruppe. Der Speicherplatz in Protokolldateien wird unabhängig vom Datenspeicher verwaltet.

Eine Datei kann nicht Mitglied mehrerer Dateigruppen sein. Tabellen, Indizes und Daten großer Objekte können einer bestimmten Dateigruppe zugeordnet werden. In diesem Fall werden alle darin enthaltenen Seiten dieser Dateigruppe zugeordnet, oder die Tabellen und Indizes können partitioniert werden. Die Daten partitionierter Tabellen und Indizes werden in Einheiten aufgeteilt, die jeweils in einer separaten Dateigruppe in einer Datenbank platziert werden können. Weitere Informationen zu partitionierten Tabellen und Indizes finden Sie unter Partitionierte Tabellen und Indizes.

In jeder Datenbank fungiert eine Dateigruppe als Standarddateigruppe. Wenn eine Tabelle oder ein Index erstellt wird, ohne dass eine Dateigruppe angegeben wird, wird angenommen, dass alle Seiten, aus der Standarddateigruppe zugeordnet werden. Es können nicht mehrere Dateigruppen gleichzeitig als Standarddateigruppe verwendet werden. Mitglieder der festen Datenbankrolle db_owner können die Festlegung für die Standarddateigruppe von einer Dateigruppe zu einer anderen ändern. Wird keine Standarddateigruppe angegeben, wird die primäre Dateigruppe als Standarddateigruppe verwendet.

Datei- und Dateigruppenbeispiel

Im folgenden Beispiel wird eine Datenbank auf einer Instanz von SQL Server erstellt. Die Datenbank verfügt über eine primäre Datendatei, eine benutzerdefinierte Dateigruppe und eine Protokolldatei. Die primäre Datendatei befindet sich in der primären Dateigruppe, und die benutzerdefinierte Dateigruppe verfügt über zwei sekundäre Datendateien. Durch die ALTER DATABASE-Anweisung wird die benutzerdefinierte Dateigruppe als Standarddateigruppe festgelegt. Anschließend wird eine Tabelle unter Angabe der benutzerdefinierten Dateigruppe erstellt.

USE master;
GO
-- Create the database with the default data
-- filegroup and a log file. Specify the
-- growth increment and the max size for the
-- primary data file.
CREATE DATABASE MyDB
ON PRIMARY
  ( NAME='MyDB_Primary',
    FILENAME=
       'c:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\data\MyDB_Prm.mdf',
    SIZE=4MB,
    MAXSIZE=10MB,
    FILEGROWTH=1MB),
FILEGROUP MyDB_FG1
  ( NAME = 'MyDB_FG1_Dat1',
    FILENAME =
       'c:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\data\MyDB_FG1_1.ndf',
    SIZE = 1MB,
    MAXSIZE=10MB,
    FILEGROWTH=1MB),
  ( NAME = 'MyDB_FG1_Dat2',
    FILENAME =
       'c:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\data\MyDB_FG1_2.ndf',
    SIZE = 1MB,
    MAXSIZE=10MB,
    FILEGROWTH=1MB)
LOG ON
  ( NAME='MyDB_log',
    FILENAME =
       'c:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\data\MyDB.ldf',
    SIZE=1MB,
    MAXSIZE=10MB,
    FILEGROWTH=1MB);
GO
ALTER DATABASE MyDB 
  MODIFY FILEGROUP MyDB_FG1 DEFAULT;
GO

-- Create a table in the user-defined filegroup.
USE MyDB;
CREATE TABLE MyTable
  ( cola int PRIMARY KEY,
    colb char(8) )
ON MyDB_FG1;
GO

In der folgenden Abbildung werden die Ergebnisse des vorherigen Beispiels zusammengefasst.

Logische und physische Dateinamen einer Datenbank