Irgendwann ist auch der schönste SQL-Server voll – und dann muss aufgeräumt werden. Selbst wenn man bei seinen Datenbank als Recovery-Model “simple” verwendet können die Datenbank- und Logdateien anwachsen. Diese verfügen dann zwar über viel freien Speicher (innerhalb der Datei), belegen aber dennoch den entsprechenden Platz auf der Festplatte. Ein Blick in die Datenbankeigenschaften verrät recht leicht, wie viel Platz in so einer Datenbank ist.
Nun kann man diese Datenbank “shrinken” – das bedeutet, dass der freie Platz innerhalb der Datenbankdatei wieder freigegeben wird und somit generell auf der Festplatte zur Verfügung steht. Dieses “shrinken” erfolgt entweder auf der Datenbank oder für jede einzelne Datei einer Datenbank. Typischerweise hat eine Datenbank mindestens zwei Dateien: eine Datei für die Logs und eine für die Daten. Allerdings können größere Datenbank auch mehrere Daten-Dateien haben. Hier muss man dann das “shrinken” für jede Datei einzeln ausführen.
Für eine einzelne Datenbank ist das noch recht einfach, aber wie sieht das aus, wenn man alle Dateien aller Datenbank auf einem Server “shrinken” will?
Da muss ein Script her!
Mit folgendem Script kann man sich die notwendigen Statements erzeugen lassen um alle Dateien von allen Datenbanken zu “shrinken”.
SELECT 'USE [' + d.name + N']' + CHAR(13) + CHAR(10) + 'DBCC SHRINKFILE (N''' + mf.name + N''' , 5)' + CHAR(13) + CHAR(10) + CHAR(13) + CHAR(10) FROM sys.master_files mf JOIN sys.databases d ON mf.database_id = d.database_id WHERE d.database_id > 4;
Das Ergebnis kann man dann wiederum als Abfrage ausführen – und voila werden alle Datenbankdateien verkleinert.