解决:“由于最小日志空间要求,无法收缩日志文件”

来源:互联网 发布:网络问卷调查技巧 编辑:程序博客网 时间:2024/06/01 07:20

报表库, SQL Server2005 , 恢复模式为“简单日志”, 日志太大D盘爆盘了。

1. 先截断日志:

--注:设定为当前数据库declare @dbName nvarchar(100)set @dbName=db_name()--清空日志  DUMP TRANSACTION @dbName WITH NO_LOG          --截断事务日志     BACKUP LOG @dbName WITH NO_LOG        

2. 再收缩日志:

dbcc shrinkfile(2, 0, TRUNCATEONLY)

无效!一直提示:“由于最小日志空间要求,无法收缩日志文件

3. 清除所有进程:

--注:必须设置好当前库,只在当前库上执行!无需改任何参数!  --1. 杀当前进程之外的所有进程  DECLARE @sql NVARCHAR(MAX),@currDbName NVARCHAR(100)  SET @currDbName=DB_NAME()  SELECT @sql=REPLACE(      (SELECT 'kill '+CAST(spid AS NVARCHAR(50))+';' FROM sys.sysprocesses WHERE dbid=DB_ID(@currDbName) AND spid!=@@SPID AND spid>50 FOR XML PATH(''))      ,';','  ')  PRINT @sql  EXEC (@sql)  


再重复执行1和2就可以了。
当然, 这个只是并不算太重要的库, 可以这么简单粗暴。

如果是比较重要的库, 应该执行以下脚本看下日志不能收缩的原因:

--提供有关所有数据库中的事务日志空间使用情况的统计信息。dbcc sqlperf(logspace)--日志信息DBCC loginfo()  --Status=2则为活动--日志无法重用的原因select name, recovery_model_desc,log_reuse_wait,log_reuse_wait_desc from sys.databases d--最早的活动事务DBCC OPENTRAN ()  --括号内加上数据库名称,如果选定为当前库可以为空

查看当前正在运行的任务(有时即使是kill, 也需要时间来回滚)大约还需要多久才能完成

SELECT   DB_NAME(er.[database_id]) [DatabaseName]  ,er.[command] AS [CommandType],CONVERT(DECIMAL(5, 2), er.[percent_complete]) AS [Complete_Percent],er.start_time,CONVERT(DECIMAL(38, 2), er.[total_elapsed_time] / 60000.00) AS [ElapsedTime_m]  ,CONVERT(DECIMAL(38, 2), er.[estimated_completion_time] / 60000.00) AS [EstimatedCompletionTime_m],CONVERT(DECIMAL(38, 2), (er.[total_elapsed_time] / 60000.00 * ((100-er.[percent_complete])/er.percent_complete))) AS [EstimatedCompletionTime_m2]FROM sys.dm_exec_requests AS er  WHERE 1=1--and DB_NAME(er.[database_id]) in ('dbName')and er.[percent_complete] >0--and er.[command] in ('RESTORE DATABASE' ,'BACKUP DATABASE','BACKUP LOG','RESTORE LOG')order by er.start_time desc

特别注意:

不要重启SQL Server服务, 重启服务后会导致大事务回滚时的数据库处于“正在恢复”, 这种更麻烦(没办法看到进度), 事务回滚不结束数据库还是用不了。

其它另见:

点击打开链接

0 0
原创粉丝点击