DBCC SHRINKDATABASE (Transact-SQL)

Aktualisiert: 14. April 2006

Reduziert die Größe der Daten- und Protokolldateien in der angegebenen Datenbank.

Themenlink (Symbol)Transact-SQL-Syntaxkonventionen

Syntax

DBCC SHRINKDATABASE 
( database_name | database_id | 0 
     [ ,target_percent ] 
     [ , { NOTRUNCATE | TRUNCATEONLY } ] 
)
[ WITH NO_INFOMSGS ]

Argumente

  • database_name | database_id | 0
    Der Name oder die ID der Datenbank, die verkleinert werden soll. Wird 0 angegeben, wird die aktuelle Datenbank verwendet.
  • target_percent
    Der gewünschte Prozentsatz an freiem Speicherplatz, der nach Verkleinerung der Datenbank in der Datenbankdatei verbleiben soll.
  • NOTRUNCATE
    Komprimiert die Daten in Datendateien, indem zugeordnete Seiten vom Ende einer Datei auf nicht zugeordnete Seiten am Dateianfang verschoben werden. target_percent ist optional.

    Der freie Speicherplatz am Dateiende wird nicht an das Betriebssystem zurückgegeben, und die physische Größe der Datei bleibt unverändert. Daher scheint die Datenbank bei Angabe von NOTRUNCATE nicht verkleinert zu werden.

    NOTRUNCATE gilt nur für Datendateien. Die Protokolldateien sind nicht betroffen.

  • TRUNCATEONLY
    Gibt den gesamten freien Speicherplatz am Dateiende an das Betriebssystem frei, es werden jedoch keine Seiten innerhalb der Datei verschoben. Die Datendatei wird nur bis zum letzten zugeordneten Block verkleinert. Der target_percent-Parameter wird ignoriert, wenn er mit TRUNCATEONLY angegeben wird.

    TRUNCATEONLY gilt nur für Datendateien. Die Protokolldateien sind nicht betroffen.

  • WITH NO_INFOMSGS
    Unterdrückt alle Informationsmeldungen mit einem Schweregrad von 0 bis 10.

Resultsets

In der folgenden Tabelle werden die Spalten des Resultsets beschrieben.

Spaltenname Beschreibung

DbId

Datenbank-ID der Datei, die von Datenbankmodul verkleinert werden sollte.

FileId

Datei-ID der Datei, die von Datenbankmodul verkleinert werden sollte.

CurrentSize

Anzahl von 8-KB-Seiten, die die Datei derzeit belegt.

MinimumSize

Anzahl von 8-KB-Seiten, die die Datei mindestens belegen könnte. Dies entspricht der Mindestgröße bzw. der ursprünglich erzeugten Dateigröße.

UsedPages

Anzahl von 8-KB-Seiten, die derzeit von der Datei verwendet werden.

EstimatedPages

Anzahl von 8-KB-Seiten, auf die die Datei nach Schätzung von Datenbankmodul verkleinert werden kann.

ms190488.note(de-de,SQL.90).gifHinweis:
   Datenbankmodul zeigt keine Zeilen für Dateien an, die nicht verkleinert wurden.

Hinweise

Zum Verkleinern aller Daten- und Protokolldateien einer bestimmten Datenbank führen Sie den DBCC SHRINKDATABASE-Befehl aus. Zum Verkleinern einer einzelnen Daten- oder Protokolldatei einer bestimmten Datenbank führen Sie den DBCC SHRINKFILE-Befehl aus.

Zum Anzeigen des aktuellen freien (nicht zugeordneten) Speicherplatzes in der Datenbank führen Sie sp_spaceused aus.

DBCC SHRINKDATABASE-Vorgänge können an jeder Stelle des Vorgangs beendet werden. Der bereits abgeschlossene Anteil bleibt erhalten.

Die Datenbank kann nicht unter die Mindestgröße der Datenbank verkleinert werden. Die Mindestgröße ist die Größe, die ursprünglich beim Erstellen der Datenbank angegeben wurde bzw. die letzte Größe, die bei einer Dateigrößenänderung, z. B. mit DBCC SHRINKFILE oder ALTER DATABASE, explizit festgelegt wurde. Wenn eine Datenbank z. B. mit einer Größe von 10 MB erstellt und auf 100 MB vergrößert wurde, kann die Datenbank höchstens auf 10 MB verkleinert werden, auch wenn alle Daten in der Datenbank gelöscht wurden.

Das Ausführen von DBCC SHRINKDATABASE ohne eine der Optionen NOTRUNCATE oder TRUNCATEONLY entspricht einem DBCC SHRINKDATABASE-Vorgang mit NOTRUNCATE und einem anschließenden DBCC SHRINKDATABASE-Vorgang mit TRUNCATEONLY.

Die zu verkleinernde Datenbank muss sich nicht im Einzelbenutzermodus befinden. Andere Benutzer können während der Verkleinerung darin arbeiten. Das gilt auch für Systemdatenbanken.

