使用默认值插入非空列

时间:2013-05-24 10:32:33

标签: sql-server sql-server-2008

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

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

我得到的错误是:

  

Msg 9002,Level 17,State 4,Line 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 个答案:

答案 0 :(得分:2)

CHECKPOINT的说明可以是found on MSDN

  

自上次日志截断或头部以来未发生任何检查点   日志尚未超出虚拟日志文件(所有恢复   楷模)。这是延迟日志截断的常规原因。

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

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

  • 将列添加为可空(添加可为空的列是一个小得多的事务)
  • 以小块更新列(例如,一次更新1000行。)
  • 将列修改为not null

答案 1 :(得分:1)

您可以指定更大的日志大小,此消息不会出现。您可以将日志增加到自动增长(或两者),SQL Server可以在事务中获得更多空间。

请使用此链接作为参考: The transaction log for database is full. To find out why space in the log cannot be reused, see the log_reuse_wait_desc column in sys.databases

您可以使用以下命令增大尺寸:

ALTER DATABASE YourDatabaseName

MODIFY FILE

(NAME = YourDatbase_log,

SIZE = 1500MB);

您可以看到日志文件的大小:

SELECT DB_NAME(database_id) AS DatabaseName,
Name AS Logical_Name,
Physical_Name, (size*8)/1024 SizeMB
FROM sys.master_files
WHERE DB_NAME(database_id) = 'DBName'

答案 2 :(得分:1)

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

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

您可以使用SQL或GUI增加空间和/或增长。这个答案描述了更多:SQL Server: How do I increase the size of the transaction log?

答案 3 :(得分:1)

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

log