在服务器运维活动中,我们经常需要做一项工具就是将好多年的用户数据库日志文件截断并收缩为最小,以节省大量的磁盘空间。当数据库只有一两个时可以手动操作,但数据库数量众多时,就需要采用sql脚本,批量化执行这个过程。
本人写了一段这样的脚本。并且经过验证执行无误。现在分享出来,您也可以执行以下sql脚本来一次将所有用户数据库的日志进行截断并收缩。

--截断和收缩所有用户数据库日志。用游标循环所有正常状态的用户数据库,并且截断和收缩数据库日志文件
declare @tempDbName varchar(64)
declare cursorP cursor for select [name] from sysdatabases where status=65536 --and [name] in('userDb02','userDb01')
open cursorP
while @@FETCH_STATUS=0
begin
print @tempDbName
    declare @dbName varchar(64)
	declare @dbLogName varchar(64)
	set @dbName = @tempDbName
	set @dbLogName = @dbName+'_log'

	--如果数据库文件逻辑名和物理名不一致,则改
	declare @logicName varchar(64)
	SELECT top 1 @logicName=name from sys.master_files WHERE database_id=db_id(@dbName);
	--print @logicName
	if(@logicName!=@dbName)
	begin
	--print('alter database '+@dbName+' modify file(name='''+@logicName+''', newname='''+@dbName+''');')
	--print('alter database '+@dbName+' modify file(name='''+@logicName+'_log'', newname='''+@dbName+'_log'');')
	exec('alter database '+@dbName+' modify file(name='''+@logicName+''', newname='''+@dbName+''');')
	exec('alter database '+@dbName+' modify file(name='''+@logicName+'_log'', newname='''+@dbName+'_log'');')
	end

	declare @breakLogSqlstr varchar(max)
	set @breakLogSqlstr ='
	USE '+@dbName+'
	ALTER DATABASE '+@dbName+' SET RECOVERY SIMPLE --将“恢复模式”设置为“简单
	DBCC SHRINKFILE (N'''+@dbLogName+''' , 1, TRUNCATEONLY)--收缩日志文件大小到1M
	ALTER DATABASE '+@dbName+' SET RECOVERY FULL WITH NO_WAIT ----将“恢复模式”设置为“完整”
	ALTER DATABASE '+@dbName+' SET RECOVERY FULL
	'
	--print @breakLogSqlstr
	exec (@breakLogSqlstr);
fetch next from cursorP into @tempDbName
end
close cursorP
DeAllocate cursorP
posted on 2023-11-02 18:16  hrx521  阅读(193)  评论(2编辑  收藏  举报