我在使用 SQL Server 2008 R2 时遇到了“事务日志已满”问题。
我的数据库包含 80,000 个表,其中最多包含 5 列 BIGINT,并且每列都有一个索引。
数据库的恢复模型设置为简单。
数据库的工作模式是持续大约 50 小时执行大量插入、更新和删除命令,而在给定时间内仅在同一时间段内执行 8 条命令。
事务日志文件设置为自动增长 10%,并且限制为 2,000 GB(这是错误定义的,因为磁盘大小只有 500 GB)。
数据库执行上述命令时出现‘事务日志已满’异常,其文件大小为 41 GB,日志文件为 270 GB,占用了所有磁盘空间。
为了防止问题再次发生,我们将最大日志文件大小设置为 20 GB,并删除了上述命令中的所有事务(因为不需要使用事务)。
但不幸的是,当日志文件达到 20GB 的限制时,我们再次遇到了这个异常。
是否有可能由于服务器始终在执行命令而导致事务日志没有一刻未被使用,因此 SQL 服务器不会截断日志文件?
造成这种行为的原因可能是什么?
答案1
事务日志的增长可能是因为您在单个事务中执行了这些操作,而不是将它们拆分成更小的事务。例如,如果您一起删除 1 ML 条记录,则该操作将首先插入事务日志,然后提交到数据库。但是,如果您将删除操作拆分成更小的事务,例如每个事务 10,000 条记录,事务日志就会更小,并且您的可用磁盘空间也会更安全。
答案2
在您开始此数据运行之前,是否有可能有一个事务正在运行?事务日志是按顺序写入的,并且文件的某些部分只能在以下情况下重复使用:全部该部分中的事务已完成。单个长时间运行的事务(即使它没有执行任何操作)可能会阻止日志被重新使用。