Sql server 插入具有默认值的非空列
我有一个数据库,用于在web服务器上进行开发和测试。我想做的是向包含大约50000条记录的表中添加一列(请注意,我不是数据库管理员)。我使用提供商提供的凭据通过SSMS连接,并执行下一个查询Sql server 插入具有默认值的非空列,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我有一个数据库,用于在web服务器上进行开发和测试。我想做的是向包含大约50000条记录的表中添加一列(请注意,我不是数据库管理员)。我使用提供商提供的凭据通过SSMS连接,并执行下一个查询 ALTER TABLE MyTable ADD MyCol BIT CONSTRAINT MyConstraint DEFAULT 1 NOT NULL 我得到的错误是: 味精9002,第17级,第4状态,第2行 数据库“my_db”的事务日志已满。要了解日志中的空间无法重用的原因,请参阅sys.data
ALTER TABLE MyTable
ADD MyCol BIT
CONSTRAINT MyConstraint DEFAULT 1 NOT NULL
我得到的错误是:
味精9002,第17级,第4状态,第2行数据库“my_db”的事务日志已满。要了解日志中的空间无法重用的原因,请参阅sys.databases中的log\u reuse\u wait\u desc列 如果我执行
SELECT log_reuse_wait_desc, *
FROM sys.databases WHERE name ='my_db'
GO
在与Add MyCol一起的批处理中,log\u reuse\u wait\u desc将是活动的\u事务。如果我将它作为一个单独的命令执行,它将是CHECKPOINT
数据库的恢复模式设置为简单。我已经在网上搜索了一个解决方案,人们建议将恢复模式设置为简单的(已经是),或者备份日志文件,然后缩小它,这是一些专家认为非常糟糕的实践。
那么,我需要做什么来向包含数据的表中添加简单的NOTNULL列呢
编辑:如果有人不想通读所有答案,下面是解决方案:
要获取事务日志的大小,我是这样做的:
sp_helpdb 'YouDatabaseName'
在结果窗口中,您将获得日志文件的大小(我的是8MB)。要将其增加到更大的值,请使用以下查询:
ALTER DATABASE YourDatabaseName
MODIFY FILE(NAME = YourDatabaseLogName, SIZE=128MB);
GO
错误将消失。您可以指定日志的大小更大,该消息不会出现。您可以将日志增加到自动增长(或两者都增加),这样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'
您可以指定更大的日志大小,以确保此消息不会出现。您可以将日志增加到自动增长(或两者都增加),这样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'
这意味着您的日志文件太小,无法增长 添加此列(在本例中,并非总是针对
位
列)需要对磁盘上的结构进行洗牌,从而生成日志条目,以便可以回滚。备份日志文件并缩小它几乎永远都不是一个好的解决方案:听起来好像已经在这里完成了,因此它太小了。我的意思是非常小,因为50000行很小
您可以使用SQL或GUI增加空间和/或增长。此答案描述了更多内容:这意味着您的日志文件太小,无法增长 添加此列(在本例中,并非总是针对
位
列)需要对磁盘上的结构进行洗牌,从而生成日志条目,以便可以回滚。备份日志文件并缩小它几乎永远都不是一个好的解决方案:听起来好像已经在这里完成了,因此它太小了。我的意思是非常小,因为50000行很小
您可以使用SQL或GUI增加空间和/或增长。此答案描述了更多内容:尝试取消对日志文件大小的限制或增加日志文件:
尝试取消对日志文件大小的限制或增加日志文件:
检查点的描述可以是: 自上次日志截断后未发生任何检查点,或者 尚未移动到虚拟日志文件之外的日志(所有恢复) 模型)。这是延迟日志截断的常规原因 除非手动更改检查点设置,否则这意味着您的日志文件太小。如果可能,允许日志文件增长,或者完全删除最大大小 如果无法增加日志文件大小,可以尝试解决此问题。一种解决方法是将更改拆分为较小的事务。例如:
- 将列添加为可空(添加可空列是一个小得多的事务)
- 分小块更新列(例如,一次更新1000行)
- 将列修改为
非空
- 将列添加为可空(添加可空列是一个小得多的事务)
- 分小块更新列(例如,一次更新1000行)
- 将列修改为
非空
sp_rename
)您建议的最后一个是我所做的,但我花了6个小时才完成两个表!首先我做的是任务->为两个表(带数据)生成脚本,然后我删除了它们包含的所有关系,然后在一批中删除了2000个最上面的行。然后我换了颜色