SQL Server日志文件在简单恢复模型下填充

时间:2012-12-26 17:26:44

标签: sql-server

我在SQL Server 2008 R2中有一个数据库,其中有数百万个文件作为varbinary blob存储在其中。我上周建立了一个流程来执行以下操作:

  1. 使用一些实体框架代码获取具有blob的行(即实体)。
  2. 将blob流复制到对象库。
  3. 使用商店中的新对象ID更新数据库中的实体。
  4. 我有30个线程不断地执行此操作,此过程仍需要几天时间。几天前,数据库日志文件已填满,我确信它必须由此过程引起。我认为时间点备份对于此数据库并不重要,并将数据库设置为使用简单恢复模型。然后昨天我再次从我的进程中得到错误,说日志文件已经填满!在简单模式下这怎么可能?!知道我能做些什么来阻止这种情况发生吗?当我监视日志文件时,SQL Server让它达到7%已满,然后将其截断为零,所以我非常困惑。在完整备份开始时,似乎日志文件开始未经检查...

2 个答案:

答案 0 :(得分:3)

即使在简单恢复模式下,SQL Server也会填充日志文件以保持ACID合规性并允许回滚(或在某些灾难恢复方案中“前滚”)。所以你需要有足够的空间来至少处理它一次可能收到的交易,否则会自动增长或出现错误。

现在作为一个实际问题,你有几个选择。最简单的是给它足够的空间来处理事务。另一种方法是将其分解为更少的事务,因为在简单恢复中,它将允许在事务完全提交和完成后重用该空间。

为了清晰起见而编辑并回复评论:SQL Server将在隐式事务中放置几乎所有操作(有一些例外,但它们在这里并不重要),即使显式操作不是调用。因此,如果您说执行一个插入一百万行的命令,它将具有该插入的隐式事务,即使在简单恢复模式下,所有这些百万行都将影响事务日志,直到事务完全提交并完成。如果你想让它更快地释放空间,那么重写你的代码,这样你就不需要插入一百万行的一个语句就会有10个语句,每个语句插入十万个。

从您的问题中不清楚在完整备份期间正在增长,但是,备份过程确实会影响其在日志发生时释放空间的能力。这是因为完整备份还包括来自日志文件的数据,因此服务器需要确保在备份过程中信息可用。在In Recovery进行了相关讨论。

我通常非常不愿推迟计划备份,但在这种特定情况下它可能会有所帮助。这听起来像是将你的交易分成更小的部分可能最终成为可能的方式。

答案 1 :(得分:0)

  

似乎日志文件在完整时开始未经检查地增长   备份开始...

所以只有在进行完整备份时才会增长?这是有道理的,因为完整备份包含所有数据页以及备份过程中生成的日志记录范围。

因此,在备份运行时,日志可能无法截断。请注意,这是我(教育)的推测。

您可以通过查看sys.databases.log_reuse_wait_desc值来确认。