it-swarm.com.de

Wiederherstellen des freien Speicherplatzes für Datendateien nach dem Löschen einer großen Datenmenge

Ich bin ein versehentlicher DBA. Wir haben einen SQL-Cluster, der 10 Datenbanken hostet. Plötzlich stieg die Größe einer Datenbank drastisch von 100 GB auf 250 GB. Als wir die Datendatei überprüften, war die Größe in den letzten Tagen mehr als doppelt so groß geworden. Wir haben die Tabellen identifiziert, die Daten abgeschnitten und Daten im Wert von 130 GB gelöscht. Die Datendatei zeigt immer noch 250 GB an. Wie können wir den Raum zurückerobern?

Vielen Dank für all Ihre Hilfe.

4
Info23

Ich empfehle Ihnen, DBCC SHRINKFILE () zu verwenden. Sie können den verfügbaren Speicherplatz für Dateien mithilfe der Abfrage in der Antwort unter diesem Link überprüfen Wie wird der verwendete/freie Speicherplatz in SQL-Datenbankdateien ermittelt?

Wenn Sie nur eine Datendatei und eine Protokolldatei haben, handelt es sich wahrscheinlich nur um Datei 1 und Datei 2. Sie müssen die Dateinummer an den Befehl SHRINKFILE übergeben. Es ist nicht notwendig, aber ich empfehle Ihnen, dies in kleinen Mengen (möglicherweise 1 oder 10 GB gleichzeitig) zu tun. Wenn Sie also eine Datendatei mit 250 GB, aber nur 100 GB haben, gehen Sie wie folgt vor

DBCC SHRINKFILE(1, 240000)
GO
DBCC SHRINKFILE(1, 230000)
GO
DBCC SHRINKFILE(1, 220000)
GO
...

Ich würde eine bestimmte Menge an Speicherplatz frei lassen, also nicht bis auf 100 GB. Lassen Sie möglicherweise 10 oder 20 GB für Arbeitsvorgänge in der Datei frei.

Verkleinerungsdatei sollte nicht blockieren. Es wird normalerweise angehalten, wenn andere Vorgänge an der Datendatei arbeiten. Wenn Sie einen großen Teil verkleinern, kann der Stapel sehr lange dauern.

Wenn ein Teil des nicht verwendeten Speicherplatzes aus der Protokolldatei stammt (normalerweise Datei 2), können Sie ihn nach dem Sichern auf einmal verkleinern (wenn Sie sich im vollständigen Wiederherstellungsmodus befinden). Verwenden Sie DBCC SQLPERF (Logspace), um den verwendeten Logspace und den verwendeten% zu überprüfen. Wenn der verwendete Prozentsatz niedrig ist, können Sie ihn problemlos verkleinern. Verwenden Sie einfach DBCC SHRINKFILE (2, 500), um das Protokoll wieder auf eine 500-MB-Datei zu verkleinern (wählen Sie die Größe aus, die Ihrer Meinung nach für den regulären Betrieb am besten geeignet ist).

5
Alf47

Sind Sie sicher, dass das Datenwachstum nicht erneut stattfinden wird? Wenn es eine realistische Chance gibt und der leere Raum Sie nicht verletzt, lassen Sie ihn, verkleinern Sie die Datenbank NICHT.

Wenn Sie jedoch sicher sind, dass Sie die Größe der Datendatei reduzieren möchten, sollten Sie sich der Fallstricke beim Verkleinern von Datendateien bewusst sein:

Ich beziehe mich auf den Rat von Paul Randal aus seinem Artikel "Warum Sie Ihre Datendateien nicht verkleinern sollten" (lesen Sie den gesamten Artikel, um ein klares Bild davon zu erhalten, was mit der Indexfragmentierung passiert):

Die Methode, die ich empfehlen möchte, ist wie folgt:

  • Erstellen Sie eine neue Dateigruppe
  • Verschieben Sie alle betroffenen Tabellen und Indizes mithilfe der Syntax CREATE INDEX … WITH (DROP_EXISTING = ON) ON in die neue Dateigruppe, um die Tabellen zu verschieben und gleichzeitig die Fragmentierung zu entfernen
  • Löschen Sie die alte Dateigruppe, die Sie sowieso verkleinern wollten (oder verkleinern Sie sie ganz nach unten, wenn es sich um die primäre Dateigruppe handelt).

Grundsätzlich müssen Sie etwas mehr Speicherplatz bereitstellen, bevor Sie die alten Dateien verkleinern können. Dies ist jedoch ein viel saubererer Mechanismus.

Wenn Sie absolut keine Wahl haben und einen Vorgang zum Verkleinern von Datendateien ausführen müssen, beachten Sie, dass Sie eine Indexfragmentierung verursachen werden, und Sie sollten Maßnahmen ergreifen, um diese anschließend zu entfernen, wenn dies zu Leistungsproblemen führen wird. Die einzige Möglichkeit, die Indexfragmentierung zu entfernen, ohne erneut ein Wachstum der Datendatei zu verursachen, ist die Verwendung von DBCC INDEXDEFRAG Oder ALTER INDEX … REORGANIZE. Diese Befehle erfordern nur eine einzige 8-KB-Seite mit zusätzlichem Speicherplatz, anstatt im Falle einer Indexwiederherstellungsoperation einen ganz neuen Index zu erstellen.

Fazit: Versuchen Sie unter allen Umständen zu vermeiden, dass Datendateien verkleinert werden!

7