我有一个用于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
错误将消失。
答案 0 :(得分:2)
CHECKPOINT
的说明可以是found on MSDN:
自上次日志截断或头部以来未发生任何检查点 日志尚未超出虚拟日志文件(所有恢复 楷模)。这是延迟日志截断的常规原因。
除非您手动更改了检查点设置,否则这意味着您的日志文件太小。如果可能,请允许日志文件增长,或者完全删除最大大小。
如果无法增加日志文件大小,可以尝试解决它。一种解决方法是在较小的事务中拆分您的更改。例如:
not null
答案 1 :(得分:1)
您可以指定更大的日志大小,此消息不会出现。您可以将日志增加到自动增长(或两者),SQL Server可以在事务中获得更多空间。
您可以使用以下命令增大尺寸:
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)
尝试删除对日志文件大小的限制或增加日志文件: