同事A: 我刚做了个大表的备份,导致事务日志暴涨,空间快爆了,帮我处理下。
我: ....

1、看看啥情况

登录上去看,D盘只剩7G多,还好这个业务系统数据不怎么增长。 查看数据库的日志空间使用情况:

dbcc sqlperf(logspace)

看到有个数据库的日志空间很大,使用99%多了。

2、怎么办

要降空间,只能做备份了。查看下这个数据库最近的备份情况:

SELECT bs.database_name,
    backuptype = CASE 
        WHEN bs.type = 'D' AND bs.is_copy_only = 0 THEN 'Full Database'
        WHEN bs.type = 'D' AND bs.is_copy_only = 1 THEN 'Full Copy-Only Database'
        WHEN bs.type = 'I' THEN 'Differential database backup'
        WHEN bs.type = 'L' THEN 'Transaction Log'
        WHEN bs.type = 'F' THEN 'File or filegroup'
        WHEN bs.type = 'G' THEN 'Differential file'
        WHEN bs.type = 'P' THEN 'Partial'
        WHEN bs.type = 'Q' THEN 'Differential partial'
        END + ' Backup',
    CASE bf.device_type
        WHEN 2 THEN 'Disk'
        WHEN 5 THEN 'Tape'
        WHEN 7 THEN 'Virtual device'
        WHEN 9 THEN 'Azure Storage'
        WHEN 105 THEN 'A permanent backup device'
        ELSE 'Other Device'
        END AS DeviceType,
    bms.software_name AS backup_software,
    bs.recovery_model,
    bs.compatibility_level,
    BackupStartDate = bs.Backup_Start_Date,
    BackupFinishDate = bs.Backup_Finish_Date,
    LatestBackupLocation = bf.physical_device_name,
    backup_size_mb = CONVERT(DECIMAL(10, 2), bs.backup_size / 1024. / 1024.),
    compressed_backup_size_mb = CONVERT(DECIMAL(10, 2), bs.compressed_backup_size / 1024. / 1024.),
    database_backup_lsn, -- For tlog and differential backups, this is the checkpoint_lsn of the FULL backup it is based on.
    checkpoint_lsn,
    begins_log_chain,
    bms.is_password_protected
FROM msdb.dbo.backupset bs
LEFT JOIN msdb.dbo.backupmediafamily bf
    ON bs.[media_set_id] = bf.[media_set_id]
INNER JOIN msdb.dbo.backupmediaset bms
    ON bs.[media_set_id] = bms.[media_set_id]
WHERE bs.backup_start_date > DATEADD(WEEK, - 2, sysdatetime()) --only look at last two weeks
and bs.database_name='szyb' -- 限定database
ORDER BY --bs.database_name ASC,
    bs.Backup_Start_Date DESC;

看到3小时前备份过,而且是6小时备份一次日志,而且是NBU备份的。那就好办了,手动在NBU发起一次日志备份。

第一次比较慢,然后最好执行多几次,因为可能第一次没有截断日志。我执行了3次,第一次用了十几分钟,第二三次都是2分钟左右就完成了。

执行完再查看数据库的日志空间使用,发现使用率已经降下来了,只有1%不到。但是看了D盘空间,还是一样,没有任何变化

3、收缩日志文件

想要释放空间,需要做日志文件收缩。建议慢慢收缩,不要一次性收缩太多。

USE [szyb]
GO
DBCC SHRINKFILE(N'SZY_LOG',55952)
GO

数值根据当前日志大小来决定,每次收缩个20%左右。如果发现收缩不了,可能是因为有新的日志占用影响了,可以再做一次日志备份然后执行收缩。直到收缩到你想要的空间。注意别收缩太狠,例如当前日志空间实际使用是1G,你起码保留个10G。

4.其它

没有用备份软件做数据库的日志备份怎么办?那就只能手工发起日志备份了。

要先挂个临时目录来备份,不然你直接再备份到当前爆了的盘,那不是直接宕机了。

然后再做一次事务日志备份。注意,如果你从来没做过事务日志备份,那会很大!要找个安全的停机窗口来做。

等不到停机窗口?那就只能磁盘扩容了。