压缩数据库日志文件(存储过程)

USE master
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
--建立人:    高升
--建立日期:2007/05/18
--修改日期:2007/06/02
--功能目的:收缩数据库的日志文件
--参数:    要执行收缩的数据库名称,如果参数为'',则收缩所有的非系统数据库,这个参数是为了应付临时--情况的,根据特殊情况临时针对某个数据库执行可以写上这个数据库的名称
--注意:    修改了恢复模式,注意备份    
--流程说明:1.转到需要收缩的数据库
--            2.更改数据库恢复模式为简单
--            3.指定收缩大小
--            4.更改数据库恢复模式为完整
CREATE PROCEDURE [dbo].[DB_Shrink_Log]
  @dbName varchar(50)                --要执行收缩的数据库名称
AS
DECLARE @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 SIMPLE;' + 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')
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

 

转载与CSDN,地址:http://blog.csdn.net/hb_gx/article/details/1616550

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值