use master
goset ansi_nulls on
goset quoted_identifier on
go--建立人: 高公升
--建立日期:2007/05/18
--修改日期:2007/06/02
--功能目的:收縮資料庫的日誌檔案
--引數: 要執行收縮的資料庫名稱,如果引數為'',則收縮所有的非系統資料庫,這個引數是為了應付臨時--情況的,根據特殊情況臨時針對某個資料庫執行可以寫上這個資料庫的名稱
--注意: 修改了恢復模式,注意備份
--流程說明:1.轉到需要收縮的資料庫
-- 2.更改資料庫恢復模式為簡單
-- 3.指定收縮大小
-- 4.更改資料庫恢復模式為完整
create procedure [dbo].[db_shrink_log]
@dbname varchar(50) --要執行收縮的資料庫名稱
asdeclare @exec_shrink varchar(500) --儲存所有的執行語句
declare @sno int --執行的資料庫臨時編號
declare @old_size decimal(18,2) --收縮前ldf檔案大小
declare @new_size decimal(18,2) --收縮後ldf檔案大小
declare @mdf_size decimal(18,2) --資料庫mdf檔案的大小
declare @shrink_db table( --儲存待執行的資料庫名稱
sno int identity(1,1),name sysname)
begin try
if (@dbname = '') --記錄需要收縮的資料庫名稱
insert @shrink_db select name from sys.databases where database_id > 4
else
insert @shrink_db select name from sys.databases where name = @dbname
--開始迴圈收縮資料庫log檔案
set @sno = 1
while(@sno <= (select count(sno) from @shrink_db))
begin
select @dbname = name from @shrink_db where sno = @sno
--取出資料庫mdf和ldf檔案的大小
select @mdf_size = size * 8 / 1024 from sys.master_files where database_id = db_id(@dbname) and file_id = 1
select @old_size = size * 8 / 1024 from sys.master_files where database_id = db_id(@dbname) and file_id = 2
--如果資料庫的ldg檔案大於mdf/10檔案則收縮,否則不需要收縮
if (@old_size > @mdf_size/10)
begin
--1.將資料庫上下文更改為需要收縮的資料庫
set @exec_shrink = 'use ' + @dbname + ';' + char(13)
--2.將恢復模式改為'簡單'
set @exec_shrink = @exec_shrink +
'alter database ' + @dbname +
' set recovery ******;' + char(13)
--3.取當前資料庫所有的ldf檔案,檔案將壓縮到資料庫mdf檔案大小的1/10
declare @shrink varchar(200)
set @shrink = ''
select @shrink = @shrink + 'dbcc shrinkfile('+rtrim(file_id)+','+rtrim(ceiling(@mdf_size/10))+');' +char(13) from sys.database_files where type = 1
set @exec_shrink = @exec_shrink + @shrink
--如果資料庫只有乙個ldf檔案則可以寫簡單點,ldf檔案的file_id通常為2
--set @exec_shrink = @exec_shrink + 'dbcc shrinkfile(2,' + rtrim(ceiling(@mdf_size/10)) + ');'+ char(13)
--4.將恢復模式改為'完整'
set @exec_shrink = @exec_shrink +
'alter database ' + @dbname +
' set recovery full;'
exec (@exec_shrink)
--print @exec_shrink
select @new_size = size * 8 / 1024 from sys.master_files where database_id = db_id(@dbname) and file_id = 2
print (@dbname +'收縮完成,壓縮前 ' +rtrim(@old_size) + ' mb,收縮後 '+ rtrim(@new_size) + ' mb')
endelse
begin
print(@dbname + '暫時不需要收縮。')
endset @sno = @sno + 1
end --while
end try
begin catch
print error_message()
end catch
goset ansi_nulls off
goset quoted_identifier off
go
壓縮資料庫的通用儲存過程
壓縮資料庫的通用儲存過程 壓縮日誌及資料庫檔案大小 因為要對資料庫進行分離處理 所以儲存過程不能建立在被壓縮的資料庫中 鄒建 2004.3 呼叫示例 exec p pdb test use master 注意,此儲存過程要建在 master 資料庫中 go if exists select from...
壓縮資料庫日誌
經常在csdn上看到發帖說,壓縮日誌檔案處理不當,導致資料庫損壞,甚至不能恢復資料,於是就寫了乙個通用的資料庫日誌檔案壓縮的儲存過程來解決此問題 壓縮資料庫的通用儲存過程 壓縮日誌及資料庫檔案大小 因為要對資料庫進行分離處理 所以儲存過程不能建立在被壓縮的資料庫中 鄒建 2004.03 引用請保留此...
壓縮資料庫日誌
經常在csdn上看到發帖說,壓縮日誌檔案處理不當,導致資料庫損壞,甚至不能恢復資料,於是就寫了乙個通用的資料庫日誌檔案壓縮的儲存過程來解決此問題 壓縮資料庫的通用儲存過程 壓縮日誌及資料庫檔案大小 因為要對資料庫進行分離處理 所以儲存過程不能建立在被壓縮的資料庫中 鄒建 2004.03 引用請保留此...