报表库, 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)
当然, 这个只是并不算太重要的库, 可以这么简单粗暴。
如果是比较重要的库, 应该执行以下脚本看下日志不能收缩的原因:
--提供有关所有数据库中的事务日志空间使用情况的统计信息。
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服务, 重启服务后会导致大事务回滚时的数据库处于“正在恢复”, 这种更麻烦(没办法看到进度), 事务回滚不结束数据库还是用不了。
其它另见: