在 SQL Server 2008 R2 中,我有一个数据库,该数据库每晚进行一次完整备份,每十分钟进行一次事务日志备份。该数据库处于完整恢复模式。
问题是事务日志的备份文件有数百兆字节大小,但绝对不应该如此。数据库中根本没有那么多活动。每次备份只有十分钟。它们太大了,几天后就会完全填满硬盘。
知道是什么原因导致备份如此之大以及如何解决吗?
答案1
为了明确我们的观点一致,你是说每个日志备份有数百 MB,但日志文件 (LDF) 并不大。后者通常由日志被复制、镜像、被遗忘的活动用户事务或其他任何原因固定(如中所述)来解释。sys.databases.log_reuse_wait_desc
。但是,我知道情况并非如此。如果每 10 分钟进行的日志备份都有数百 MB,那么这意味着过去 10 分钟内一定发生了数百 MB 的活动。也许有一些活动一直在进行,而你却不知道?
当然,我假设您不使用WITH NO_TRUNCATE
或WITH COPY_ONLY
语法来执行日志备份任务。
以下 3 个查询应该可以让您了解日志中的内容:
use [<myproblemdb>];
go
select count(*) as CountLogRecords,
sum([Log Record Length]) [Total Log Length]
from fn_dblog(null, null);
select count(*) as CountTransactionRecords,
sum([Log Record Length]) [Transaction Log Length],
[Transaction ID]
from fn_dblog(null, null)
group by [Transaction ID]
order by 2 desc;
select count(*) as CountLogOperations,
sum ([Log Record Length]) as [Operation Log Length],
[Operation]
from fn_dblog(null, null)
group by [Operation]
order by 2 desc;
答案2
备份前事务日志文件中有多少数据?您可以使用 DBCC LOGINFO 或通过查看 SQL Server Management Studio 中的磁盘空间报告来查看。日志备份有多大?
答案3
您的 VLF 可能太多。运行 DBCC LOGINFO 并查看返回了多少行。如果数量很多,请考虑缩小数据库的事务日志并将其一步扩展到合适的大小。