SQL Server - Best Practices für wachsende Datenbankdateien

16

Ich verfolge seit zwei Wochen das Wachstum von Dateien über den Datenkollektor in SQL Server 2008 R2. Die Datenbank wächst stetig um 35 (MB) / Tag. Die DB hat die ursprüngliche Größe von 2 GB noch nicht erreicht.

Das automatische Wachstum der DB-Dateien ist auf 5 MB festgelegt, und ich möchte einen anderen Ansatz ausprobieren. Daher suche ich nach Vorschlägen und / oder Kommentaren.

Es gibt eine Optimierungsaufgabe, die jede Woche am Sonntagabend um 1:30 Uhr ausgeführt wird. Die Aufgabe wird:

  • Überprüfen Sie die Datenbankintegrität
  • Verkleinern Sie die Protokolldatei - (Dies ist in Ordnung, da der Protokollierungsmodus einfach ist.)
  • Datenbank verkleinern
  • Index neu organisieren
  • Index neu erstellen
  • Statistiken aktualisieren
  • Bereinigen Sie den Verlauf

Ich möchte dem wöchentlichen Optimierungsplan zwei weitere Schritte hinzufügen:

  1. Erweitern Sie die Datenbankdatei um 500 MB, wenn der verwendete Speicherplatz einen bestimmten Schwellenwert oder eine bestimmte Gesamtgröße erreicht.
  2. Vergrößern Sie die Protokolldatei um 250 MB (nach dem Verkleinern), wenn der verwendete Speicherplatz einen bestimmten Schwellenwert der Gesamtgröße erreicht.

Ich hoffe, durch die Verlagerung der Wachstumslast in Offline-Stunden die Leistung zu verbessern, indem ich die Anzahl der automatischen Wachstumsereignisse bei hoher Belastung reduziere.

Ich habe zwei Fragen zu automatisch wachsenden Dateien.

  • Der beste Ort, um die Datei-Grow-Schritte zu platzieren, wäre vor den aktuellen Schritten oder danach?
  • Wenn ich das verwende ALTER DATABASE|MODIFY FILE, um die Datei zu vergrößern, wie kann ich dann feststellen, ob SpaceUsedInFile >= (TotalFileSpace-@AllowanceThreshold)?
Ross Bush
quelle
2
Ihre Datenbank sollte so groß sein, dass sie niemals wächst. Stellen Sie jedoch sicher, dass die sofortige Dateiinitialisierung aktiviert ist.
Remus Rusanu
3
@ Remus, obwohl ideal, sagen Sie, dass Sie jede Datenbank während Ihrer Karriere perfekt angepasst haben? Es wird immer einige Rätselraten geben und Anpassungen müssen vorgenommen werden. Ich bin damit einverstanden, dass das Wachstum kontrolliert werden sollte und nicht nur siebenmal am Tag.
Aaron Bertrand
3
@AaronBertrand: Ich befürworte stark vereinfacht, Hyperbel Beratung. Mit der Zeit habe ich gelernt, dass es besser klebt. Die meisten Benutzer können das „es kommt darauf an“ nicht bewältigen und diejenigen, die es tun, können selbst herausfinden, dass Graustufen zwischen Schwarz und Weiß liegen ...
Remus Rusanu
3
@DanAndrews: Überbelegung kann sich nachgeschaltet auswirken. Denken Sie, ein Entwickler versucht, die DB auf seinem Computer wiederherzustellen, nur um festzustellen, dass er zwei neue 1-TB-Laufwerke für 1-GB-Daten benötigt ...
Remus Rusanu
2
Ich spiele nur den Anwalt des Teufels. HDs sind jedoch billig. Zeitverlust in der Produktion für Neukonfiguration und Leistungsverlust ist teuer.
Dan Andrews

Antworten:

24

Sie sollten darauf abzielen, so wenig wie möglich automatisch zu wachsen. Sieben Mal am Tag, auch bei sofortiger Initialisierung der Dateien.

Mach keine Shrink Database. Je. Shrinkfile vielleicht, aber erst nach einem außergewöhnlichen Ereignis. Es zu verkleinern, nur um wieder zu wachsen, ist eine Übung der Sinnlosigkeit und sollte eigentlich als Auto-Fragment bezeichnet werden.

Wenn das Wiederherstellungsmodell einfach ist, sollten Sie Ihre Protokolldatei auf keinen Fall um 250 GB vergrößern müssen. Der in der Datei belegte Speicherplatz wird im Laufe der Zeit automatisch bereinigt, es sei denn, Sie haben vor einem Monat eine Transaktion gestartet und haben nicht die Absicht, sie jemals festzuschreiben oder zurückzusetzen.

