Ich habe eine Datenbank [Meine Datenbank] mit folgenden Informationen:
SQL Server 2008
MDF-Größe: 30 GB
LDF-Größe: 67 GB
Ich wollte die Protokolldatei so weit wie möglich verkleinern und begann meine Suche, um herauszufinden, wie das geht. Vorsichtsmaßnahme: Ich bin kein DBA (oder nähere mich sogar einem DBA) und habe mich durch diese Suche gefühlsmäßig weiterentwickelt.
Zuerst habe ich nur SSMS, DB-Eigenschaften, Dateien aufgerufen und den Wert für die Anfangsgröße (MB) auf 10 bearbeitet. Dadurch wurde die Protokolldatei auf 62 GB reduziert (nicht genau die 10 MB, die ich eingegeben habe). Also habe ich SQL Profiler angehängt und gesehen, dass DBCC SHRINKFILE aufgerufen wurde. Ich habe diesen Befehl dann in den Abfrageeditor eingegeben und hier sind die Ergebnisse.
DBCC SHRINKFILE (N'My DB_Log' , 10)
Und die Ausgabe war:
Cannot shrink log file 2 (My DB_Log) because the logical log file located at the end of the file is in use.
DbId FileId CurrentSize MinimumSize UsedPages EstimatedPages
------ ----------- ----------- ----------- ----------- --------------
8 2 8044104 12800 8044104 12800
(1 row(s) affected)
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
Ich habe dann einige Nachforschungen angestellt und Folgendes gefunden:
http://support.microsoft.com/kb/907511
Was bedeutet, dass ich die Protokolldatei vor dem Shrinkfile sichern muss, damit die virtuellen Protokolldateien freigegeben werden und das Shrinkfile seine Arbeit erledigen kann - ich weiß nicht, was das bedeutet ... ich paraphrasiere hier nur :)
Also dachte ich mir, ich würde versuchen, die Protokolldatei zu sichern und dann eine DBCC-SHRINKFILE auszuführen (und ich habe die Größe der neuen Protokolldatei auf 12800 geändert, da dies die in der Ausgabe des vorherigen DBCC-SHRINKFILE-Befehls angegebene Mindestgröße war).
BACKUP LOG [My DB] TO DISK = 'D:\SQLBackup\20110824-MyDB-Log.bak'
GO
DBCC SHRINKFILE (N'My DB_Log' , 12800)
GO
Das Ergebnis war das gleiche wie beim ersten Mal. Ich kann die Protokolldatei nur auf 62 GB reduzieren.
Ich bin mir nicht sicher, was ich falsch mache und was ich als nächstes versuchen soll.
quelle
Antworten:
Zusätzlich zu den Schritten, die Sie bereits ausgeführt haben, müssen Sie den Wiederherstellungsmodus auf einfach einstellen, bevor Sie das Protokoll verkleinern können.
Dies ist keine empfohlene Vorgehensweise für Produktionssysteme. Sie verlieren Ihre Fähigkeit, sich von früheren Sicherungen / Protokolldateien zu einem bestimmten Zeitpunkt wiederherzustellen.
Ein Beispiel und eine Erläuterung finden Sie in Beispiel B auf dieser DBCC SHRINKFILE (Transact-SQL) msdn-Seite.
quelle
Okay, hier ist eine Lösung, um die physische Größe der Transaktionsdatei zu reduzieren, ohne jedoch den Wiederherstellungsmodus auf einfach zu ändern.
Suchen Sie in Ihrer Datenbank die Datei-ID der Protokolldatei mithilfe der folgenden Abfrage.
SELECT * FROM sys.database_files;
In meinem Fall lautet die Protokolldatei file_id 2. Jetzt möchten wir die verwendeten virtuellen Protokolle suchen und dies mit dem folgenden Befehl tun.
Hier können Sie sehen, ob virtuelle Protokolle verwendet werden, indem Sie feststellen, ob der Status 2 (in Verwendung) oder 0 (kostenlos) ist. Beim Verkleinern von Dateien werden leere virtuelle Protokolle ab dem Ende der Datei physisch entfernt, bis der erste verwendete Status erreicht ist. Aus diesem Grund wird eine Transaktionsprotokolldatei manchmal teilweise verkleinert, jedoch nicht alle freien virtuellen Protokolle entfernt.
Wenn Sie einen Status 2 bemerken, der nach 0 auftritt, blockiert dies die vollständige Verkleinerung der Datei. Um dies zu umgehen, führen Sie eine weitere Transaktionsprotokollsicherung durch und führen Sie diese Befehle sofort aus. Geben Sie dabei die oben angegebene Datei-ID und die Größe an, auf die Ihre Protokolldatei reduziert werden soll.
-- DBCC SHRINKFILE (file_id, LogSize_MB) DBCC SHRINKFILE (2, 100); DBCC LOGINFO;
Dadurch wird die Zuordnung der virtuellen Protokolldatei angezeigt, und Sie werden hoffentlich feststellen, dass sie etwas reduziert wurde. Da virtuelle Protokolldateien nicht immer in der richtigen Reihenfolge zugewiesen werden, müssen Sie das Transaktionsprotokoll möglicherweise einige Male sichern und diese letzte Abfrage erneut ausführen . Aber normalerweise kann ich es innerhalb von ein oder zwei Backups verkleinern.
quelle
Ich verwende dieses Skript auf SQL Server 2008 R2.
USE [db_name] ALTER DATABASE [db_name] SET RECOVERY SIMPLE WITH NO_WAIT DBCC SHRINKFILE([log_file_name]/log_file_number, wanted_size) ALTER DATABASE [db_name] SET RECOVERY FULL WITH NO_WAIT
quelle
Versuche dies
ALTER DATABASE XXXX SET RECOVERY SIMPLE use XXXX declare @log_File_Name varchar(200) select @log_File_Name = name from sysfiles where filename like '%LDF' declare @i int = FILE_IDEX ( @log_File_Name) dbcc shrinkfile ( @i , 50)
quelle
Paul Randal hat eine ausgezeichnete Diskussion über dieses Problem in seinem Blog: http://www.sqlskills.com/blogs/paul/post/backup-log-with-no_log-use-abuse-and-undocumented-trace-flags-to -stop-it.aspx
quelle
Ich habe viele Möglichkeiten ausprobiert, aber das funktioniert.
Der Beispielcode ist in DBCC SHRINKFILE verfügbar
USE DBName; GO -- Truncate the log by changing the database recovery model to SIMPLE. ALTER DATABASE DBName SET RECOVERY SIMPLE; GO -- Shrink the truncated log file to 1 MB. DBCC SHRINKFILE (DBName_log, 1); --File name SELECT * FROM sys.database_files; query to get the file name GO -- Reset the database recovery model. ALTER DATABASE DBName SET RECOVERY FULL; GO
quelle
Ich habe dieses Problem gelöst, indem ich die vollständige und transaktionale Sicherung durchgeführt habe. Manchmal ist der Sicherungsvorgang nicht abgeschlossen und dies ist einer der Gründe, warum die .ldf-Datei nicht verkleinert wird. Versuche dies. Es hat bei mir funktioniert.
quelle
Vielen Dank an @ user2630576 und @ Ed.S.
Das Folgende war ein Vergnügen:
BACKUP LOG [database] TO DISK = 'D:\database.bak' GO ALTER DATABASE [database] SET RECOVERY SIMPLE use [database] declare @log_File_Name varchar(200) select @log_File_Name = name from sysfiles where filename like '%LDF' declare @i int = FILE_IDEX ( @log_File_Name) dbcc shrinkfile ( @i , 50) ALTER DATABASE [database] SET RECOVERY FULL
quelle