Frage Ist die automatische Schrumpfung von SQL Server aktiviert?


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


42
2018-06-05 23:04


Ursprung




Antworten:


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

Nein niemals.

Ich bin bei ServerFault schon mehrmals auf dieses Problem gestoßen und möchte ein nettes breites Publikum mit guten Ratschlägen erreichen. Wenn die Leute auf diese Art, Dinge zu tun, die Stirn runzeln, werde ich das gerne entfernen.

Automatisch verkleinern ist eine sehr häufige Datenbankeinstellung, die aktiviert wurde. Es scheint wie eine gute Idee - entfernen Sie den zusätzlichen Speicherplatz aus der Datenbank. Es gibt viele "unfreiwillige DBAs" da draußen (denke TFS, SharePoint, BizTalk oder nur normale alte SQL Server), die nicht wissen, dass Auto-Schrumpfung positiv böse ist.

Während ich bei Microsoft war, besaß ich die SQL Server Storage Engine und versuchte, die Auto-Shrink-Funktion zu entfernen, aber sie musste aus Gründen der Abwärtskompatibilität bestehen bleiben.

Warum ist Auto-Shrink so schlecht?

Die Datenbank wird wahrscheinlich wieder wachsen, warum also verkleinern?

  1. Shrink-grow-shrink-grow verursacht eine Fragmentierung auf Dateisystemebene und benötigt viele Ressourcen.
  2. Du kannst nicht kontrollieren, wann es eintritt (obwohl es normal ist - ish)
  3. Es verwendet viele Ressourcen. Das Verschieben von Seiten in der Datenbank erfordert CPU, viel IO und generiert viele Transaktionsprotokolle.
  4. Hier ist der eigentliche Kicker: Die Verkleinerung der Datendatei (ob automatisch oder nicht) führt zu einer massiven Indexfragmentierung, die zu einer schlechten Performance führt.

Ich habe vor einiger Zeit einen Blogbeitrag geschrieben, der ein Beispiel für ein SQL-Skript enthält, das die von ihm verursachten Probleme zeigt und etwas ausführlicher erklärt. Sehen Auto-shrink - schalte es aus! (keine Werbung oder Junk so auf meinem Blog). Verwechseln Sie das nicht mit dem Verkleinern der Protokolldatei, was gelegentlich nützlich und notwendig ist.

Also tun Sie sich einen Gefallen - schauen Sie in Ihre Datenbankeinstellungen und deaktivieren Sie die automatische Schrumpfung. Aus genau demselben Grund sollten Sie auch Ihre Wartungspläne nicht verkleinern. Verteilen Sie das Wort an Ihre Kollegen.

Edit: Ich sollte dies hinzufügen, erinnert an die zweite Antwort - es gibt ein häufiges Missverständnis, dass das Unterbrechen einer Schrumpfoperation zu Korruption führen kann. Nein, wird es nicht. Ich besaß den Verkleinerungscode in SQL Server - er rollt die aktuelle Seitenverschiebung zurück, die er macht, wenn er unterbrochen wird.

Hoffe das hilft!


67



Gibt es eine Möglichkeit, die Sie direkt nach einem Shrink neu indizieren könnten? - Lance Roberts
Nicht neu indizieren, weil das die Datei wieder vergrößert (erstellt einen neuen Index, bevor der alte gelöscht wird), aber eine Reorganisation (entweder über meinen alten DBCC INDEXDEFRAG oder den neuen ALTER INDEX ... REORGANIZE) wird die Fragmentierung auf Kosten von mehr IO, CPU, Protokollierung ... - Paul Randal
Ich habe bemerkt, dass nach dem Entfernen von Autoshrink die Speicherbelegung des srrver höher ist. - user193655


Natürlich hat Paul Recht.

Alle DBs und ihre automatische Schrumpfeinstellung anzeigen. Wenn Sie viele Datenbanken haben, schleichen Sie sich ein.

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

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


4



