Wie kann verhindert werden, dass das Transaktionsprotokoll während der Indexreorganisation voll wird?

19

Wir haben mehrere Computer, auf denen wir die Größe des Transaktionsprotokolls vorab auf 50 GB festgelegt haben. Die Größe der Tabelle, die ich neu organisieren möchte, liegt zwischen 55 und 60 GB, wird aber kontinuierlich zunehmen. Der Hauptgrund, den ich neu organisieren möchte, besteht darin, Speicherplatz freizugeben, und jeder Leistungsvorteil, der sich daraus ergibt, ist ein zusätzlicher Bonus.

Der Fragmentierungsgrad der Tabelle beträgt 30 - 35%. Auf einigen dieser Maschinen erhalte ich den Fehler "Transaktionsprotokoll voll" und die Reorganisation schlägt fehl. Die Transaktionsprotokollgröße erreicht bis zu 48 GB. Was ist ein guter Weg, um dem entgegenzuwirken? Wir haben keine automatische Inkrementierung aktiviert, und ich zögere, dies zu tun.

Ich kann die Protokollgröße auf einen größeren Wert erhöhen, aber da die Tabellengröße in Zukunft zunimmt, reicht der Wert möglicherweise nicht aus. Außerdem wird der Zweck einer Neuorganisation, um Speicherplatz freizugeben, außer Kraft gesetzt, wenn die Protokollgröße gleichermaßen erhöht wird. Irgendwelche Ideen, wie ich dem effektiv entgegenwirken kann? Die Verwendung des Bulk-Modus ist keine Option, da ein Datenverlust nicht akzeptabel ist.

Paul White sagt GoFundMonica
quelle

Antworten:

7

Best Practice ist es, die REORGANIZEFragmentierung unter 30% und REBUILDdarüber zu halten. Einfach, REBUILDmacht eine saubere Kopie, REORGANIZEmacht es in-situ.

Überprüfen Sie, was Sie tatsächlich tun: Sie haben keinen Wartungsplan für beide, oder?

Bei größeren Tabellen (50-GB-Tabelle wird angezeigt) wird der REORGANIZEgesamte Transaktionsprotokollspeicher belegt, wenn Sie diese Regel befolgen. Nicht oft: nur ein System mit einem bestimmten Lastmuster. Das REORGANIZElief nur so lange, bis das Protokoll erweitert und den gesamten Speicherplatz belegt hat.

Wir sind REBUILDstattdessen ohne weitere Probleme zu gewechselt , haben jedoch die Fragmentierung unter 25% ignoriert. Das hat bei uns besser funktioniert: Sie müssen sehen, ob es bei Ihnen funktioniert.

REBUILDkann die Leistung stärker beeinträchtigen als REORGANIZEin der Produktion, dies kann jedoch manchmal mit der ONLINEOption (Enterprise Edition erforderlich) gemindert werden .

gbn
quelle
Faustregel-Zahlen und qualitatives und quantitatives Sprechen sind sehr hilfreich.
Robino
6

REORGANIZE (wie in ALTER INDEX ... REORGANIZE) ist eine sehr schnelle Operation (meistens ...), die wenig Protokoll erfordert, jederzeit unterbrochen und später fortgesetzt werden kann und intern in kleinen Batch-Transaktionen ausgeführt wird :

Die Defragmentierung wird als eine Reihe von kurzen Transaktionen ausgeführt. Ein großes Protokoll ist daher nicht erforderlich, wenn häufig Protokollsicherungen durchgeführt werden oder wenn das Wiederherstellungsmodell auf EINFACH eingestellt ist.

Sind Sie sicher, dass Sie nicht über einen Umbau sprechen ? Ein Index REBUILD ist langsam, teuer, verbraucht eine enorme Menge an Protokoll (wenn er nicht offline ist und nicht minimal protokolliert werden kann, kann ein Online-Neuaufbau nicht minimal protokolliert werden), ist eine einzelne große Transaktion und kann nicht unterbrochen werden, ohne die gesamte Arbeit zu verlieren.

Es scheint mir, dass Sie gerade einen Umbau durchführen. Dies ist eine wirklich außergewöhnliche Operation, die Sie nicht durchführen sollten, es sei denn, Sie haben sehr gute Gründe. Auf welche Art von Raumrückgewinnung hüpfen Sie? Irgendetwas, DBCC CLEANTABLEdas nicht geht? Haben Sie die physische Struktur der Tabelle überprüft, ist sie von der logischen Struktur abgewichen ( Details finden Sie in den SQL Server-Tabellenspalten unter der Haube )?

Wenn Sie den Tisch wirklich neu aufbauen müssen, haben Sie leider keine andere Wahl, als die Kugel zu beißen und das erforderliche Protokoll zuzuweisen. Lass es nicht automatisch wachsen, es verlangsamt nur den Prozess. Wachsen Sie es auf das 2,5-fache der Tischgröße vor.

Wenn die Tabelle partitioniert ist, können Sie offline jeweils eine Partition neu erstellen (und neu organisieren). Online-Neuerstellungen können nur auf der gesamten Tabellenebene durchgeführt werden.

Remus Rusanu
quelle
2
Ich reorganisiere gerade. Das Wiederherstellungsmodell ist voll und es wird eine große Transaktionsprotokollgröße angezeigt. Der Grund für den Fehler ist eine der beiden 1. Spiegelungen. Das Protokoll muss auf den sekundären Speicher verschoben werden, bevor 2. Speicherplatz zurückgefordert werden kann. Obwohl alle 15 Minuten Backups erstellt werden, schlägt dies manchmal fehl.
Gleiche Situation hier, 2008R2, Index reorganisieren (nicht neu erstellen), und selbst im einfachen Modus (!) Wächst das tlog auf mehr als die Größe der größten Tabelle, die> 40 GB ist. Im vollständigen Wiederherstellungsmodus hilft es auch nicht, 5-minütige tlog-Sicherungen durchzuführen. Während der Indexreorganisation wird nur eine große TRN-Sicherungsdatei erstellt. Es scheint keinen Sinn zu machen, aber es ist das gleiche Verhalten auf zwei verschiedenen Servern. Irgendeine Idee wie tatsächlich spaltet diese in kleinen Batch Transaktionen dokumentiert?
RealMarkusSchmidt
5

Ich hatte dieses Problem schon einmal.

  • Sie haben eine große Datenbank und ein kleines Protokolllaufwerk. Sie möchten eine Reorganisation durchführen (aus verschiedenen Gründen).
  • Wenn Sie dies für eine große fragmentierte Tabelle versuchen, wird das Protokoll gefüllt, bis das Protokolllaufwerk voll ist, und der Befehl wird abgebrochen.
  • Im einfachen Modus schlagen andere Transaktionen möglicherweise fehl, bis das Protokoll beim nächsten Prüfpunkt gelöscht wird. Im vollständigen Modus schlagen andere Transaktionen möglicherweise bis zur nächsten Protokollsicherung fehl. Ausfall!
  • Wenn Sie sich im Vollmodus befinden, erhöhen Sie die Häufigkeit der Protokollsicherungen, dies hilft jedoch nicht, da die Reorganisation in einer impliziten Transaktion erfolgt. Das Protokoll wird erst dann gelöscht, wenn diese Transaktion abgeschlossen oder abgebrochen oder gestoppt wurde.
  • Und Sie möchten WIRKLICH, dass die Reorganisation vollständig ausgeführt wird.

Dies ist etwas kontraintuitiv, da Sie wissen, dass bei einem Abbruch der Reorganisation die Transaktion an der Stelle fortgesetzt werden kann, an der sie aufgehört hat.

Hier ist was du tust. Es ist etwas lang, aber unkompliziert.

  • Erweitern Sie Ihre Protokolldatei vorab auf eine relativ große Größe, jedoch nicht die maximale Größe. Grundsätzlich sollten Sie genügend Platz lassen, um nützliche Arbeiten ausführen zu können, sowie einige kleine Wachstumsraten, falls diese auftreten, damit der normale Betrieb nicht aufhört.
  • Erstellen Sie einen Job, um die Indexreorganisation auszuführen ('Reorganize').
  • Erstellen Sie eine Agent-WMI-Warnung ('Relief Valve reorganisieren') für eine Leistungsbedingung.

    • Objekt: SQLServer: Datenbanken
    • Leistungsindikator: Verwendetes Prozentprotokoll
    • Instanz: (Ihr großer Datenbankname)
    • Alarm, wenn der Zähler über 80 steigt
    • Antwort: Job ausführen ('Check reorganisieren')
  • Erstellen Sie einen Job ('Reorganize Check')

    • Überprüfen Sie im Job msdb.dbo.sysjobactivity, ob der Job 'Reorganize' ausgeführt wird. Und wenn es ist ...
    • Stoppen Sie den Job und rufen Sie ihn ab, bis er stoppt. Dies kann einige Sekunden dauern.
    • (Wenn Sie sich im Vollmodus befinden) Lösen Sie Ihren Protokollsicherungsjob aus und bestätigen Sie, wenn er abgeschlossen ist.
    • Überprüfen Sie die sys.dm_os_performance_counters, die Ihr Leistungsindikator für den freien Speicherplatz unter Ihren Schwellenwert gesenkt hat.
    • Starten Sie den Job "Reorganisieren".
  • Testen Sie dies alles irgendwo, sogar in einer Entwicklungs-Sandbox, um sicherzustellen, dass es ordnungsgemäß funktioniert, bevor Sie es auf Ihren Produktionsserver kleben.

Was Sie sehen, ist, dass der "Reorganisieren" -Job startet und beginnt, das Protokoll zu füllen. Wenn das Protokoll einen prozentualen Füllstand erreicht, wird die WMI-Warnung (innerhalb von 30 Sekunden) ausgelöst, die Ihren anderen Job ausführt. Dabei wird festgestellt, dass der Job "Reorganisieren" ausgeführt wird und möglicherweise ein Fehler vorliegt. Anschließend wird "Reorganisieren" gestoppt, eine Sicherungskopie erstellt, bestätigt, dass der freie Speicherplatz für Protokolle wieder einen vernünftigen Wert aufweist, und anschließend wird der "Reorganisieren" -Job erneut gestartet, der dort fortgesetzt wird, wo er aufgehört hat.

