Lassen Sie MS SQL Server Speicherplatz freigeben

9

Eine schlecht verwaltete Datenbanktabelle ist enorm gewachsen. 48 + Auftritte von Orphan Records. Ich versuche es aufzuräumen und meine gefährlich volle Festplatte wieder in einen normalen Zustand zu versetzen. Ich werde ungefähr 400 Millionen Datensätze aus dieser Tabelle löschen. Dies läuft während ich tippe. Ich stelle fest, dass mein Festplattenspeicher nicht abfällt, aber der Speicher bei Systemtabellenabfragen abfällt. Ich werde ausgeführt, um die Tabellengröße zu ermitteln. Die Datenbank verwendet "Simple Recovery Model".

Es gibt viele ähnliche Fragen mit Antworten, die besagen, dass Sie die Datenbank verkleinern müssen. Aber sie erklären weiter, wie schlimm / beängstigend dies aufgrund fragmentierter Daten usw. ist.

  1. Da sollte die Datenbank nicht diese Größe haben. Ist es immer noch schlecht für mich, es zu verkleinern?
  2. Dies ist eine Produktionsdatenbank. Wenn ich verkleinere, führt dies zu Ausfallzeiten oder zum Sperren der Datenbank?
  3. In SQL Server Management Studio haben Sie zwei Optionen zum Verkleinern, Datenbank oder Dateien. Was wäre angesichts meiner Situation die beste Option?
  4. Gibt es eine Regel für den Prozentsatz des freien Speicherplatzes, den eine Datenbank haben sollte?

Selbst wenn ich die Tag-Beschreibung von Shrink lese, möchte ich es nicht tun. Gibt es eine andere Art und Weise?

Jackncoke
quelle

Antworten:

14

Ich werde ungefähr 400 Millionen Datensätze aus dieser Tabelle löschen.

Hoffentlich machen Sie das in Stücken - um ein Aufblähen des Transaktionsprotokolls zu vermeiden.

Beachten Sie, dass ich keinen Tropfen auf meiner Festplatte sehe

Sie werden es nicht tun, da Sie die Datenbankdatei explizit verkleinern müssen, um Speicherplatz freizugeben. Durch das Löschen der Datensätze gibt SQL Server den Speicherplatz nicht an das Betriebssystem zurück .

  1. Da sollte die Datenbank nicht diese Größe haben. Ist es immer noch schlecht für mich, es zu verkleinern?

Dies ist im Allgemeinen eine schlechte Praxis, da Datenbanken ordnungsgemäß dimensioniert werden sollten. Wenn Sie zu 100% sicher sind, dass Ihre Datenbank NICHT wieder diese Größe haben wird, können Sie die Datenbank (in Ihrem Szenario) verkleinern .

  1. Dies ist eine Produktionsdatenbank. Wenn ich verkleinere, führt dies zu Ausfallzeiten oder zum Sperren der Datenbank?

Das Verkleinern einer Datenbank ist sehr E / A-intensiv. Es ist ratsam, DBCC SHRINKFILEwährend des Wartungsfensters oder bei minimaler Aktivität zu schrumpfen .

  1. In Management Studio haben Sie zwei Möglichkeiten: Datenbank oder Dateien. Was wäre angesichts meiner Situation die beste Option?

Sie sollten TSQL verwenden, um das Schrumpfen durchzuführen. (Seit Sie gefragt haben, ist das Verkleinern der DATEI der richtige Weg anstelle der Datenbank). Sie können die Verkleinerungsdatenbank in Chunks verwenden - tsql- Skript, um die Verkleinerung in Chunks durchzuführen .

Denken Sie daran, dass Sie beim Verkleinern Ihre Indizes fragmentieren.

  1. Gibt es eine Regel für den Prozentsatz des freien Speicherplatzes, den eine Datenbank haben sollte?

Weitere Informationen finden Sie im Artikel zum Schätzen des Speicherplatzbedarfs für Datenbanken . Es gibt keine feste Regel. Sie müssen berücksichtigen, wie Ihre Datenbank voraussichtlich wachsen wird. Sie müssen auch das automatische Wachstum Ihrer Datenbanken berücksichtigen .

Referenzen: Warum wächst das Transaktionsprotokoll weiter oder der Speicherplatz geht zur Neige?

Kin Shah
quelle
5

