Durch das Verkleinern der Protokolldatei wird die Größe nicht verringert

23

Ich habe eine Datenbank mit einer 350-MB- Datendatei (.mdf) und einer 4,9-GB-Protokolldatei (.ldf). Das Wiederherstellungsmodell ist auf festgelegt FULL.

Wenn ich versuche, die Protokolldatei zu verkleinern, wird sie nicht verkleinert.

Ich weiß, dass das Verkleinern einer Datenbank nicht gut ist und nicht durchgeführt werden sollte. Aber ich versuche immer noch, es zu tun, um die Protokolldatei zu verkleinern.

Als ich rannte

DBCC SQLPerf(logspace) 

Ich habe festgestellt, dass die Protokollgröße 4932 MB und der verwendete Protokollspeicher 98,76% beträgt !

Dann habe ich diesen Befehl ausprobiert

USE <databasename>;
DBCC loginfo;

Jetzt haben fast alle VLFs den Status 2, was bedeutet, dass alle verwendet werden.

Ich habe versucht, eine Protokollsicherung zu erstellen und die Protokolldatei anschließend zu verkleinern. Durch das Schrumpfen wurde die Größe nicht verringert.

Ich habe das Wiederherstellungsmodell auf geändert SIMPLEund erneut versucht, es zu verkleinern, aber das hat auch nicht geholfen.

Ich habe nach offenen Transaktionen gesucht

DBCC opentran (database);

und festgestellt, dass keine Transaktion jetzt geöffnet ist.

Was hindert mich daran, die Protokolldatei zu verkleinern? Wie kann ich das lösen?

Navaneet
quelle

Antworten:

12

Hier ist die Antwort auf meine eigene Frage.

Führen Sie die folgende Abfrage aus, um Informationen zur Wartezeit für die Wiederverwendung der Protokolldatei abzurufen:

SELECT log_reuse_wait_desc
FROM sys.databases
WHERE name = 'DBName'

Ich habe folgende Ausgabe erhalten:

log_reuse_wait_desc
-------------------
REPLICATION 

Auch nach dem Entfernen der Replikation waren noch einige replikationsbezogene Objekte in der Datenbank vorhanden.

Um die Replikation aus der Datenbank zu entfernen, sp_removedbreplicationkann verwendet werden. Bei uns funktionierte dies jedoch nicht, da die Replikation zu diesem Zeitpunkt noch nicht aktiv war und die Replikation bereits lange zuvor entfernt wurde.

Die Lösung bestand darin, den Datenbankinhalt mithilfe der Importoption von SQL Server in eine andere Datenbank zu importieren.

Navaneet
quelle
Ich hatte das gleiche Problem und habe damit festgestellt, dass in der Datenbank eine Transaktion aktiv war. log_reuse_wait_descgab ACTIVE_TRANSACTION. Sobald die Transaktion abgeschlossen war, funktionierte der Shrink einwandfrei.
Squillman
10

Schritte zum Verkleinern des Protokolls werden sein

Sichern Sie das Transaktionsprotokoll über SSMS oder T-SQL, und führen Sie dann eine Verkleinerung durch

Befehle für SSMS befinden sich unter den Tasks, wenn Sie mit der rechten Maustaste auf den Datenbanknamen klicken

BACKUP LOG <Databasename> TO DISK N'<path\database_log.ldf';
GO

DBCC SHRINKFILE (<FileName>, <TargetSize>) WITH NO_INFOMSGS

Sie müssen dies wahrscheinlich mehrmals tun

Wenn eine Transaktion oder ein Auftrag die Aktion blockiert, verwenden Sie die Aktivitätsüberwachung, um den Prozess zu identifizieren und abzubrechen, oder verwenden Sie die Aktivitätsüberwachung des SQL Agent-Auftrags, um den Auftrag zu beenden.

Quelle: http://support.microsoft.com/kb/907511

Cougar9000
quelle
Aber das Problem, auf das ich gestoßen bin, ist anders.
Bitte
Schön zu hören, dass du es herausgefunden hast, danke für das Update!
Cougar9000
Falsche Syntax - es fehlt ein Gleichheitszeichen: BACKUP LOG <Datenbankname> TO DISK = N '<Pfad \ Datenbank_log.ldf';
Reverse Engineer
9

Lesen Sie, wie Sie das SQL Server-Protokoll verkleinern, um zu erfahren, wie die Zirkularität des Protokolls das Verkleinern nach dem Abschneiden verhindern kann. Möglicherweise protokollieren Sie den letzten LSN- Punkt in einer VLF, die sich am Ende der LDF befindet. Sie müssen das Protokoll entgegen der Intuition weiterentwickeln, indem Sie Protokollschreibvorgänge generieren, damit es verkleinert werden kann.

