Diese Frage wird in verschiedenen Formen hier gestellt, aber die Frage läuft auf Folgendes hinaus:
Ich weiß, dass das Verkleinern einer Datenbank riskant ist. In diesem Fall habe ich so viele Daten entfernt, dass ich sie nie wieder verwenden werde.
- Wie kann ich meine Datenbank verkleinern? Welche Dateien verkleinere ich?
- Was sollten meine Überlegungen dabei sein?
- Soll ich danach noch etwas unternehmen?
- Was ist, wenn es sich um eine große Datenbank handelt? Kann ich es in kleineren Schritten verkleinern?
sql-server
shrink
Mike Walsh
quelle
quelle
Antworten:
Einige Vorsichtsmaßnahmen:
Wenn Sie sich über die Sorgen und Risiken gelesen haben und Sie immer noch diesen Schrumpf tun müssen , weil Sie eine befreit erhebliche Menge an Speicherplatz, hoffentlich der Rest dieser Antwort wird Ihnen helfen. Aber bedenken Sie die Risiken.
Es gibt zwei Hauptansätze, die zwei hier berücksichtigen:
1.) Verkleinern Ja, machen Sie das eigentliche Verkleinern - Ziehen Sie in Betracht,
DBCC SHRINKFILE
statt zu verwendenDBCC SHRINKDATABASE
, haben Sie mehr Kontrolle darüber, was und wie geschrumpft wird. Dies führt mit Sicherheit zu Leistungseinbußen - es handelt sich um eine umfangreiche Operation, die viel E / A-Aufwand verursacht. Sie können möglicherweise mit wiederholten Verkleinerungen auf eine Zielgröße, die immer kleiner wird, davonkommen.Dies ist das "A.)" - Beispiel im obigen
DBCC SHRINKFILE
Link. In diesem Beispiel wird eine Datendatei auf eine Zielgröße von 7 MB verkleinert. Dieses Format ist ein guter Weg, um wiederholt zu verkleinern, wenn Ihr Ausfallzeitfenster dies zulässt. Ich würde dies beim Testen der Entwicklung tun, um zu sehen, wie die Leistung aussieht und wie hoch / niedrig Sie ein Inkrement einstellen können, und um den erwarteten Zeitpunkt in der Produktion zu bestimmen. Dies ist ein Online- Vorgang - Sie können ihn mit Benutzern im System ausführen, die auf die Datenbank zugreifen, die verkleinert wird, aber es kommt fast garantiert zu Leistungseinbußen. Überwachen und beobachten Sie also, was Sie mit dem Server tun, und wählen Sie im Idealfall ein Ausfallzeitfenster oder eine Zeitspanne geringerer Aktivität aus.Immer daran denken: Sie - Bei jedem Verkleinern fragmentieren Sie Ihre Indizes und sollten einen Indexneubau durchführen, wenn Sie über einen längeren Zeitraum Teile verkleinern möchten. Diese Kosten fallen jetzt jedes Mal an, wenn Sie nicht alles in einem Fenster erledigen können.
2.) Neue Datenbank - Sie können eine neue Datenbank erstellen und Daten in diese migrieren. Sie müssten die leere Datenbank mit allen Schlüsseln, Indizes, Objekten, Prozessen, Funktionen usw. per Skript auslesen und dann Daten in sie migrieren. Sie könnten Skripte dafür schreiben oder ein Tool wie SQL Data Compare von Red Gate oder anderen Anbietern mit ähnlichen Tools verwenden. Dies ist mehr Einrichtungsarbeit auf Ihrer Seite, mehr Entwicklung und Testen, und abhängig von Ihrer Umgebung kann auch das Ausfallzeitfenster ausgeblasen werden, es ist jedoch eine zu berücksichtigende Option.
Wenn ich gezwungen bin , eine Datenbank zu verkleinern Wenn dies meine Umgebung wäre, würde ich versuchen, eine angemessene Menge an Leerraum in der Datendatei zu belassen, da ich gerne ein Festplattenfresser bin und auf zukünftiges / unerwartetes Wachstum vorbereitet bin. Wenn wir nur einen Großteil des Speicherplatzes löschen würden, wäre es in Ordnung, Platz zurückzugeben, aber ich würde diesen Worten niemals vertrauen, "aber es wird nie wieder wachsen", und trotzdem etwas Leerraum lassen. Die Route, mit der ich wahrscheinlich fahren würde ( seufz) ) ist der Schrumpf Ansatz , wenn ich kleinere Ausfallzeiten Fenster hatte und Ich wollte nicht die Komplexität aufbringen, eine leere Datenbank zu erstellen und Daten in diese zu migrieren. Also habe ich es ein paar Mal inkrementell verkleinert (basierend darauf, wie oft ich dachte, ich müsste basierend auf meinen Tests in dev und der gewünschten Größe nach und nach eine kleinere Dateigröße auswählen) und dann die Indizes neu erstellt. Und dann habe ich‘ würde niemals jemandem sagen, dass ich meine Datenbank verkleinert habe ;-)
quelle
DBCC SHRINKFILE
Befehl einzeln verkleinern . Es hängt von Ihrem Server ab, aus wie vielen Dateien Ihre Datenbank besteht. Eine einfache Datenbank verfügt über eine Datenbankdatei und eine Transaktionsprotokolldatei.Wir alle wissen, dass es sowieso nicht ratsam ist, regelmäßig SHRINK zu machen. Ich versuche, alle Warnungen und Haftungsausschlüsse, die Sie wahrscheinlich sowieso kennen, wegzulassen. Backup, und mach das nicht zu Hause wenn möglich :)
Bonus: Wenn Sie dies in der Replikationsumgebung für die Publisher-Datenbank ausführen, werden die Abonnentendatenbanken nicht verkleinert (was möglicherweise zu Größenproblemen führen kann, da es sich um Express-Editionen handelt).
Zum Schluss mein Reindex-Skript:
Die einzige Variable ist die 14, die durch Ausgabe von select abgerufen werden kann
DB_ID('YourDBName')
, und das Skript geht davon aus, dass Sie nur an den Tabellen im Schema dba. * Interessiert sind.quelle
Sie haben alle Warnungen über das Verkleinern von Datenbanken gehört und sie sind alle wahr. Es fragmentiert Ihre Indizes und ist im Allgemeinen, Ihre Datenbank durcheinander und sollte nicht auf einem Produktionssystem durchgeführt werden.
Normalerweise mache ich das jedoch wöchentlich, wenn ich aufgrund des Speicherplatzes auf meinem SSD-Laufwerk ein Backup auf meiner Workstation wiederherstelle. Wohlgemerkt, ich habe dieses Skript nicht geschrieben, sondern vor Jahren gefunden. Auf anderen Datenbanken [250 GB] habe ich ein SSIS-Paket erstellt, das die benötigten Tabellen überträgt und dann die Indizes für dieses ach so frische Indexgefühl neu erstellt.
quelle
Das folgende Zitat stammt direkt von Microsoft (gilt für die Versionen 2008-2016) und gibt eine Anleitung, ob / wann und wie Sie den
DBCC SHRINKFILE
Befehl verwenden sollten.https://msdn.microsoft.com/en-us/library/ms189493.aspx
quelle