有一个SQL2012库的日志达到了100G左右,平时开发人员根本没有做过事务日志备份,而磁盘空间已经快满了。所以,只能截断它。但是,由于从2K8以后,SQL SERVER好像不再提供 truncate_only和no_log功能了,而这个服务器的磁盘空间也不够。所以,只能采用切换到简单恢复模式方式,来先将已经完成的事务truncate了。然后shrik日志文件来回收空间了。
--查询事务日志的状态,可以看到是LOG_BACKUP状态,说明需要备份日志。
--http://msdn.microsoft.com/zh-cn/library/ms190925.aspx#Truncation
select name,log_reuse_wait_desc from sys.databases
--查看LOG使用情况
dbcc sqlperf(LOGSPACE)--已经使用的百分比
dbcc loginfo --查看status列基本上都是2表示不可以重用,只有0时候才可以重新使用。
--切换到简单恢复模式
alter database test set recovery simple with no_wait--再次使用dbcc loginfo 查看,可以看到很多status原来是2的已经变为0.
--切回到FULL
alter database test set FULL simple with no_wait
--这个时候你可以试着插入数据,观看status的值。你会发现它虽然恢复模型已经切回FULL,但是,它的事务日志使用方式还是SIMPLE模式,也就是还可以重新使用已经提交日志空间。这个时候,我们只有做一个全库备份才可以真正切回FULL模式。(记得好像如果新建一个数据库也有这个情况。只有建完以后,马上做一个全库备份以后,才是真正的FULL模式。)
--这个时候,如果你想通过shrink日志文件来缩小文件会发现不起做用。只有你做完以后日志备份后,再去shrik才可以功能。
backup log test to disk=‘d:\test.log‘
DBCC SHRINKFILE (N‘Test_log‘ , 0, TRUNCATEONLY)
参考资料: