壓縮資料庫日誌檔案(儲存過程)
阿新 • • 發佈:2019-02-08
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(@DBName) andfile_id=1
SELECT@old_size= size *8/1024FROM sys.master_files WHERE database_id =DB_ID(@DBName) andfile_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(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/1024FROM sys.master_files WHERE database_id =DB_ID(@DBName) andfile_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
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
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(@DBName) andfile_id=1
SELECT@old_size= size *8/1024FROM sys.master_files WHERE database_id =DB_ID(@DBName) andfile_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(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/1024FROM sys.master_files WHERE database_id =DB_ID(@DBName) andfile_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