In diesem Szenario können Sie die Größe Ihres Protokolls auf einen vernünftigen Wert einstellen, indem Sie die Anzahl der Schritte Wachstum / Trigger / Job / Stopp / Neustart verringern, damit es effizienter wird und auch genügend Speicherplatz für das Protokoll bleibt gelegentliche Wucherungen, die nicht rechtzeitig erfasst werden.

Dies ist eine Art seltsames Szenario. Ich bin mir ziemlich sicher, dass ich mich vor ein paar Jahren darüber hinweggesetzt hätte, und offensichtlich gibt es hier grundlegende Probleme. Wenn Sie sich jedoch mit Hunderten von Servern befassen, treten einige Randfälle wie diese auf, die aus geschäftlichen Gründen in keiner Weise behoben werden können, außer durch MacGyvering, eine temporäre Lösung, die die Aufgabe erledigt.

Solange es sicher, logisch, getestet und gut dokumentiert ist, sollte es kein Problem geben.

Cody Konior
quelle
1

Dies ist, was ich normalerweise getan habe (ich habe auch ein paar Tabellen mit jeweils 80 + GB) für die Index-Neuorganisation (da die Index-Neuorganisation jederzeit gestoppt werden kann, ohne die vorherige Neuordnungsarbeit zu verlieren).

  1. Während der Index-Neuorganisation erhöhe ich die tlog-Sicherung von meiner regulären 30-Minuten-Frequenz auf jede 10-Minuten-Frequenz
  2. Ich habe eine andere Sitzung, die alle 1 Minute eine Überprüfung des freien Speicherplatzes durchführt, und wenn der freie Speicherplatz des Protokolls unter einem Schwellenwert liegt, stoppe ich die Index-Neuordnungssitzung und starte (oder warte) die Sicherung des Protokolls. Starten Sie anschließend den Index-Reorg neu.

In meinem Indexpflege-Framework kategorisiere ich die Indizes in zwei Gruppen, eine für die Indexwiederherstellung und eine für die Indexwiederherstellung. Für die Indexwiederherstellung verwende ich einen etwas anderen Ansatz, da ich eine Indexwiederherstellungssitzung nicht anhalten möchte (wodurch ein Rollback verursacht wird und alle vorherigen Arbeiten verloren gehen). Wenn meine Überwachungssitzung während der Indexwiederherstellung feststellt, dass ein Szenario mit freiem Speicherplatz für die Protokolldatei belegt ist, erhöht die Überwachungssitzung die Protokolldatei automatisch vorab. aber später werde ich es fallen lassen) auf einem anderen Laufwerk (das Backup-Laufwerk)

jyao
quelle
1

Ich hatte das gleiche Problem wie der Frageautor, und wenn ich mir seine Kommentare ansehe, kann ich sagen, dass ich das gleiche Setup hatte. Während ich versucht habe, eine zu erstellen REORGANIZE, wird das Protokoll unabhängig von der Größe auf das Mehrfache der Größe der gesamten Tabelle erweitert.

Das Problem wurde durch die Transaktionsreplikation verursacht . Anscheinend kann das Protokoll erst mit dem gesichert werdenREORGANIZE Vorgang abgeschlossen ist. Ich habe irgendwo gelesen, dass es sich um ein bekanntes Problem von Microsoft handelt, bin mir aber nicht sicher, wo.

Sobald ich die Transaktionsreplikation deaktiviert hatte, funktionierten die Protokollsicherungen wieder normal und alle 30 Sekunden wurden Protokollsicherungen durchgeführt, während die Reorganisation für mich erfolgreich war.

IUmpierrez
quelle
0

Ich gehe davon aus, dass Sie etwas in der Art von:

ALTER INDEX ON REORGANIZE

Leider gibt es keine Möglichkeit, eine teilweise Organisation auszuführen (wie Sie beispielsweise eine Protokolldatei teilweise verkleinern können). Die Möglichkeiten, wie ich diese Probleme betrachten kann, sind:

1) Versetzen Sie die Datenbank in den einfachen Wiederherstellungsmodus, während Sie die Reorganisation ausführen. Dies ist jedoch nicht akzeptabel

2) Partitionieren Sie den Index. Wenn Sie eine Möglichkeit finden, den Index zu partitionieren, um ungefähr gleich große Partitionen zu erhalten, können Sie jede Partition unabhängig neu organisieren (oder mit der Online-Option neu erstellen) und so das Wachstum der Protokolldateien begrenzen

Ich bin sicher, dass Sie dies tun, aber wenn Sie dies nicht tun, möchten Sie möglicherweise eine Protokolldateisicherung initiieren, bevor und nachdem Sie Indexoptimierungen vorgenommen haben, damit der verwendete Speicherplatz wieder freigegeben werden kann.


quelle