在服務器運維活動中,我們經常需要做一項工具就是將好多年的用戶數據庫日誌文件截斷並收縮爲最小,以節省大量的磁盤空間。當數據庫只有一兩個時可以手動操作,但數據庫數量衆多時,就需要採用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