同事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.其它
没有用备份软件做数据库的日志备份怎么办?那就只能手工发起日志备份了。
要先挂个临时目录来备份,不然你直接再备份到当前爆了的盘,那不是直接宕机了。
然后再做一次事务日志备份。注意,如果你从来没做过事务日志备份,那会很大!要找个安全的停机窗口来做。
等不到停机窗口?那就只能磁盘扩容了。
...