1. 程式人生 > >壓縮資料庫日誌檔案(儲存過程)

壓縮資料庫日誌檔案(儲存過程)

USE master
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
--建立人:    高升
--
建立日期:2007/05/18
--
修改日期:2007/06/02
--
功能目的:收縮資料庫的日誌檔案
--
引數:    要執行收縮的資料庫名稱,如果引數為'',則收縮所有的非系統資料庫,這個引數是為了應付臨時--情況的,根據特殊情況臨時針對某個資料庫執行可以寫上這個資料庫的名稱
--
注意:    修改了恢復模式,注意備份    
--
流程說明:1.轉到需要收縮的資料庫
--
            2.更改資料庫恢復模式為簡單
--
            3.指定收縮大小
--
            4.更改資料庫恢復模式為完整

CREATEPROCEDURE[dbo].[DB_Shrink_Log]
  
@dbNamevarchar(50)                --要執行收縮的資料庫名稱
AS
DECLARE@exec_shrinkvarchar(500)    --儲存所有的執行語句
DECLARE@snoint--執行的資料庫臨時編號
DECLARE@old_sizedecimal(18,2)        --收縮前ldf檔案大小
DECLARE@new_sizedecimal(18,2)        --收縮後ldf檔案大小
DECLARE@mdf_sizedecimal(18,2)        --資料庫mdf檔案的大小

DECLARE@shrink_DBtable(            --儲存待執行的資料庫名稱
            sno intidentity(1,1),name sysname)

BEGIN try

if (@DBName='')    --記錄需要收縮的資料庫名稱
INSERT@shrink_DBSELECT name FROM sys.databases WHERE database_id >4
else
  
INSERT@shrink_DBSELECT name FROM sys.databases WHERE name =@DBName

--開始迴圈收縮資料庫Log檔案
SET@sno
=1
while(@sno<= (SELECTCOUNT(sno) FROM@shrink_DB))
BEGIN 
  
SELECT@dbName= name FROM@shrink_DBWHERE sno =@sno

  
--取出資料庫mdf和ldf檔案的大小
SELECT@mdf_size= size *8/1024FROM sys.master_files WHERE database_id =DB_ID(@DBNameandfile_id=1
  
SELECT@old_size= size *8/1024FROM sys.master_files WHERE database_id =DB_ID(@DBNameandfile_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 SIMPLE;'+char(13)

  
--3.取當前資料庫所有的ldf檔案,檔案將壓縮到資料庫mdf檔案大小的1/10
DECLARE@shrinkvarchar(200)
  
SET@shrink=''
  
SELECT@shrink=@shrink+'DBCC SHRINKFILE('+rtrim(file_id)+','+rtrim(Ceiling(@mdf_size/10))+');'+char(13FROM 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/1024FROM sys.master_files WHERE database_id =DB_ID(@DBNameandfile_id=2
  
print (@dbName+'收縮完成,壓縮前 '+rtrim(@old_size+' MB,收縮後 '+rtrim(@new_size+' MB')
END
else
BEGIN
  
print(@dbName+'暫時不需要收縮。')
END

SET@sno=@sno+1
END--while
END try
BEGIN catch
  
print ERROR_MESSAGE()
END catch
GO
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO