sql server 截斷和收縮所有用戶數據庫日誌--用遊標循環所有正常狀態的用戶數據庫

在服務器運維活動中,我們經常需要做一項工具就是將好多年的用戶數據庫日誌文件截斷並收縮爲最小,以節省大量的磁盤空間。當數據庫只有一兩個時可以手動操作,但數據庫數量衆多時,就需要採用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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章