SQL Rebuild Index, Wiederherstellungsmodell und Datenbankprotokollgröße?

7

Ich habe eine Datenbank, in der wir derzeit den ganzen Tag über Transaktionsprotokollsicherungen durchführen, um genau zu sein, alle 30 Minuten, und wir führen jeden Tag um 2 Uhr morgens eine vollständige Sicherung durch.

Jeden Samstag um 3 Uhr morgens haben wir ein Job-Setup, um die Indizes für alle Tabellen neu zu erstellen.

Wenn Sie jedoch die Indexwiederherstellung durchführen, wächst unser Transaktionsprotokoll erheblich. Ich spiele mit verschiedenen Ideen, um den zusätzlichen Speicherplatzbedarf zu verringern (ca. 25 GB nach dem erneuten Indexieren).

Ich habe überlegt, das Datenbankwiederherstellungsmodell vor der Neuerstellungsaufgabe auf einfach zu setzen, um zu verhindern, dass die gesamte Indexwiederherstellung protokolliert wird, und es dann nach Abschluss der Neuerstellung wieder auf voll zu setzen.

Verwendet noch jemand diese Methode? Oder kann jemand Einblicke / Ratschläge geben, warum dies eine schlechte Idee sein kann? Oder Tipps zum Umgang mit großen Protokolldateien bei der Ausführung von Datenbankwartungsaufgaben?

Jonvan
quelle

Antworten:

3

Hier gibt es eine Reihe von Überlegungen:

  • Einfach oder vollständig, die gleichen Daten werden in das Transaktionsprotokoll geschrieben. Der Unterschied besteht darin, dass bei der einfachen Wiederherstellung das Protokoll zwischen den Vorgängen abgeschnitten wird. Sie müssen das Protokoll vollständig sichern, um freien Protokollspeicherplatz für die Wiederverwendung freizugeben.
  • Eine oder zwei Tabellen sind möglicherweise für den Großteil der Fragmentierung verantwortlich. In diesem Fall wächst Ihr Protokoll möglicherweise unabhängig vom Wiederherstellungsmodell auf eine ähnliche Größe.
  • Sie haben festgestellt, dass für diese Datenbank eine vollständige Wiederherstellung erforderlich ist. Können Sie das Risiko eingehen, auf einfach umzusteigen, ein Problem auftritt und die Wiederherstellung zu einem bestimmten Zeitpunkt nicht möglich ist?
  • Ihr Wartungsprozess generiert 25 GB Protokoll. Auf dem neuesten Stand der Technik ist das SAN-Array, das über die Nase bezahlt wird, kein teures Stück Festplatte, das Sie benötigen.

Ein Ansatz, den ich in der Vergangenheit gewählt habe, besteht darin, Protokollsicherungen in die Skripte für die Neuindizierung / Neuerstellung einzubeziehen. Notieren Sie die Protokollgröße und den freien Prozentsatz, bevor Sie jede Tabelle verarbeiten, und überprüfen Sie anschließend den freien Prozentsatz und die Größe. Wenn weniger als x% des Speicherplatzes frei sind oder ein Protokollwachstum aufgetreten ist, sichern Sie das Protokoll.

Mark Storey-Smith
quelle
Ich markiere dies als Antwort, da ich glaube, dass wir uns mit benutzerdefinierten Skripten befassen werden, um die Indexwiederherstellung basierend auf dem aktuellen Fragmentierungsprozentsatz jedes Index durchzuführen. Außerdem implementieren wir einen Transaktionsprotokollspeicherauszug im Skript, um Speicherplatz freizugeben.
Jonvan
7

Wenn Sie zu SIMPLE wechseln, wird die Protokollkette unterbrochen. Wenn Sie zu FULL zurückkehren, müssen Sie eine neue Protokollkette starten. Dies bedeutet, dass Sie eine vollständige Sicherung durchführen und erneut neue Protokollsicherungen erstellen müssen. Die Umstellung auf einfach, egal wie kurz sie auch sein mag, schafft eine neue "Epoche" in Ihrer Sicherungskette, da jede Sicherung von vor der Umstellung auf einfach nicht mehr auf die Datenbank nach der Umstellung angewendet werden kann oder umgekehrt.

In diesem Moment müssen Sie also innehalten und überlegen: Was ist die Geschäftsanforderung, die Sie dazu veranlasst hat, zunächst ein vollständiges Wiederherstellungsmodell zu haben? Was auch immer der Grund sein mag, es ist unwahrscheinlich, dass es jeden Samstag um 3 Uhr morgens "ausgesetzt" werden kann, und es ist nur unwahrscheinlich, dass es Ihre "Epochen" -Situation toleriert, in der Sie von Freitag bis Donnerstag in der Zeit wiederherstellen können, aber nicht von Samstag an bis Freitag, weil Samstag eine neue "Epoche" ist. Mit anderen Worten, wenn Sie eine Geschäftsanforderung für das vollständige Wiederherstellungsmodell haben, sollten Sie es besser nicht brechen.

