Verkleinern einer Datenbank

Jede Datei innerhalb einer Datenbank kann verkleinert werden, um nicht verwendete Seiten zu entfernen.Obwohl Database Engine (Datenbankmodul) den Speicherplatz effektiv neu zuweist, kann es vorkommen, dass eine Datei nicht mehr so groß sein muss, wie sie einmal war. Dann kann es erforderlich sein, die Datei zu verkleinern. Sowohl Daten- als auch Transaktionsprotokolldateien können verkleinert werden. Die Datenbankdateien können manuell verkleinert werden, entweder als Gruppe oder einzeln, oder für die Datenbank kann festgelegt werden, dass sie in angegebenen Intervallen automatisch verkleinert wird.

Dateien werden immer am Ende verkleinert. Wenn Sie z. B. eine Datei mit einer Größe von 5 GB besitzen und 4 GB als Wert für target_size in einer DBCC SHRINKFILE-Anweisung angeben, gibt Database Engine (Datenbankmodul) von den letzten 1 GB am Ende der Datei so viel Speicherplatz wie möglich frei. Wenn sich in dem freigegebenen Teil der Datei verwendete Seiten befinden, verlagert Database Engine (Datenbankmodul) die Seiten zuvor in den Teil der Datei, der erhalten bleibt. Eine Datenbank kann nur bis zu einer Größe verkleinert werden, bei der sie keinen freien Speicherplatz mehr enthält. Wenn eine Datenbank mit einer Größe von 5 GB z. B. 4 GB Daten hat und Sie 3 GB als Wert für target_size in einer DBCC SHRINKFILE-Anweisung angeben, wird nur 1 GB freigegeben.

Automatisches Verkleinern von Datenbanken

Wenn die AUTO_SHRINK-Datenbankoption auf ON festgelegt wurde, verkleinert Database Engine (Datenbankmodul) automatisch die Datenbanken, in denen freier Speicherplatz vorhanden ist. Diese Option wird mithilfe der ALTER DATABASE-Anweisung festgelegt. Die Standardeinstellung ist OFF. Die Speicherplatzverwendung in jeder Datenbank wird in regelmäßigen Abständen von Database Engine (Datenbankmodul) überprüft. Wenn für eine Datenbank die AUTO_SHRINK-Option auf ON gesetzt wurde, verringert Database Engine (Datenbankmodul) die Größe der Dateien in der Datenbank. Dieser Vorgang wird im Hintergrund ausgeführt und hat keinerlei Einfluss auf die Benutzeraktivitäten innerhalb der Datenbank.

So legen Sie fest, dass eine Datenbank automatisch verkleinert wird

ALTER DATABASE (Transact-SQL)

Manuelles Verkleinern von Datenbanken

Sie können eine Datenbank oder Dateien innerhalb einer Datenbank mit der DBCC SHRINKDATABASE-Anweisung bzw. mit der DBCC SHRINKFILE-Anweisung manuell verkleinern. Falls eine DBCC SHRINKDATABASE- bzw. DBCC SHRINKFILE-Anweisung nicht den gesamten Speicherplatz in einer Protokolldatei freigeben kann, gibt die Anweisung eine Informationsmeldung aus, in der angegeben ist, welche Aktion Sie durchführen müssen, um mehr Speicherplatz für die Freigabe zur Verfügung zu stellen. Weitere Informationen zum Verkleinern von Protokolldateien finden Sie unter Verkleinern des Transaktionsprotokolls.

Die Ausführung von DBCC SHRINKDATABASE und DBCC SHRINKFILE kann an jeder Stelle des Vorgangs beendet werden, wobei der fertig gestellte Anteil erhalten bleibt.

Mithilfe der DBCC SHRINKDATABASE-Anweisung kann eine ganze Datenbank höchstens bis auf ihre Originalgröße verkleinert werden. Wenn eine Datenbank mit einer Größe von 10 MB erstellt und auf 100 MB vergrößert wurde, kann die Datenbank demzufolge höchstens auf 10 MB verkleinert werden, auch wenn alle Daten in der Datenbank gelöscht wurden.

Sie können eine einzelne Datenbankdatei jedoch mithilfe der DBCC SHRINKFILE-Anweisung auf eine Größe verkleinern, die unter ihrer Anfangsgröße liegt. Sie müssen jede Datei einzeln verkleinern, anstatt zu versuchen, die gesamte Datenbank zu verkleinern.

HinweisHinweis

Es ist nicht möglich, die Datenbank oder das Transaktionsprotokoll zu verkleinern, während die Datenbank oder das Transaktionsprotokoll gesichert werden. Umgekehrt können Sie keine Datenbank- oder Transaktionsprotokollsicherung erstellen, während Sie versuchen, die Datenbank oder das Transaktionsprotokoll zu verkleinern.