Remus Rusanu
quelle
0

Sie müssen zuerst eine Sicherung erstellen, abhängig vom für die Datenbank eingerichteten Sicherungsmodell, bevor Sie die Datenbank verkleinern können.

Sie können dies versuchen:

USE <databasename>
GO

BACKUP DATABASE <databasename> TO DISK '<absolute path goes here>\<databasename>.bak';
GO

Sie können dies auch über SSMS tun und die verfügbaren grafischen Tools verwenden (Details finden Sie hier: http://msdn.microsoft.com/en-us/library/ms187510.aspx ).

Sobald Sie Ihre Datenbank gesichert haben, können Sie sie komprimieren. Das Verkleinern der Datenbank ist jedoch keine gute Idee, da eine starke Indexfragmentierung auftritt und die Suche nach Daten langsam wird.

Hoffe das hilft.

Toni Kostelac
quelle
Ich weiß, wie man das Protokoll sichert, abschneidet und die Größe der Protokolldatei verringert. Aber für diese Datenbank habe ich ein Problem. Ich habe gerade die Abfrage select log_reuse_wait_desc von sys.databases ausgeführt, wobei name = 'dbname' und festgestellt hat, dass die Replikation das Problem verursacht. Aber ich habe keine Replikation eingestellt. Wie kann man also die Replikation aus dieser Datenbank entfernen, die im Protokoll reuse wait_desc angezeigt wird?
Navaneet
Welche SQL Server-Version verwenden Sie?
Toni Kostelac
Die Replikation wird möglicherweise als Job festgelegt. Öffnen Sie daher den Ordner SQL Server-Agent und erweitern Sie den Ordner Jobs. Überprüfen Sie, ob ein Replikationsjob eingerichtet ist, und deaktivieren Sie ihn, indem Sie mit der rechten Maustaste darauf klicken und Job beenden
Toni
Wenn Sie SQL Server 2005 oder höher verwenden, entfernt sp_removedbreplication 'DB_NAME' die Replikation. Informationen zu SQL Server 2000 finden Sie unter blogs.msdn.com/b/repltalk/archive/2010/11/17/…
Kin Shah,
Aber das Problem, auf das ich gestoßen bin, ist anders.
Bitte
0

Ich habe festgestellt, dass ich zwei oder drei Sicherungen sowohl der Datenbank als auch des Transaktionsprotokolls durchführen muss, damit das Transaktionsprotokoll tatsächlich verkleinert wird. Ich habe eine Datenbank, die mit dem vollständigen Wiederherstellungsmodell erstellt wurde. Jede Nacht werden Sicherungen der Datenbank und des Transaktionsprotokolls durchgeführt, aber zwangsläufig scheint das Transaktionsprotokoll über 2-3 Wochen kontinuierlich zu wachsen. Wenn der verbleibende Speicherplatz 1 GB erreicht, wird das Transaktionsprotokoll etwa 30 GB umfassen. Ich habe die von Microsoft empfohlenen Schritte befolgt und nach der vierten oder fünften Iteration der Sicherung der Datenbank und des Transaktionsprotokolls wird das Transaktionsprotokoll endlich seinen zusätzlichen Speicherplatz freigeben und verkleinern. Dann gehe ich zurück und lösche die mehreren Backups, die ich erstellt habe.

SQL King
quelle
Ich denke, Sie machen etwas falsch. Wenn Sie eine ordnungsgemäße Sicherung des Protokolls durchführen, sollte das nicht verwendete Protokoll abgeschnitten werden. Die in meiner Frage angegebenen Befehle können Ihnen bei der Lösung des Problems helfen.
Navaneet
-8

Meine Arbeit für die Replikation, die das Verkleinern der Protokolldatei blockiert, ist:

  1. Stellen Sie DB-Wiederherstellungsmodell auf Einfach ein
  2. DB offline schalten
  3. Erstellen Sie eine Sicherungskopie der Protokolldatei (nur für den Fall)
  4. Protokolldatei löschen
  5. DB online schalten

In meinem Fall hat es funktioniert. Nach dem Bringen von DB Online wurde automatisch ein Log angelegt und seine Größe betrug 512kb statt 70GB. Dies ist jedoch nur eine Problemumgehung. Das Root-Problem ist nicht behoben. In meinem Fall verwenden wir die Replikation.

mecool
quelle
4
Dies ist ein schrecklicher Rat. Löschen Sie niemals Ihr Transaktionsprotokoll. Daraus können alle möglichen Probleme resultieren, z. B. Korruption
Tom V - Team Monica