Wenn Sie jedoch keine geschäftlichen Anforderungen für das vollständige Wiederherstellungsmodell haben, haben Sie Platz zum Spielen. Und ich möchte nicht zu SIMPLE wechseln, sondern das 'andere' Wiederherstellungsmodell verwenden: BULK_LOGGED. Der Grund, warum Ihre Neuindizierungsvorgänge ein umfangreiches Protokoll generieren, ist, dass sie unter dem vollständigen Wiederherstellungsmodell auftreten. Unter BULK_LOGGED werden bei der Indexwiederherstellung (sowohl offline als auch online) minimal protokollierte Vorgänge verwendet, siehe Vorgänge , die minimal protokolliert werden können :

Wenn die Datenbank auf das einfache oder massenprotokollierte Wiederherstellungsmodell eingestellt ist, werden einige Index-DDL-Vorgänge nur minimal protokolliert, unabhängig davon, ob der Vorgang offline oder online ausgeführt wird. Die minimal protokollierten Indexoperationen lauten wie folgt:

  • CREATE INDEX-Operationen (einschließlich indizierter Ansichten).
  • ALTER INDEX REBUILD- oder DBCC DBREINDEX-Operationen.
  • DROP INDEX Neuer Heap neu erstellen (falls zutreffend).

Wenn möglich, wechseln Sie das Datenbankwiederherstellungsmodell zu BULK_LOGGED und belassen Sie es als solches.

Remus Rusanu
quelle
4
SQL2008 + Alle Online-Indexwiederherstellungsvorgänge werden vollständig protokolliert, sodass BULK_LOGGED nicht hilft. Siehe Möglicherweise stellen Sie in SQL Server 2008 und späteren Versionen eine erhöhte Größe der Transaktionsprotokolle fest, wenn Sie die Indexverwaltung durchführen .
Mark Storey-Smith
Wenn wir vor dem Wiederherstellungsjob eine vollständige Sicherung ausgeführt haben, haben wir für die Neuerstellung in den einfachen Modus gewechselt. Wenn der Wiederherstellungsjob abgeschlossen ist und ich wieder zu einfach wechsle und eine weitere vollständige Sicherung ausführe, sollte ich abgedeckt sein, richtig? Abgesehen von den 15 Minuten oder so, in denen die Wiederherstellungsaufgabe ausgeführt wird? Ich werde wahrscheinlich die Route zum Erstellen eines Skripts für die Indexwiederherstellung wählen und Protokollsicherungen im gesamten Skript integrieren. Ich denke jedoch, dass dies auf lange Sicht immer noch genauso viel zusätzlichen Festplattenspeicher erfordern wird. Aber ich denke, das ist immer noch vorteilhafter, als eine 25-GB-Protokolldatei abzuschneiden.
Jonvan
4

Beachten Sie, dass Sie im "einfachen" Modus die Möglichkeit verlieren, aus Transaktionsprotokollsicherungen zu einem bestimmten Zeitpunkt wiederherzustellen.

Wenn Sie wieder in den "Voll" -Modus wechseln, müssen Sie eine vollständige Sicherung durchführen, um die Protokollkette wiederherzustellen. Sie können die Transaktionsprotokollsicherungen erst fortsetzen, wenn Sie eine vollständige Sicherung durchgeführt haben.

Wir haben hier mit dem gleichen Problem zu kämpfen, und bis jetzt ist geplant, Protokollsicherungen häufiger durchzuführen und sie auf externem Speicher zu halten (dh nicht auf demselben Server).

dmc
quelle
Ja, ich denke, wir könnten ein bisschen Zeit während der Indexwiederherstellung opfern. Unsere Wiederherstellungsaufgabe dauert nur etwa 15 Minuten, und um 3 Uhr morgens sollten ohnehin nicht viele neue Daten in das System eingehen. Ich würde mir also im Grunde nur eine zweite vollständige Sicherung ansehen, um die Protokollkette neu zu starten.
1

Bevor ich über eine Änderung des einfachen Modus nachdenke, möchte ich Folgendes betrachten:

  1. Ändern Sie den Indexwiederherstellungsjob so, dass er nur basierend auf der Fragmentierungsstufe neu erstellt wird.
  2. Partitionieren Sie nur die aktiven Partitionen neu.
  3. Verteilen Sie die Arbeitslast auf mehrere Nächte.
  4. Überprüfen Sie Ihre Clustered-Indizes, um sicherzustellen, dass sie zu Ihren Datensatzzusätzen passen.
SqlACID
quelle