Ist es sicher, dass die automatische Verkleinerung von SQL Server aktiviert ist?

44

Es gibt viele SQL Server-Optionen, die für Datenbanken aktiviert werden können, und eine der am häufigsten missverstandenen ist das automatische Verkleinern. Ist es sicher? Wenn nein, warum nicht?

Paul Randal
quelle

Antworten:

70

(Ich habe ursprünglich als normale Frage gestellt, dann aber die richtige Methode herausgefunden - danke BrentO)

Nein niemals.

Ich bin auf ServerFault schon mehrmals darauf gestoßen und möchte mit guten Ratschlägen ein nettes, breites Publikum erreichen. Wenn die Leute über diese Art und Weise die Stirn runzeln, stimmen sie ab und ich werde das gerne entfernen.

Das automatische Verkleinern ist eine sehr häufig zu aktivierende Datenbankeinstellung. Es scheint eine gute Idee zu sein - entfernen Sie den zusätzlichen Speicherplatz aus der Datenbank. Es gibt viele "unfreiwillige DBAs" (denken Sie an TFS, SharePoint, BizTalk oder einfach an normalen alten SQL Server), die möglicherweise nicht wissen, dass das automatische Verkleinern absolut böse ist.

Während meiner Zeit bei Microsoft besaß ich die SQL Server Storage Engine und versuchte, die Funktion zum automatischen Verkleinern zu entfernen, sie musste jedoch aus Gründen der Abwärtskompatibilität beibehalten werden.

Warum ist das automatische Schrumpfen so schlecht?

Es ist wahrscheinlich, dass die Datenbank erneut wächst. Warum also verkleinern?

  1. Shrink-Grow-Shrink-Grow führt zu einer Fragmentierung auf Dateisystemebene und beansprucht viele Ressourcen.
  2. Sie können nicht steuern, wann es losgeht (obwohl es normal ist)
  3. Es verbraucht viele Ressourcen. Das Verschieben von Seiten in der Datenbank beansprucht CPU, viel E / A und generiert viel Transaktionsprotokoll.
  4. Hier ist der wahre Kicker: Das Verkleinern von Datendateien (ob automatisch oder nicht) führt zu einer massiven Indexfragmentierung, was zu einer schlechten Leistung führt.

Vor einiger Zeit habe ich einen Blog-Beitrag verfasst, der ein SQL-Beispielskript enthält, das die dadurch verursachten Probleme aufzeigt und etwas ausführlicher erklärt. Siehe Automatisch verkleinern - ausschalten! (keine Werbung oder ähnlicher Müll auf meinem Blog). Verwechseln Sie dies nicht mit dem Verkleinern der Protokolldatei, was gelegentlich nützlich und notwendig ist.

Tun Sie sich selbst einen Gefallen - sehen Sie in Ihren Datenbankeinstellungen nach und deaktivieren Sie die automatische Verkleinerung. Aus genau dem gleichen Grund sollten Sie Ihre Wartungspläne auch nicht verkleinern. Teilen Sie es Ihren Kollegen mit.

Bearbeiten: Ich sollte dies hinzufügen, erinnert an die zweite Antwort - es gibt ein weit verbreitetes Missverständnis, dass das Unterbrechen eines Verkleinerungsvorgangs zu Korruption führen kann. Nein, wird es nicht. Früher besaß ich den Verkleinerungscode in SQL Server - er setzt die aktuelle Seitenverschiebung zurück, die ausgeführt wird, wenn sie unterbrochen wird.

Hoffe das hilft!

Paul Randal
quelle
Gibt es eine Möglichkeit, die Sie direkt nach einem Schrumpf neu indizieren könnten?
Lance Roberts
4
Nicht neu indizieren, da dadurch die Datei erneut vergrößert wird (es wird ein neuer Index erstellt, bevor der alte gelöscht wird), sondern eine Neuorganisation (entweder über mein altes DBCC INDEXDEFRAG oder das neue ALTER INDEX ... REORGANIZE) auf Kosten von mehr IO, CPU, Protokollierung ...
Paul Randal
Mir ist aufgefallen, dass nach dem Entfernen von Autoshrink die Speichernutzung des srrvers höher ist.
user193655
4

Natürlich hat Paul Recht.

Alle DBs und ihre Autoshrink-Einstellungen anzeigen. Wenn Sie viele Datenbanken haben, wird man sich einschleichen.

sp_msforeachdb  @command1 = 'Select ''[?]'',DATABASEPROPERTYEX(''?'',''IsAutoShrink'')'