Sie haben guten Grund zur Sorge, da die DB in SQL Server häufig "saugt". Paul Randal, der Leiter der Storage Engine in SQL 2005, erklärte, ShrinkDB sei sehr schlecht geschrieben. Es findet leeren Speicherplatz, indem es die Daten ganz am Ende nimmt und ganz am Anfang platziert und dies so lange tut, bis am Ende der DB-Dateien freier Speicherplatz vorhanden ist. Zu diesem Zeitpunkt kann der Speicherplatz dann von SQL Server freigegeben und an das Betriebssystem zurückgegeben werden. Sie kehren Ihre Datenbankdateien effektiv um, sodass Sie normalerweise eine massive Fragmentierung feststellen. Sie können über seine Ansichten in diesem Blog-Beitrag oder in diesem MCM Internals-Video lesen

Wie bei allem müssen Sie diese zuerst in Ihrer Umgebung testen. Eine bessere Möglichkeit besteht darin, Daten in eine andere Dateigruppe zu verschieben. Sie können eine Online-Indexwiederherstellung mit dem Clustered-Index durchführen und anschließend in der neuen Dateigruppe neu indizieren. Dann können Sie den alten fallen lassen und den Raum freigeben und haben fast keine Fragmentierung. Beachten Sie, dass dies etwa 120% zusätzlichen Speicherplatz beansprucht, während es durchgearbeitet wird. Das Problem dabei ist, dass Sie sogar zusätzlichen freien Speicherplatz benötigen, den Sie möglicherweise nicht haben. Dies ist eine Unternehmensfunktion.

Wenn der freie Speicherplatz so teuer ist, müssen Sie möglicherweise in die Kugel beißen und die Datenbank langsam um einen kleinen Teil verkleinern, um lang laufende Prozesse zu vermeiden. Beachten Sie, dass Ihre Daten stark fragmentiert sind und Sie alles erneut indizieren möchten. Beachten Sie, dass Sie nach der Neuindizierung alles Ihren genutzten Speicherplatz ein wenig vergrößern und wieder zusätzlichen freien Speicherplatz haben. Siehe Brents Rat hier .

Wie viel freier Speicherplatz für Sie gut ist, hängt davon ab, wie viel Sie sich für Fragmentierungs- und Dateiwachstumsaktivitäten leisten können. Wenn IFI aktiviert ist, erfolgt das Dateiwachstum fast sofort, aber Sie erhalten immer noch eine Fragmentierung. Eine gute Faustregel ist, so viel Platz vorzuweisen, wie Sie für nötig halten, oder das Wachstum zu überwachen und bei Bedarf regelmäßig in Blöcken anzupassen. Dies hält die physische Fragmentierung gering.

Auch das Wachstum von Protokolldateien ist viel wichtiger. Zusätzliche Protokolldateien können eine VLF-Fragmentierung verursachen. Dies macht Ihre Wiederherstellungen viel langsamer und kann sich auf Checkpoint / Truncates auswirken. Hier sind einige Leistungsrisiken, die Sie mit einem fragmentierten Protokoll eingehen. Führen Sie DBCC LOGINFO();für jede Datenbank eine aus. Versuchen Sie, die Zahl pro Kim Tripp bei etwa 50 zu halten, aber wenn Sie Hunderte sehen, treten Fragmentierungsprobleme auf, was bedeutet, dass Ihre Protokolldateien wachsen mussten, um Vorgänge zu unterstützen. Eine gute Möglichkeit, um zu sehen, wie Ihre Protokolldatei laut Paul Randal aussehen sollte, besteht darin, sie eine Woche lang wachsen zu lassen und neu zu indizieren. Das könnte ein guter Punkt sein, vielleicht können Sie dort für alle Fälle etwas mehr freien Speicherplatz schaffen. Stellen Sie sicher, dass Ihre Protokolle nicht mit DBCC LOGINFO () fragmentiert sind. wieder und wenn sie es sind, bedeutet das, dass sie sehr gewachsen sind. Verkleinern und erweitern Sie die Protokolldatei erneut mitdiese Methode .

Ali Razeghi
quelle
2

Sie können es ausreichend verkleinern, um sicherzustellen, dass Ihr Server nicht in der Zeit abstürzt, die Sie benötigen, um Ihren Speicherbedarf zu ermitteln und Hardware- / Hosting-Services entsprechend zu planen (siehe Frage 4). Nein, es wird nicht gesperrt. Siehe Einschränkungen . Verkleinern Sie die Datenbank, weil sie die Dinge einfach hält.

Ich schlage vor, das Fachwissen für die Durchführung der Studie zu beauftragen und den Plan zu erstellen.

user41207
quelle