数据库的事务日志已满。要找出无法重用日志中的空间的原因,请参阅sys.databases中的log_reuse_wait_desc列。

时间:2012-02-25 09:43:58

标签: sql-server

我在尝试删除单个删除查询中的355447条记录时遇到以下错误。

数据库的事务日志已满。要找出无法重用日志中的空间的原因,请参阅sys.databases中的log_reuse_wait_desc列

我试过了foll。解决方案,但仍然删除语句抛出相同的错误。

DBCC SHRINKFILE(DBname_Log, 2)
BACKUP LOG gis_sync WITH TRUNCATE_ONLY
DBCC SHRINKFILE(DBname_Log, 2)

请帮我解决.... 感谢

3 个答案:

答案 0 :(得分:30)

顺便说一句,使用批处理删除大量行总是一种很好的做法(可能是此类问题的解决方案):

WHILE EXISTS (SELECT 1 
              FROM   YourTable 
              WHERE  <yourCondition>) 
  DELETE TOP(10000) FROM YourTable 
  WHERE  <yourCondition>

答案 1 :(得分:13)

正如Damien所说,你应该找出你的日志增长的原因。查看此帖子以获得解释:Transaction Log Reuse Wait

删除那么多记录本身就需要很大的日志空间,所以如果你不能为日志文件腾出更多空间,你可能需要在几个较小的步骤中删除这些行。如果您正在使用“完全”恢复,则必须在每个步骤后进行日志备份。

在旁注中,BACKUP LOG ... WITH TRUNCATE_ONLY通常是一个非常糟糕的主意。如果您处于完全恢复模式,那么这将破坏您的备份链并阻止您进行时间点恢复。如果您不需要时间点可恢复性,请使用“简单”恢复设置。否则,请进行真正的日志备份,并将其与其他备份文件一起存储。

日志文件中的DBCC SHRINKFILE对您正在收缩的数据库没有任何帮助。您可以使用它为驱动器上的其他DB腾出空间,但它不会为当前数据库腾出空间,因为它只能删除可重用的空间。这意味着任何由它释放的空间都可以用于您的交易。

答案 2 :(得分:11)

我也遇到了同样的问题。我得到的结论是当数据库文件存在的磁盘已满时出现此异常。解决此问题我只是增加了磁盘。