我不是SQL专家,每当我需要做一些基本之外的事情时,我就会想起这个事实。我有一个测试数据库,它的大小不是很大,但是事务日志确实很大。如何清除事务日志?


当前回答

首先检查数据库恢复模型。默认情况下,SQL Server Express Edition会为简单恢复创建一个数据库 (如果我没记错的话)。

备份日志DatabaseName With Truncate_Only

DBCC ShrinkFile(yourLogical_LogFileName, 50)

SP_helpfile将为您提供逻辑日志文件名。

请参考:

从SQL Server数据库中的完整事务日志中恢复

如果您的数据库处于完全恢复模式,并且您没有进行TL备份,那么将其更改为SIMPLE。

其他回答

免责声明:在尝试之前请仔细阅读下面的评论,并确保检查接受的答案。就像我5年前说的:

如果有人有任何评论要补充的情况下,这不是一个 适当的或最优的解决方案,然后请在下面评论

事实证明有:-)


最初的回答:

右键单击数据库名称。 选择“任务→收缩→数据库” 然后单击“确定”!

我通常打开包含数据库文件的Windows资源管理器目录,所以我可以立即看到效果。

我真的很惊讶这竟然能起作用!通常我以前使用DBCC,但我刚刚尝试了一下,它没有缩小任何东西,所以我尝试了GUI(2005),它工作得很好——在10秒内释放了17 GB

在完全恢复模式下,这可能不起作用,因此您必须首先备份日志,或者更改为简单恢复,然后收缩文件。[感谢@onupdatecascade]

--

PS:我很欣赏一些关于这种危险的评论,但在我的环境中,我自己这样做没有任何问题,尤其是因为我总是先做完全备份。因此,在继续之前,请考虑您的环境,以及这会如何影响您的备份策略和工作安全性。我所做的一切只是把人们指向微软提供的一个功能!

不推荐John推荐的这种技术,因为没有日志文件就不能保证数据库会附加。将数据库从full更改为simple,强制设置检查点并等待几分钟。SQL Server将清除日志,然后使用DBCC SHRINKFILE收缩日志。

到目前为止,这里的大多数回答都假设您实际上并不需要事务日志文件,但是,如果您的数据库使用FULL恢复模型,并且您希望保留备份以备需要恢复数据库时使用,那么不要像许多回答所建议的那样截断或删除日志文件。

删除日志文件(通过截断它、丢弃它、擦除它等)将破坏备份链,并将阻止您恢复到上一次完整、差异或事务日志备份以来的任何时间点,直到进行下一次完整或差异备份。

来自微软关于备份的文章

我们建议不要手动使用NO_LOG或TRUNCATE_ONLY 截断事务日志,因为这会中断日志链。直到 下一次全量或差异数据库备份时,数据库不备份 防止媒体故障。仅在very中使用手动日志截断 特殊情况,并立即创建数据备份。

要避免这种情况,请在收缩日志文件之前将其备份到磁盘。语法应该是这样的:

BACKUP LOG MyDatabaseName 
TO DISK='C:\DatabaseBackups\MyDatabaseName_backup_2013_01_31_095212_8797154.trn'

DBCC SHRINKFILE (N'MyDatabaseName_Log', 200)

这是一种简单且不优雅且有潜在危险的方法。

备份数据库 分离数据库 重命名日志文件 附加数据库 将重新创建新的日志文件 删除重命名日志文件。

我猜您没有做日志备份。(截断日志)。我的建议是将恢复模式从完全恢复改为简单恢复。这将防止日志膨胀。

截断日志文件。

备份数据库 卸载数据库,可以使用Enterprise Manager,也可以执行以下命令: 删除事务日志文件。(或重命名文件,以防万一) 使用Sp_AttachDB [DBName]重新连接数据库 当附加数据库时,将创建一个新的事务日志文件。

使用实例收缩日志文件。

使用No_Log备份日志[DBName] 通过以下方式收缩数据库: 使用企业管理器:- 右键单击数据库,所有任务,收缩数据库,文件,选择日志文件,确定。 使用T-SQL:- Dbcc Shrinkfile ([Log_Logical_Name])

您可以通过运行sp_helpdb或在Enterprise Manager中查看数据库的属性来查找日志文件的逻辑名称。