sys.databases hat ein Feld is_auto_shrink (und is_auto-close, is_auto_update_stats, etc) - Paul Randal
wunderbar ich googeln: Wie habe ich einen Bericht, der uns hilft zu wissen, welche dbs als Autoshrink und Ihren Code läuft gut konfiguriert und gute Bericht von allen db für uns generieren - saber tabatabaee yazdi


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

Es wird jedoch nicht für Produktionsumgebungen empfohlen, in denen sich die Datenbank entschließen könnte, eine teure Umstellungsübung zu starten, kurz bevor ein Stapel von Anfragen hereinkommt und diese Anfragen länger dauern. Es ist viel besser, wenn Sie zusammen mit anderen Wartungsvorgängen, wie z. B. Sicherungen, Terminplanungs-Verkleinerungsoperationen verwenden (tatsächlich, nach Sicherungen - es wird mehr aus dem Transaktionsprotokoll auf diese Weise). Oder Sie schrumpfen überhaupt nicht, es sei denn, es gibt ein Wachstumsproblem - Sie können immer einen Monitor einrichten, der Sie darüber informiert, wenn der ungenutzte zugewiesene Speicherplatz über ein bestimmtes Verhältnis oder eine bestimmte Größe hinaus wächst.

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


2



Shrinks sollten nicht geplant werden - sie sollten wegen der Probleme, die sie verursachen, wirklich seltene Operationen sein. Ich verstehe Ihren Kommentar zum Ausführen des Shrinks nach der Sicherung nicht. Die von der Verkleinerungsoperation generierten Protokollsätze werden von der nächsten Transaktionsprotokollsicherung aufgenommen, unabhängig davon, wann Sie dies tun oder welche anderen Sicherungen Sie durchführen. Vielen Dank - Paul Randal


In TechNet steht ein Whitepaper zur Verfügung, das die SQL-Wartung ausführlicher erläutert.

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


1



Leider richtet sich dieses Whitepaper nur an SharePoint-Installationen und hat tatsächlich einige Fehler. Ich habe gerade Zeit verbracht, den aktuellen SharePoint MCM-Kurs mit dem Whitepaper-Autor Bill Baer zu unterrichten. - Paul Randal
Eine gute allgemeine Einführung in die Datenbankwartung finden Sie in meinem Artikel im TechNet Magazin zum Thema Effektive Datenbankwartung - technet.microsoft.com/en-us/magazine/cc671165.aspx. - Paul Randal


Ich habe einen SQL Server mit aktiviertem Autogrow und Autoshrink gesehen. Dieser (relativ mächtige) Server war furchtbar langsam, weil alles, was er den ganzen Tag tat, kleiner war und die Datenbankdateien wachsen ließ. Autoshrink kann nützlich sein, aber ich würde zwei Dinge empfehlen:

  1. Schalten Sie Autoshrink standardmäßig aus.
  2. Dokumentieren Sie Ihre Serverkonfigurationen, damit Sie wissen, wo Autogrow und Autoshrink aktiviert sind und wo nicht.

1





Die einzige Zeit, die ich gezwungen wurde, eine Datenbank zu verkleinern, war, eine Kopie auf einem Testserver mit weniger Speicherplatz zu aktualisieren (nicht ausreichend, um die Produktionsdatenbank zu halten).

Die Datei (en) der Produktionsdatenbank hatten einen großzügigen freien Speicherplatz. Leider müssen Sie eine Datenbank mit den gleichen Dateigrößen wiederherstellen, mit denen Sie eine Sicherungskopie erstellt haben. So hatte er keine andere Wahl, als die Produktion zu schrumpfen, bevor er es unterstützte. (Der Shrink dauerte lange, viele Ressourcen wurden verbraucht und das anschließende Wachstum des Transaktionsprotokolls war problematisch.)


1





Schau dir auch dieses Video-Tutorial an ....

Beobachten Sie, wie Paul Randal demonstriert, wie Schrumpfung und automatische Verkleinerung schwerwiegende Fragmentierungsprobleme für Ihre Datenbank verursachen können http://wtv.watchtechvideos.com/topic194.html


1