Mein Rat wäre also:

Wachsen Sie die Datendatei in einer ruhigen Zeit manuell auf eine Größe, die für mehrere Monate Wachstum geeignet ist. Wofür speichern Sie es in der Zwischenzeit?

Stellen Sie das automatische Wachstumsinkrement für die Datendatei auf einen relativ kleinen Wert ein (damit Benutzer nicht unterbrochen werden, wenn dies geschieht) und melden Sie sich bei diesem Ereignis (Sie können es beispielsweise im Standard-Trace oder über "Erweitert" abfangen) Veranstaltungen). Dies kann Ihnen sagen, dass Sie den von Ihnen geschätzten Höhepunkt erreichen und es Zeit ist, erneut manuell zu wachsen. An dieser Stelle möchten Sie dieses Handbuch aufbewahren, falls Sie eine neue Datei / Dateigruppe auf einem anderen Laufwerk hinzufügen möchten, um den Speicherplatz aufzunehmen, da Sie schließlich das aktuelle Laufwerk füllen werden.

Erweitern Sie die Protokolldatei automatisch auf das Doppelte ihrer Größe. Es sollte nicht automatisch weiter wachsen, es sei denn, es gibt eine abnormale Transaktion, die die Dinge aufhält. Sie sollten auch dieses Ereignis überwachen, damit Sie über sie Bescheid wissen.

Aaron Bertrand
quelle
Vielen Dank für die Eingabe ... Ich werde Ihren Rat für das Erweitern der Protokolldatei und die Überwachung für eine Weile verwenden. Ich habe fälschlicherweise GB für MB in der Autgrow-Größe verwendet. Ich bin damit einverstanden und glaube nicht, dass die Shrink Database das tut, was sie beabsichtigt hat. Zum Jahresende erreichte die DB 15 GB, als der Job erstellt wurde, war kein Platz mehr für Backups.
+1 für sollte auto-fragment heißen :-) Hast du dafür schon ein Connect-Problem gestartet? :-)
marc_s
10

Automatisches Wachstum sollten Sie nach Möglichkeit vermeiden. Das Problem ist, dass Sie keine Kontrolle darüber haben, wann das Wachstum stattfinden kann und Ihr System dabei einen schweren Schlag erleiden kann.

Stellen Sie die Dateigröße für einen Monat oder länger auf einen vernünftigen Wert ein und überwachen Sie die Wachstumsrate. Berechnen Sie dann, wie viel Speicherplatz Sie für die x-fache Zeit veranschlagen, und stellen Sie die Größe auf diesen Wert + eine Fehlerquote ein.

Ich habe einen einfachen Überwachungsjob eingerichtet, der mich benachrichtigt, wenn die Dateigröße vor dem automatischen Wachstum ein vordefiniertes Maximum erreicht. Sie könnten so etwas verwenden:

SELECT instance_name,
       [Data File(s) Size (KB)],
       [LOG File(s) Size (KB)],
       [Log File(s) Used Size (KB)],
       [Percent Log Used]
       into ##Logsize
FROM
(
   SELECT *
   FROM sys.dm_os_performance_counters
   WHERE counter_name IN
   (
       'Data File(s) Size (KB)',
       'Log File(s) Size (KB)',
       'Log File(s) Used Size (KB)',
       'Percent Log Used'
   )
     AND instance_name = 'database your interested in' 
) AS Src
PIVOT
(
   MAX(cntr_value)
   FOR counter_name IN
   (
       [Data File(s) Size (KB)],
       [LOG File(s) Size (KB)],
       [Log File(s) Used Size (KB)],
       [Percent Log Used]
   )
) AS pvt 
go
declare @logsize int
Select @logsize = [Percent Log Used] from ##Logsize

If @logsize > the maximum percent you want the log to fill too i.e 90
    BEGIN
        --Do your thing here
    END

Drop table ##Logsize

Dies könnte natürlich als Job eingeplant werden.

Nick Winstanley
quelle
Ich entferne die "AND instance_name = 'Datenbank, an der Sie interessiert sind", damit alle Datenbanken zurückgegeben werden. Verwenden Sie dann eine Anzahl, bei der die Protokollgröße in der IF-Anweisung über einem Schwellenwert liegt. Wenn die Anzahl höher als 1 ist, führe ich eine sp_send_dbmail mit einer select name-Anweisung aus der temporären Tabelle aus, um die Namen der Protokolle per E-Mail zu senden, die über dem Grenzwert liegen.
Nick Winstanley