2

在我的团队 ASP.NET 应用程序的数据访问层中,我通过使用 .NET SQLClient 对我们的数据库运行存储过程。添加新代码以允许对数据库进行插入操作后,我测试了代码,并收到以下异常:

The transaction log for database 'DBName' is full. To find out why space in the log cannot be reused, see the log_reuse_wait_desc column in sys.databases

我确认在 MS SQL Server Management Studio 中尝试插入操作时收到了相同的消息。我很担心,因为我最近添加了三个两个触发器两个数据库来执行基于插入和更新某些表的一些数据插入,并且我认为可能我已经招致了一个无限循环或类似性质的东西。

但是,根据在线此问题的其他实例,这似乎不是通常由触发器或旋转查询引起的问题。我查询了log_reuse_waitandlog_reuse_wait_desc列并返回了以下内容:

2 | LOG_BACKUP

此外,查询返回:SELECT [name], recovery_model_desc, log_reuse_wait_desc
FROM sys.databases

name | recovery_model_desc| log_reuse_wait_desc

DBName|   FULL            | LOG_BACKUP

其中第一列是log_reuse_wait,第二列是log_reuse_wait_desc。根据msdn上代码的定义,我需要执行日志备份,然后可以自动截断日志,以便对数据库进行进一步的操作。这是一个正确的假设吗?这可能是由错误编码的触发器引起的,还是更多的日常维护任务,由数据库上的大量事务引起?

编辑:

查询select type_desc, size, max_size from sys.database_files返回:

   type_desc | size | max_size
1| ROWS      |  512 | -1
2| LOG       |  64  |  -1
4

1 回答 1

10

如果您的数据库处于完全恢复模式,则在执行日志备份之前,不会截断日志(截断是一个糟糕的词,我希望他们选择其他内容)。基本上,当您将数据库置于 FULL 恢复模式时,您是在告诉 SQL Server 您需要时间点恢复。为了做到这一点,SQL Server 需要来自上次完整(或差异)备份的完整日志链,并且为了做到这一点,它不会重新使用(“截断”)日志空间,直到您备份了日志.

这是处于完全恢复模式的数据库的常规操作问题。如果您不需要时间点恢复,请将您的数据库设置为简单恢复模式 - 这将自动重用日志空间,但您只能恢复到上次的完整/差异备份。

如果您确实需要时间点恢复,那么您需要(嗯,您的 DBA 团队需要)设置一个定期执行日志备份的维护计划。

于 2012-12-20T16:24:57.727 回答