0

我有一个用于 Web 服务器上的开发和测试目的的数据库。我想做的是在包含大约 50,000 条记录的表中添加一列(请注意,我不是数据库管理员)。我正在通过 SSMS 使用我们的提供商提供的凭据进行连接并执行下一个查询

ALTER TABLE MyTable
ADD MyCol BIT
CONSTRAINT MyConstraint DEFAULT 1 NOT NULL

我得到的错误是:

消息 9002,级别 17,状态 4,第 2 行
数据库“my_db”的事务日志已满。要找出日志中的空间不能被重用的原因,请参阅 sys.databases 中的 log_reuse_wait_desc 列

如果我执行

SELECT log_reuse_wait_desc, * 
FROM sys.databases WHERE name ='my_db'
GO

与 Add MyCol 一起批处理时,log_reuse_wait_desc 将是 ACTIVE_TRANSACTION。如果我将其作为单独的命令执行,它将是 CHECKPOINT

数据库的恢复模式设置为简单。我在互联网上搜索了一个解决方案,人们要么建议将恢复模式设置为简单(已经是),要么备份一个日志文件然后缩小它,一些专家认为这是非常糟糕的做法。

那么我需要做什么才能将简单的 NOT NULL 列添加到包含数据的表中?

编辑:这是解决方案,如果有人不想通读所有答案:

要获取事务日志的大小,我是这样做的:

sp_helpdb 'YouDatabaseName'

在结果窗口中,您将获得日志文件的大小(我的是 8MB)。要将其增加到更大的值,请使用以下查询:

ALTER DATABASE YourDatabaseName
MODIFY FILE(NAME = YourDatabaseLogName, SIZE=128MB);
GO

并且错误将消失。

4

4 回答 4

2

CHECKPOINT可以在 MSDN上找到描述:

自上次日志截断后未发生检查点,或者日志头尚未移动到虚拟日志文件之外(所有恢复模型)。这是延迟日志截断的常规原因。

除非您手动更改检查点设置,否则这意味着您的日志文件太小。如果可能,允许日志文件增长,或完全删除最大大小。

如果您无法增加日志文件的大小,您可以尝试解决它。一种解决方法是将更改拆分为较小的事务。例如:

  • 将列添加为可为空的(添加可为空的列是一个小得多的事务)
  • 以小块的形式更新列(例如,一次 1000 行。)
  • 将列修改为not null
于 2013-05-24T10:53:59.333 回答
1
于 2013-05-24T10:49:36.947 回答
1

这意味着您的日志文件太小且无法增长。

添加此列(在这种情况下,并不总是用于bit列)需要对磁盘结构进行混洗,从而生成日志条目,以便可以回滚。备份日志文件并缩小它几乎从来都不是一个好的解决方案:听起来好像已经在这里完成了,因此它太小了。我的意思是非常小,因为 50,000 行很小。

您可以使用 SQL 或 GUI 增加空间和/或增长。这个答案描述了更多:SQL Server:如何增加事务日志的大小?

于 2013-05-24T10:49:44.617 回答
1

尝试取消对日志文件大小的限制或增加日志文件:

日志

于 2013-05-24T10:50:12.067 回答