分享一个收缩数据库日志文件的存储过程

实际工作中,经常数据库日志文件非常大,但是实际使用的容量又非常小,具体可以通过下面的sql看到日志文件大小,和文件使用率:

SELECT name, data_space_id 文件组id, size/128 [文件大小(兆)],
    FILEPROPERTY(name, 'SpaceUsed')/128 [已用空间(兆)],
    size/128 - FILEPROPERTY(name, 'SpaceUsed')/128 [未用空间(兆)],
    FILEPROPERTY(name, 'SpaceUsed')*100.0/size [使用率(%)],
    max_size/128 [最大值(兆)],
    case is_percent_growth when 0 then cast(growth/128 as nvarchar) + '兆' else cast(growth as nvarchar) + '%' end 增长值,
    physical_name 物理路径
FROM sys.database_files a ORDER BY a.[name]

于是写了一个存储过程,可以快速回收日志文件占用的磁盘空间,具体调用就是Exec UP_ShinkLog '数据库名':

CREATE PROCEDURE [UP_ShinkLog]
    @dbName VARCHAR(100)
AS
BEGIN
SET NOCOUNT ON;
 
    DECLARE @sql NVARCHAR(200);
    DECLARE @logname NVARCHAR(200);
    DECLARE @dbRecovery TINYINT;
 
    -- 获取日志文件名
    SET @sql = N'USE [' + @dbName + N'];' + Char(13) + Char(10) +
    --'GO' + Char(13) + Char(10) +
    'select top 1 @logname=name from sys.database_files where type=1';
    --PRINT @sql
    EXECUTE sp_executesql @sql, N'@logname NVARCHAR(200) output', @logname output;
    IF @logname IS NULL
    BEGIN
        PRINT '未找到日志文件:' + @sql;
        RETURN;
    END 
    
    -- 获取现有的恢复模式 1是FULL 3是SIMPLE
    SET @sql = N'USE [' + @dbName + N'];' + Char(13) + Char(10) +
    --'GO' + Char(13) + Char(10) +
    'select top 1 @dbRecovery=recovery_model FROM sys.databases WHERE name = ''' + @dbName + '''';
    --PRINT @sql
    EXECUTE sp_executesql @sql, N'@dbRecovery TINYINT output', @dbRecovery output;
   
    -- 开始收缩日志
    -- 1、设置模式为简单模式
    SET @sql = N'ALTER DATABASE [' + @dbName + N'] SET RECOVERY SIMPLE WITH NO_WAIT';
    EXECUTE sp_executesql @sql;
    SET @sql = N'ALTER DATABASE [' + @dbName + N'] SET RECOVERY SIMPLE';
    EXECUTE sp_executesql @sql;
 
    -- 2、收缩文件
    SET @sql = N'USE [' + @dbName + N'];' + Char(13) + Char(10) +
        --'GO' + Char(13) + Char(10) +
        'DBCC SHRINKFILE (N''' + @logname + ''', 1, TRUNCATEONLY)';
    EXECUTE sp_executesql @sql;
 
    -- 3、恢复原来的模式
    IF @dbRecovery = 1
    BEGIN
        SET @sql = N'ALTER DATABASE [' + @dbName + N'] SET RECOVERY FULL WITH NO_WAIT';
        EXECUTE sp_executesql @sql;
        SET @sql = N'ALTER DATABASE [' + @dbName + N'] SET RECOVERY FULL';
        EXECUTE sp_executesql @sql;
    END  
 
    PRINT '数据库:' + @dbName + ' 日志文件:' + @logname + ' 收缩完成';
END

 


首发:http://beinet.cn
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

游北亮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值