Während einer Datenbanksicherung können Sie die Datenbank nicht verkleinern. Umgekehrt können Sie eine Datenbank nicht sichern, während ein Verkleinerungsvorgang für die Datenbank ausgeführt wird.

Funktionsweise von DBCC SHRINKDATABASE

DBCC SHRINKDATABASE verkleinert Datendateien pro Datei. Protokolldateien werden jedoch so verkleinert, als lägen alle Protokolldateien in einem zusammenhängenden Protokollpool vor. Dateien werden immer vom Ende her verkleinert.

Ausgangspunkt sei eine Datenbank namens mydb mit einer Datendatei und zwei Protokolldateien. Die Datendatei und die Protokolldateien sind jeweils 10 MB groß, die Datendatei enthält 6 MB an Daten.

Microsoft SQL Server 2005-Datenbankmodul berechnet für jede Datei eine Zielgröße. Auf diese Größe soll die Datei verkleinert werden. Wenn DBCC SHRINKDATABASE mit target_percent angegeben wird, berechnet Datenbankmodul die Zielgröße als target_percent-Umfang an freiem Speicherplatz in der Datei nach der Verkleinerung. Wenn Sie beispielsweise für target_percent den Wert 25 für die Verkleinerung von mydb angeben, berechnet Datenbankmodul eine Zielgröße von 8 MB für die Datendatei (6 MB Daten plus 2 MB freier Speicherplatz). Daher werden von Datenbankmodul sämtliche Daten aus den letzten 2 MB der Datendatei in freie Bereiche innerhalb der ersten 8 MB der Datendatei verschoben, und anschließend wird die Datei verkleinert.

Angenommen, die Datendatei von mydb enthält 7 MB Daten. Durch Festlegen von target_percent auf 30 kann diese Datendatei auf einen freien Prozentsatz von 30 verkleinert werden. Wird target_percent jedoch auf 40 festgelegt, wird die Datendatei nicht verkleinert, da Datenbankmodul eine Datei nicht auf eine Größe unterhalb der Größe verkleinert, die von den Daten gegenwärtig eingenommen wird. Sie können dieses Problem auch von einem anderen Blickpunkt aus betrachten: 40 Prozent erwünschter freier Speicherplatz plus 70 Prozent volle Datendatei (7 MB von 10 MB) ergeben mehr als 100 Prozent. Da der gewünschte freie Prozentsatz zuzüglich des Prozentsatzes, den die Datendatei gegenwärtig belegt, den Wert 100 Prozent um 10 Prozent übersteigt, wird die Datendatei bei target_size größer 30 nicht verkleinert.

Bei Protokolldateien wird target_percent von Datenbankmodul dafür verwendet, die Zielgröße der gesamten Protokolldatei zu berechnen, sodass target_percent die Größe des freien Speicherplatzes in der Protokolldatei nach dem Verkleinern angibt. Die Zielgröße für das gesamte Protokoll wird dann in eine Zielgröße für jede Protokolldatei umgewandelt.

DBCC SHRINKDATABASE versucht, jede physische Protokolldatei sofort auf ihre Zielgröße zu verkleinern. Wenn sich kein Teil des logischen Protokolls in den virtuellen Protokollen befindet, die außerhalb der Zielgröße der Protokolldatei liegen, wird die Datei erfolgreich abgeschnitten, und DBCC SHRINKDATABASE wird ohne Meldungen beendet. Wenn sich dagegen ein Teil des logischen Protokolls in den virtuellen Protokollen befindet, die außerhalb der Zielgröße liegen, gibt Datenbankmodul so viel Speicherplatz wie möglich frei und gibt dann eine Informationsmeldung aus. Diese Meldung beschreibt, welche Aktionen erforderlich sind, um das logische Protokoll aus den virtuellen Protokollen am Ende der Datei heraus zu verschieben. Nachdem diese Aktionen ausgeführt wurden, kann der verbleibende Speicherplatz mit DBCC SHRINKDATABASE freigegeben werden. Weitere Informationen finden Sie unter Verkleinern des Transaktionsprotokolls.

Da eine Protokolldatei nur auf eine Grenze einer virtuellen Protokolldatei verkleinert werden kann, ist eine Verkleinerung der Protokolldatei auf eine geringere Größe als die einer virtuellen Protokolldatei u. U. nicht möglich, selbst wenn die Protokolldatei nicht verwendet wird. Die Größe der virtuellen Protokolldatei wird dynamisch von Datenbankmodul ausgewählt, wenn Protokolldateien erstellt oder erweitert werden. Weitere Informationen zu virtuellen Protokolldateien finden Sie unter Physische Architektur des Transaktionsprotokolls.

Bewährte Methoden

