这似乎是大多数论坛和整个网络中的一个常见问题,这里以多种格式提出,通常听起来像这样:
在 SQL Server 中 - 事务日志增长如此之大的一些原因是什么? 为什么我的日志文件这么大? 有什么方法可以防止这个问题的发生? 当我找到根本原因并希望将我的事务日志文件设置为健康的大小时,我该怎么办?
在 SQL Server 中 -
一个简短的答案:
您可能正在运行一个长时间运行的事务(索引维护?大批量删除或更新?)或者您处于“默认”(更多关于默认含义的内容)的恢复模式Full并且没有进行日志备份(或没有足够频繁地服用它们)。
Full
如果是恢复模式问题,Simple如果您不需要时间点恢复和定期日志备份,简单的答案可能是切换到恢复模式。但是,许多人在不了解恢复模型的情况下就给出了答案。继续阅读以了解它为什么重要,然后决定你做什么。您也可以开始进行日志备份并保持Full恢复状态。
Simple
可能还有其他原因,但这些是最常见的。该答案开始深入探讨最常见的两个原因,并为您提供有关原因和原因背后的一些背景信息,并探讨其他一些原因。
更长的答案: 哪些情况会导致日志不断增长?原因有很多,但通常这些原因有以下两种模式: 对恢复模型存在误解或存在长时间运行的事务。请继续阅读以了解详细信息。
(处于*完全恢复模式*并且不进行*日志备份*- 这是最常见的原因 - 绝大多数遇到此问题的人。)
虽然这个答案不是对 SQL Server 恢复模型的深入探讨,但恢复模型的主题对于这个问题至关重要。
在 SQL Server 中,有三种恢复模式:
Bulk-Logged
我们现在将忽略Bulk-Logged我们会说它是一个混合模型,并且大多数处于此模型中的人都是有原因的并且了解恢复模型。
我们关心的两个和他们的困惑是大多数人遇到这个问题的原因是Simple和Full。
在我们谈论恢复模型之前:让我们来谈谈一般的恢复。如果您想更深入地了解这个主题,只需阅读Paul Randal 的博客以及您想要的尽可能多的帖子。不过,对于这个问题:
恢复模型:
Simple Recovery
SQL Server 在 Simple Recovery 中侦听此请求,它只保留执行崩溃/重新启动恢复所需的信息。一旦 SQL Server 确定它可以恢复,因为数据被强化到数据文件(或多或少),已经强化的数据在日志中不再需要并被标记为截断 - 这意味着它可以被重新使用。
Full Recovery
这里有规则和例外。我们将在下面深入讨论长期运行的事务。
但是要记住完全恢复模式的一个警告是:如果您只是切换到Full Recovery模式,但从未进行初始完全备份,SQL Server 将不会满足您的模型请求Full Recovery。您的事务日志将继续按原样运行,Simple直到您切换到完全恢复模式并获得第一个Full Backup.
Full Backup
那么,不受控制的日志增长最常见的原因是什么?答:处于完全恢复模式而没有任何日志备份。
这一直发生在人们身上。
为什么它总是发生?因为每个新数据库都通过查看模型数据库来获取其初始恢复模型设置。
模型的初始恢复模型设置始终是Full Recovery Model- 直到并且除非有人改变它。所以你可以说“默认恢复模式”是Full. 许多人没有意识到这一点,并且他们的数据库在Full Recovery Model没有日志备份的情况下运行,因此事务日志文件比必要的大得多。这就是为什么当默认值不适合您的组织及其需求时更改默认值很重要的原因)
Full Recovery Model
如果没有足够频繁地进行日志备份,您也可能在这里遇到麻烦。 每天进行一次日志备份听起来不错,它使还原需要更少的还原命令,但请记住上面的讨论,该日志文件将继续增长,直到您进行日志备份。
您需要考虑两件事来考虑您的日志备份频率:
(“我的恢复模式很好!日志还在增长!)
这也可能是导致不受控制和不受限制的日志增长的原因。无论恢复模式如何,但它经常出现“但我处于简单恢复模式 - 为什么我的日志仍在增长?!”
这里的原因很简单:如果 SQL 使用此事务日志进行恢复,如上所述,那么它必须回溯到事务的开始。
如果您有一个需要很长时间或进行大量更改的事务,则日志无法在检查点截断仍在打开的事务中或自该事务开始以来已开始的任何更改。
这意味着一个大删除,在一个删除语句中删除数百万行是一个事务,并且在整个删除完成之前,日志不能进行任何截断。在Full Recovery Model中,此删除被记录,这可能是很多日志记录。维护窗口期间的索引优化工作也是如此。这也意味着糟糕的事务管理以及不注意和关闭打开的事务真的会伤害您和您的日志文件。
您可以通过以下方式在这里拯救自己:
UPDATE TableName Set Col1 = 'New Value'
BEGIN TRAN
简短的回答:是的。下面更长的答案。
问题:“我正在使用日志传送,所以我的日志备份是自动的……为什么我仍然看到事务日志增长?”
答案:继续阅读。
日志传送就是它听起来的样子 - 您将事务日志备份传送到另一台服务器以用于 DR 目的。有一些初始化,但之后的过程相当简单:
NORECOVERY
STANDBY
如果事情没有按照您的计划进行,还有一些工作需要监控和提醒。
在某些情况下,您可能只想每天或每三天或每周一次进行日志传送恢复。那也行。但是,如果您对所有作业(包括日志备份和复制作业)进行此更改,则意味着您一直在等待进行日志备份。这意味着您将有大量的日志增长——因为您处于没有日志备份的完全恢复模式——而且这可能还意味着要复制一个大的日志文件。您应该只修改还原作业的计划,并让日志备份和副本更频繁地发生,否则您将遇到此答案中描述的第一个问题。
除了这两个之外还有其他原因,但这些是最常见的。不管是什么原因:有一种方法可以分析这种无法解释的日志增长/缺少截断的原因,并查看它们是什么。
通过查询sys.databases目录视图,您可以看到描述日志文件可能正在等待截断/重用的原因的信息。
sys.databases
有一列调用log_reuse_wait原因代码的查找 ID 和一log_reuse_wait_desc列描述等待原因。参考书籍在线文章中的大部分原因(您可能会看到的原因以及我们可以解释原因的原因。缺少的原因要么已停用,要么供内部使用),并附有一些关于等待的说明斜体:
log_reuse_wait
log_reuse_wait_desc
ROLLBACK
COMMIT