Ist das irgendwo im dmv .... Ich frage mich.

Sam
quelle
2
sys.databases hat ein Feld is_auto_shrink (und is_auto-close, is_auto_update_stats, etc)
Paul Randal
wunderbar im googeln: wie habe ich einen bericht bekommen, der uns hilft zu wissen, welche dbs als autoschrumpf konfiguriert sind und ihr code läuft gut und generiert einen guten
bericht
2

Es ist nicht "unsicher" - es wird nichts beschädigen.

Es wird jedoch nicht für Produktionsumgebungen empfohlen, in denen sich die Datenbank möglicherweise dazu entschließt, eine kostspielige Neuanordnung vorzunehmen, bevor ein Stapel von Anforderungen eingeht, sodass die Bearbeitung dieser Anforderungen länger dauert. Sie sind viel besser dran, wenn Sie die Planung von Verkleinerungsvorgängen zusammen mit anderen Wartungsvorgängen, wie z. B. Sicherungen, verwenden (tatsächlich nach Sicherungen - auf diese Weise wird mehr aus dem Transaktionsprotokoll entnommen). Sie können jederzeit einen Monitor einrichten, der Sie darüber informiert, wenn der nicht verwendete zugewiesene Speicherplatz ein bestimmtes Verhältnis oder eine feste Größe überschreitet.

IIRC Die Option ist standardmäßig für alle Datenbanken in allen MSSQL-Editionen mit Ausnahme von Express deaktiviert.

David Spillett
quelle
2
Shrinks sollten nicht eingeplant werden - sie sollten aufgrund der von ihnen verursachten Probleme wirklich seltene Operationen sein. Ich verstehe Ihren Kommentar zum Ausführen der Verkleinerung nach der Sicherung nicht. Die durch die Verkleinerung generierten Protokollsätze werden bei der nächsten Transaktionsprotokollsicherung erfasst, unabhängig davon, wann Sie dies tun oder welche anderen Sicherungen Sie vornehmen. Vielen Dank
Paul Randal
1

Im TechNet ist ein Whitepaper verfügbar, in dem die SQL-Wartung ausführlicher erläutert wird.

http://technet.microsoft.com/en-us/library/cc262731.aspx

Jeremy Thake
quelle
Leider richtet sich dieses Whitepaper nur an SharePoint-Installationen und weist tatsächlich einige Fehler auf. Ich habe gerade Zeit damit verbracht, die aktuelle SharePoint-MCM-Klasse mit dem Autor des Whitepapers, Bill Bär, zu unterrichten.
Paul Randal
3
Eine gute allgemeine Einführung in die Datenbankwartung finden Sie in meinem TechNet Magazine-Artikel zum Thema Effektive Datenbankwartung - technet.microsoft.com/en-us/magazine/cc671165.aspx .
Paul Randal
1

Ich habe einen SQL Server mit aktiviertem Autogrow und Autoshrink gesehen. Dieser (relativ leistungsfähige) Server war furchtbar langsam, da er den ganzen Tag nur die Datenbankdateien verkleinerte und vergrößerte. Autoshrink kann nützlich sein, aber ich würde zwei Dinge empfehlen:

  1. Deaktivieren Sie Autoshrink standardmäßig.
  2. Dokumentieren Sie Ihre Serverkonfigurationen, damit Sie wissen, wo Autogrow und Autoshrink aktiviert sind und wo nicht.
Carl C
quelle
1

Das einzige Mal, dass ich gezwungen war, eine Datenbank zu verkleinern, war das Aktualisieren einer Kopie auf einem Testserver mit weniger Speicherplatz (nicht ausreichend, um die Produktionsdatenbank zu speichern).

Die Datei (en) der Produktionsdatenbank verfügten über ausreichend freien Speicherplatz. Leider müssen Sie eine Datenbank mit den gleichen Dateigrößen wiederherstellen, mit denen Sie sie gesichert haben. Es blieb also nichts anderes übrig, als die Produktion zu verkleinern, bevor sie gesichert wurde. (Die Verkleinerung dauerte Ewigkeiten, es wurden viele Ressourcen verbraucht und das anschließende Wachstum des Transaktionsprotokolls war problematisch.)

SuperCoolMoss
quelle
1

Schauen Sie sich auch dieses Video-Tutorial an ....

Sehen Sie, wie Paul Randal demonstriert, wie das Verkleinern und automatische Verkleinern schwerwiegende Fragmentierungsprobleme für Ihre Datenbank verursachen kann. Http://wtv.watchtechvideos.com/topic194.html

Sakthivel Chidambaram
quelle