Kann ich die Transaktionsprotokolldatei in einer Spiegeldatenbank verkleinern?

9

Dies ist eine Folgefrage zu einer früheren Frage, warum ich die Protokolldatei in der Hauptdatenbank nicht verkleinern konnte.

Um es kurz zu machen, ich habe die Datenbankspiegelung eingerichtet, aber vergessen, sicherzustellen, dass der Job, der das Transaktionsprotokoll gesichert hat, erneut ausgeführt wurde und das Transaktionsprotokoll auf fast 60 GB angewachsen ist.

Da die Spiegelung eingerichtet wurde, wurde diese Vergrößerung auf dem gespiegelten Server dupliziert und nahm schließlich den gesamten Speicherplatz in Anspruch und machte die Spiegeldatenbank unbrauchbar.

Bei dieser Frage zur Pflege von Transaktionsprotokollen in einer Spiegeldatenbank können Sie das Protokoll auf dem Spiegel nicht sichern. Wenn Sie jedoch speziell in Kommentaren zum Verkleinern einer überwucherten Protokolldatei in einer Spiegeldatenbank gefragt werden, wurde ein Kommentar hinterlassen

Eine Möglichkeit, dies zu tun, besteht darin, ein Failover auf die gespiegelte Datenbank durchzuführen und dort zu verkleinern. Testen Sie dies gründlich in einer Umgebung ohne Produktion, um sicherzustellen, dass es das gewünschte / erwartete Verhalten aufweist.

Dies scheint darauf hinzudeuten, dass es andere Möglichkeiten gibt, die Protokolldatei auf einem Spiegel zu verkleinern, und dass diese Methode auf einem Produktionsserver möglicherweise nicht unbedingt sicher ist.

Gibt es eine Möglichkeit, die Transaktionsprotokolldatei auf einem Datenbankspiegel sicher zu verkleinern?

Rachel
quelle
2
Die einzige unterstützte Möglichkeit besteht darin, die Datei auf dem Principal zu verkleinern, wodurch auch die Datei auf dem Spiegel verkleinert wird. Wenn Ihr Spiegel nicht mehr mit dem Principal identisch ist, möchten Sie wirklich nicht versuchen, ein Failover auf den Spiegel durchzuführen. Unterbrechen Sie die Spiegelung und erstellen Sie sie neu, wie Sie in Ihrer vorherigen Frage gesagt haben.
Max Vernon

Antworten:

6

Der DBCC SHRINKFILEBefehl wird vom Prinzipal in die gespiegelte Datenbank gespiegelt. Hier ist ein Beweis.

Erstellen Sie eine Beispieldatenbank auf dem Principal:

create database MirroredDb;
go

Erstellen Sie dieselbe Datenbank aus einer Sicherung mit NORECOVERY:

restore database MirroredDb
from disk = '\\backupdir\MirroredDb.bak'
with norecovery;
go

Richten Sie Ihre Spiegelungssitzung nach Ihren Wünschen ein.

Auf der Prinzipaldatenbank Blick auf die Datenbank Dateigrößen:

use MirroredDb;
go

select
    name,
    size
from sys.database_files;

Meine Ergebnismenge sieht folgendermaßen aus:

name            size
MirroredDb      392
MirroredDb_log  104

Erstellen Sie in der Spiegeldatenbank einen Schnappschuss und sehen Sie sich dieselben Informationen an:

create database MirroredDbss
on
(
    name = 'MirroredDb',
    filename = 'c:\sqlserver\MirroedDb.ss'
)as snapshot of MirroredDb;

use MirroredDbss;
go

select
    name,
    size
from sys.database_files;

Meine Ergebnismenge sieht folgendermaßen aus:

name            size
MirroredDb      392
MirroredDb_log  104

Erweitern Sie nun die Transaktionsprotokolldatei in der Hauptdatenbank (ich habe sie auf 1 GB gebracht):

