SQL Server如何解决将列更新为int时填满的事务日志

cod*_*000 18 sql-server-2005 sql-server transaction-log

我有一个名为 SQL Server 2005 的表BRITTNEY_SPEARS_MARRIAGES,它具有以下列:

MarrigeId tinyint, 
HusbandName varchar(500),
MarrigeLength int
Run Code Online (Sandbox Code Playgroud)

现在我有另一张桌子 BRITTNEY_SPEARS_MARRIAGE_STORIES

StoryId int, 
MarriageId tinyint, 
StoryText nvarchar(max)
Run Code Online (Sandbox Code Playgroud)

问题是我们想将MarrigeIdint从 a更新为a tinyint。我们只是觉得布兰妮在一切都说完和做完之前会有很多婚姻。

现在BRITTNEY_SPEARS_MARRIAGE_STORIES表中有 1800 万行(嘿,这个女孩有一些问题),所以当我们进行更新时,事务日志填满了,我们的 SQL Server 框就死了。

我们怎样才能解决这个问题?

无论如何,是否可以说“嘿 SQL Server,我将更新此列并使其更大。相信我在此 SQL Server 上。请不要在尝试验证所有内容时填写事务日志?”

Dav*_*kle 7

没有办法告诉 SQL Server 不要使用事务日志。

可以做的是将数据库的恢复模式设置为 SIMPLE,这将在需要空间时覆盖旧的日志条目。但是,您不应在生产服务器上执行此操作,因为您将无法执行某些类型的还原,例如时间点还原。

或者,您可以将事务日志文件设置得更大——作为一个不科学的经验法则,我会确保 A) 您的事务日志的可用空间至少比您的表的大小多 1.5 倍或 B)您的事务日志可以自动增长到至少有大约这个可用磁盘空间量的驱动器。

您可以通过备份日志来释放事务日志空间。如果您不关心日志内容,请将文件扔掉。一个快捷方式是BACKUP LOG <Your Database Name> TO DISK = 'NUL:'。同样,不要在生产服务器上执行此操作,除非您绝对确定您了解其含义。

另一件需要注意的事情(尽管它与您的问题并不完全相关)是确保您要扩展的表上定义了聚集索引。如果没有,该表可能会产生大量的堆碎片,并可能在这样的更改中变得不必要的大。


And*_*mar 5

  • 删除任何外键
  • 使用int而不是创建新表tinyint
  • 每批移动 1000 行(将它们插入新表中,从旧表中删除它们)
  • 删除旧表
  • 使用以下命令将新表重命名为旧名称 sp_rename
  • 重新创建外键

pS 如果您的事务日志很大...请检查您的恢复模式。如果您的恢复模式不是simple,那么您上次备份日志是多长时间?