Beachten Sie folgende Informationen, wenn Sie eine Datenbank verkleinern möchten:

  • Ein Verkleinerungsvorgang ist am effektivsten nach einem Vorgang, durch den umfangreicher nicht verwendeter Speicherplatz zur Verfügung gestellt wird, z. B. das Abschneiden oder Löschen einer Tabelle.
  • Die meisten Datenbanken erfordern verfügbaren freien Speicherplatz für die normalen alltäglichen Vorgänge. 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 diesen Fällen ist das Verkleinern der Datenbank vergeblich.
  • Bei einem Verkleinerungsvorgang bleibt der Fragmentierungszustand der Indizes in der Datenbank nicht erhalten. Im Allgemeinen wird die Fragmentierung zu einem gewissen Grad verstärkt. Dies ist ein weiterer Grund, die Datenbank nicht wiederholt zu verkleinern.
  • Legen Sie die Datenbankoption AUTO_SHRINK nicht auf ON fest, es sei denn, besondere Anforderungen machen dies erforderlich.

Problembehandlung

Es kann vorkommen, dass Verkleinerungsvorgänge durch eine Transaktion blockiert werden, die auf einer auf Zeilenversionsverwaltung basierenden 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 das Verkleinern der Dateien erst nach Beenden des Löschvorgangs gestartet. Ist dies der Fall, drucken DBCC SHRINKFILE- und DBCC SHRINKDATABASE-Vorgänge in der ersten Stunde alle fünf Minuten, danach jede Stunde eine Informationsmeldung in das SQL Server-Fehlerprotokoll (5202 für SHRINKDATABASE und 5203 für SHRINKFILE) aus. Das Fehlerprotokoll kann beispielsweise eine Fehlermeldung wie die folgende enthalten:

DBCC SHRINKDATABASE for database ID 9 is waiting for the snapshot 
transaction with timestamp 15 and other snapshot transactions linked to 
timestamp 15 or with timestamps older than 109 to finish.

Dies bedeutet, dass der Verkleinerungsvorgang durch Snapshottransaktionen mit Timestamps älter als 109 blockiert ist, was der letzten vom Verkleinerungsvorgang abgeschlossenen Transaktion entspricht. Außerdem wird angezeigt, dass die transaction_sequence_num-Spalte oder die first_snapshot_sequence_num-Spalte in der dynamischen Verwaltungssicht sys.dm_tran_active_snapshot_database_transactions einen Wert von 15 enthält. Wenn eine der Spalten transaction_sequence_num oder first_snapshot_sequence_num in der Sicht eine Zahl enthält, die kleiner ist als die letzte durch einen Verkleinerungsvorgang abgeschlossene Transaktion (109), wird der Verkleinerungsvorgang erst nach Abschluss dieser Transaktionen ausgeführt.

Führen Sie eine der folgenden Aufgaben aus, um das Problem zu beheben:

  • Beenden Sie die Transaktion, die den Verkleinerungsvorgang blockiert.
  • Beenden Sie den Verkleinerungsvorgang. Der bereits abgeschlossene Teil bleibt erhalten.
  • Führen Sie keine besonderen Aktionen aus, und lassen Sie zu, dass der Verkleinerungsvorgang erst nach Abschluss der blockierenden Transaktion ausgeführt wird.

Weitere Informationen zum SQL Server-Fehlerprotokoll finden Sie unter Anzeigen des SQL Server-Fehlerprotokolls.

Berechtigungen

Erfordert die Mitgliedschaft in der festen Serverrolle sysadmin oder der festen Datenbankrolle db_owner.

Beispiele

A. Verkleinern einer Datenbank und Angeben eines Prozentsatzes an freiem Speicherplatz

Im folgenden Beispiel wird die Größe der Daten- und Protokolldateien in der UserDB-Benutzerdatenbank so verringert, dass die Datenbank zehn Prozent freien Speicherplatz enthält.

DBCC SHRINKDATABASE (UserDB, 10);
GO

B. Abschneiden einer Datenbank

Im folgenden Beispiel werden die Datendateien in der AdventureWorks-Beispieldatenbank auf den letzten zugeordneten Block verkleinert.

DBCC SHRINKDATABASE (AdventureWorks, TRUNCATEONLY);

Siehe auch

Verweis

ALTER DATABASE (Transact-SQL)
DBCC (Transact-SQL)
DBCC SHRINKFILE (Transact-SQL)

Andere Ressourcen

Physikalische Datenbankdateien und Dateigruppen
Vorgehensweise: Verkleinern einer Datenbank (SQL Server Management Studio)
Speicherplatzreservierung und -wiederverwendung

Hilfe und Informationen

Informationsquellen für SQL Server 2005

Änderungsverlauf

Version Verlauf

14. April 2006

Neuer Inhalt:
  • Beispiel B wurde hinzugefügt.
  • Dem Abschnitt zur Problembehandlung wurden Aufgaben zur Lösung der Probleme hinzugefügt.
  • Im Abschnitt mit bewährten Methoden wurden Informationen zur Datenbankoption AUTO_SHRINK hinzugefügt.
Aktualisierter Inhalt:
  • Die Definitionen von TRUNCATEONLY und NOTRUNCATE wurden verdeutlicht.
  • Im Abschnitt mit den Hinweisen wurde die Mindestgröße, auf die eine Datenbank höchstens verkleinert werden kann, korrigiert.