我不是一个SQL专家,每当我需要做一些基本操作以外的事情时,都会想起这一点。我有一个测试数据库,它的大小并不大,但交易日志确实很大。如何清除交易日志?
我不是一个SQL专家,每当我需要做一些基本操作以外的事情时,都会想起这一点。我有一个测试数据库,它的大小并不大,但交易日志确实很大。如何清除交易日志?
ALTER DATABASE testdb SET RECOVERY FULL;
-- and take another full backup here
-- so log backups are possible
DECLARE @path nvarchar(4000) = CONCAT(
N'\\backup_share\log\testdb_',
CONVERT(char(8), GETDATE(), 112), N'_',
REPLACE(CONVERT(char(8), GETDATE(), 108),':',''),
N'.trn');
BACKUP LOG foo TO DISK = @path WITH INIT, COMPRESSION;
WAITFOR DELAY '00:00:01';
GO 2 -- run twice to ensure file wrap-around
\\backup_share\
应该位于一个代表不同底层存储设备的不同机器上。将它们备份到同一台机器(或备份到使用相同底层磁盘的不同机器,或备份到同一物理主机上的不同虚拟机)并不能真正帮助您,因为如果机器损坏,您将丢失数据库和其备份。根据您的网络基础设施,备份到本地然后在幕后将其转移到不同位置可能更有意义;无论哪种情况,您都希望尽快将它们从主数据库机器上移走。SHRINKFILE
直到日志文件变为1 MB - 即使您经常备份日志,它仍然需要容纳可能发生的并发事务的总和。日志文件的自动增长事件是昂贵的,因为SQL Server必须将文件清零(与启用即时文件初始化的数据文件不同),并且用户事务必须等待此过程完成。您希望尽可能少地执行此增长-缩小-增长-缩小的例程,并且肯定不希望让用户为此付费。sys.database_files
中找到):USE [master];
GO
ALTER DATABASE Test1
MODIFY FILE
(NAME = N'yourdb_log', SIZE = 200MB, FILEGROWTH = 50MB);
GO
USE yourdb;
GO
DBCC SHRINKFILE(N'yourdb_log', 200); -- unit is MB
GO
ALTER DATABASE testdb SET RECOVERY SIMPLE;
USE yourdb;
GO
CHECKPOINT;
CHECKPOINT; -- run twice to ensure file wrap-around
GO
DBCC SHRINKFILE(N'yourdb_log', 200); -- unit is MB
GO
使用TRUNCATE_ONLY
选项备份日志,然后使用SHRINKFILE
。首先,这个TRUNCATE_ONLY
选项已经被弃用,在当前版本的SQL Server中不再可用。其次,如果您处于FULL
恢复模式,这将破坏您的日志链,并需要进行新的完整备份。
分离数据库,删除日志文件,然后重新附加。我无法强调这个方法有多么危险。您的数据库可能无法重新启动,可能会以可疑状态重新启动,您可能不得不恢复到备份(如果有的话),等等。
使用"收缩数据库"选项。DBCC SHRINKDATABASE
和使用维护计划选项做同样的事情都是不好的主意,特别是如果您只是想解决一个日志问题。针对您想要调整的文件进行独立调整,使用DBCC SHRINKFILE
或ALTER DATABASE ... MODIFY FILE
(上面有示例)。
将日志文件收缩到1MB。这看起来很诱人,因为嘿,SQL Server在某些情况下允许我这样做,并且看看它释放了多少空间!除非您的数据库是只读的(如果是,您应该使用ALTER DATABASE
标记它),否则这绝对只会导致许多不必要的增长事件,因为日志必须适应当前事务,而不管恢复模式如何。临时释放空间的意义是什么,SQL Server会慢慢而痛苦地重新占用它。
创建第二个日志文件。这将为填满磁盘的驱动器提供临时缓解,但这就像用创可贴修复一个破损的肺一样。您应该直接处理有问题的日志文件,而不仅仅是增加另一个潜在的问题。除了将一些事务日志活动重定向到不同的驱动器,第二个日志文件对您来说真的没有任何作用(不像第二个数据文件),因为一次只能使用一个文件。Paul Randal也解释了为什么多个日志文件以后可能会给您带来麻烦。
-- DON'T FORGET TO BACKUP THE DB :D (Check [here][1])
USE AdventureWorks2008R2;
GO
-- Truncate the log by changing the database recovery model to SIMPLE.
ALTER DATABASE AdventureWorks2008R2
SET RECOVERY SIMPLE;
GO
-- Shrink the truncated log file to 1 MB.
DBCC SHRINKFILE (AdventureWorks2008R2_Log, 1);
GO
-- Reset the database recovery model.
ALTER DATABASE AdventureWorks2008R2
SET RECOVERY FULL;
GO
来源: DBCC SHRINKFILE (Transact-SQL)
您可能需要先备份。
注意:在尝试此方法之前,请仔细阅读本回答下方的评论,并确保检查已接受的答案。正如我在将近五年前所说:
如果有人对这不是最佳解决方案的情况有任何评论,请在下面发表评论。
结果确实有人提出了问题 :-)
原始回答:
右键单击数据库名称。
选择任务 → 收缩 → 数据库
然后点击 确定!
我通常会打开包含数据库文件的Windows资源管理器目录,以便可以立即看到效果。
我真的很惊讶这个方法起作用了!通常我以前使用DBCC,但我刚试了一下,它没有收缩任何东西,所以我尝试了GUI(2005),它非常好用——只用10秒就释放了17 GB。
在完整恢复模式下,这可能行不通,因此您必须首先备份日志,或切换到简单恢复模式,然后收缩文件。[感谢 @onupdatecascade 提供这个提示]
--
PS:我感谢一些人对此的危险性进行了评论,但在我的环境中,我自己使用这种方法并没有遇到任何问题,特别是因为我总是先进行完全备份。因此,在继续之前,请考虑您的环境以及如何影响您的备份策略和工作安全性。我只是在向人们介绍Microsoft提供的一个功能!
下面是缩小事务日志的脚本,但我强烈建议在缩小之前备份事务日志。
如果你只缩小文件,你将失去大量可能在灾难发生时拯救生命的数据。事务日志包含许多有用的数据,可以使用第三方事务日志阅读器进行读取(尽管需要极大的工作量)。
当谈到恢复到某个时间点时,事务日志也是必不可少的,因此不要丢弃它,而是确保你提前备份好它。
以下是一些人们在恢复中使用存储在事务日志中的数据的帖子:
USE DATABASE_NAME;
GO
ALTER DATABASE DATABASE_NAME
SET RECOVERY SIMPLE;
GO
--First parameter is log file name and second is size in MB
DBCC SHRINKFILE (DATABASE_NAME_Log, 1);
ALTER DATABASE DATABASE_NAME
SET RECOVERY FULL;
GO
当执行上述命令时,您可能会遇到以下类似错误:
“Cannot shrink log file (log file name) because the logical log file located at the end of the file is in use“
这意味着TLOG正在使用中。在这种情况下,请尝试多次连续执行此操作,或找到减少数据库活动的方法。
如果您正在使用 SQL 7 或 2000,则可以在数据库选项选项卡中启用“清除日志”功能。这具有同样的效果。
显然,这在生产环境中是不推荐的,因为您将无法还原到特定时间点。
BACKUP LOG MyDatabaseName
TO DISK='C:\DatabaseBackups\MyDatabaseName_backup_2013_01_31_095212_8797154.trn'
DBCC SHRINKFILE (N'MyDatabaseName_Log', 200)
, 1)
部分外,我同意您的答案。问题在于,如果将其缩小到1 MB,则导致正常日志大小的增长事件将会非常昂贵,并且如果将增长率保留为10%的默认值,则这些事件将会很多。 - Aaron Bertrand约翰推荐的这种技术不被建议使用,因为没有保证数据库可以在没有日志文件的情况下附加。把数据库从完整模式改成简单模式,强制进行检查点并等待几分钟。SQL Server将清除日志,然后您可以使用DBCC SHRINKFILE来缩小它。
首先检查数据库的恢复模式。默认情况下,SQL Server Express Edition会为简单恢复模式创建一个数据库(如果我没有搞错的话)。
使用Truncate_Only备份日志:Backup log DatabaseName With Truncate_Only:
DBCC ShrinkFile(yourLogical_LogFileName, 50)
SP_helpfile将给出逻辑日志文件名。
参考:
如果您的数据库处于完整恢复模式,并且您没有进行TL备份,则将其更改为简单模式。