So verkleinern Sie eine Datenbank

So verkleinern Sie eine Daten- oder Protokolldatei

Verkleinern des Transaktionsprotokolls

Eine Transaktionsprotokolldatei kann nur innerhalb fester Grenzen verkleinert werden. Die Größe der virtuellen Protokolldateien innerhalb des Protokolls bestimmt die mögliche Reduzierung der Größe. Aus diesem Grund kann das Protokoll nicht weiter als bis auf die Größe der virtuellen Protokolldatei verkleinert werden. Darüber hinaus erfolgt die Verkleinerung der Protokolldatei in Schritten, die der Größe der virtuellen Protokolldatei entsprechen. Eine Transaktionsprotokolldatei mit einer Größe von 1 GB kann beispielsweise fünf virtuelle Protokolldateien mit einer Größe von je 200 MB umfassen. Durch das Verkleinern der Transaktionsprotokolldatei werden nicht verwendete virtuelle Protokolldateien gelöscht; es werden jedoch mindestens zwei virtuelle Protokolldateien beibehalten. Da jede virtuelle Protokolldatei in diesem Beispiel über eine Größe von 200 MB verfügt, kann das Transaktionsprotokoll nicht weiter als bis auf die Mindestgröße von 400 MB verkleinert werden, wobei die Verkleinerung nur in Schritten von 200 MB erfolgen kann. Um eine Transaktionsprotokolldatei auf eine geringere Größe verkleinern zu können, müssen Sie ein kleines Transaktionsprotokoll erstellen und die automatische Vergrößerung dieser Datei aktivieren, anstatt auf einmal eine große Transaktionsprotokolldatei zu erstellen.

Mithilfe eines DBCC SHRINKDATABASE- oder DBCC SHRINKFILE-Vorgangs wird sofort versucht, die Transaktionsprotokolldatei auf die angeforderte Größe zu verkleinern (mit Rundung).Sie sollten die Protokolldatei vor der Verkleinerung sichern, um die Größe des logischen Protokolls zu reduzieren, und solche virtuellen Protokolle als inaktiv markieren, die keinen Teil des logischen Protokolls enthalten. Weitere Informationen finden Sie unter Verkleinern des Transaktionsprotokolls.

Bewährte Methoden

Berücksichtigen Sie die folgenden Informationen, wenn Sie eine Datenbank oder eine Datei verkleinern möchten:

  • Ein Verkleinerungsvorgang ist am effektivsten nach einem Vorgang, durch den umfangreicher nicht verwendeter Speicherplatz bereitgestellt wird, z. B. das Abschneiden oder Löschen einer Tabelle.

  • Die meisten Datenbanken benötigen für die täglichen Routinevorgänge eine gewisse Menge an freiem Speicherplatz. Wenn Sie eine Datenbank wiederholt verkleinern und feststellen, dass die Datenbankgröße wieder zunimmt, deutet dies darauf hin, dass der verkleinerte Speicherplatz für regelmäßige Vorgänge benötigt wird. In diesem Fall ist das Verkleinern der Datenbank vergeblich.

  • Bei einem Verkleinerungsvorgang bleibt der Fragmentierungszustand der Indizes in der Datenbank nicht erhalten. Im Allgemeinen wird die Fragmentierung bis zu einem gewissen Grad verstärkt. So sollten Sie z. B. nach einer Neuerstellung von Indizes keine Datenbank oder Datendatei verkleinern. Dies ist ein weiterer Grund, die Datenbank nicht wiederholt zu verkleinern.

  • Legen Sie die Datenbankoption AUTO_SHRINK nicht auf ON fest, sofern dies nicht aus einem bestimmten Grund erforderlich ist.

Auf Zeilenversionsverwaltung basierende Isolationsstufen und Verkleinerungsvorgänge

Es kann vorkommen, dass Verkleinerungsvorgänge durch eine Transaktion blockiert werden, die unter einer zeilenversionsbasierten Isolationsstufe ausgeführt wird. Wenn z. B. während der Ausführung eines DBCC SHRINK DATABASE-Vorgangs gerade ein umfangreicher Löschvorgang unter einer zeilenversionsbasierten Isolationsstufe stattfindet, wird mit dem Verkleinern der Dateien gewartet, bis der Löschvorgang beendet ist. In diesem Fall geben DBCC SHRINKFILE und DBCC SHRINKDATABASE eine Informationsmeldung (5202 für SHRINKDATABASE und 5203 für SHRINKFILE) an das SQL Server-Fehlerprotokoll aus, und zwar in der ersten Stunde alle fünf Minuten und danach einmal pro Stunde. Weitere Informationen finden Sie unter DBCC SHRINKDATABASE (Transact-SQL).