alter database MirroredDb
modify file
(
    name = MirroredDb_log,
    size = 1GB
);
go

Wenn wir uns die Transaktionsprotokollgröße der Hauptdatenbank ansehen, sehen wir jetzt die angepasste Größe:

use MirroredDb;
go

select
    name,
    size
from sys.database_files;

Meine Ergebnismenge sieht folgendermaßen aus:

name            size
MirroredDb      392
MirroredDb_log  131072

Erstellen Sie einen weiteren Snapshot in der gespiegelten Datenbank und überprüfen Sie dort die Größe der Transaktionsprotokolldatei:

create database MirroredDbss2
on
(
    name = 'MirroredDb',
    filename = 'c:\sqlserver\MirroedDb2.ss'
)as snapshot of MirroredDb;

use MirroredDbss2;
go

select
    name,
    size
from sys.database_files;

Meine Ergebnismenge sieht folgendermaßen aus:

name            size
MirroredDb      392
MirroredDb_log  131072

Machen Sie jetzt das DBCC SHRINKFILEauf dem Prinzip :

use MirroredDb;
go

dbcc shrinkfile('MirroredDb_log', 0);
go

select
    name,
    size
from sys.database_files;

Meine Ergebnismenge ist folgende:

name            size
MirroredDb      392
MirroredDb_log  104

Erstellen Sie einen dritten und letzten Schnappschuss in der gespiegelten Datenbank und sehen Sie sich die Größe an:

create database MirroredDbss3
on
(
    name = 'MirroredDb',
    filename = 'c:\sqlserver\MirroedDb3.ss'
)as snapshot of MirroredDb;

use MirroredDbss3;
go

select
    name,
    size
from sys.database_files;

Und ich bekomme folgende Ergebnismenge:

name            size
MirroredDb      392
MirroredDb_log  104

Wie Sie hier sehen können, wird der DBCC SHRINKFILEBefehl tatsächlich in die Spiegeldatenbank gespiegelt.

Thomas Stringer
quelle
Vielen Dank. Ich habe nicht bemerkt, dass die Größe der Protokolldatei auch vom Hauptserver kopiert wurde. Ist die einzige Lösung, um den Spiegel zu löschen und neu zu erstellen, falls der Spiegel aufgrund der Größe des Transaktionsprotokolls nicht funktioniert? Es gibt keine Möglichkeit, das Spiegelprotokoll sicher zu verkleinern, wenn der Spiegelungsprozess nicht funktioniert.
Rachel
Sie können keine Verbindung zur gespiegelten Datenbank herstellen, daher können Sie die Datenbank nicht ausführen DBCC SHRINKFILE. Wenn Sie Ihre Spiegelsitzung reparieren können, ohne die Spiegelung in dieser Datenbank zu entfernen, müssten dort weitere Untersuchungen durchgeführt werden. Es scheint, als wäre es wegen der Dateigröße angehalten worden. Haben Sie versucht, den Partner wieder aufzunehmen?
Thomas Stringer
Ja, aber es wurde sofort wieder suspendiert. Ich gehe davon aus, dass seit dem Stoppen der Spiegelung zu viel Zeit vergangen ist, sodass noch viele Daten übertragen werden müssen, bevor sie zum Teil "Protokolldatei verkleinern" gelangen. Ich hatte gehofft, dass es einen anderen Weg gibt, den ich einfach nicht kannte, wie etwas, das ich aus der Spiegeldatenbank ausführen könnte, um die Datei zu verkleinern, oder eine Manipulation des Dateisystems, aber das scheint nicht der Fall zu sein. Ihre Antwort ist immer noch sehr hilfreich, also danke :)
Rachel
Hoffe nicht mehr. Sobald die Datenbank angehalten / getrennt wird und eine Protokollsicherung auf der Primärdatenbank ausgeführt wird, ist es ziemlich schwierig, den Spiegel ohne erneute Initialisierung wieder synchron zu machen.
Jason Cumberland