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


18

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

MarrigeId tinyint, 
HusbandName varchar(500),
MarrigeLength int

现在我有另一张桌子 BRITTNEY_SPEARS_MARRIAGE_STORIES

StoryId int, 
MarriageId tinyint, 
StoryText nvarchar(max)

问题是我们想将MarrigeId列从中更新inttinyint。我们只是觉得在说完一切之前,布兰妮将会有很多婚姻。

现在BRITTNEY_SPEARS_MARRIAGE_STORIES表中有1800万行(嘿,女孩遇到了一些问题),因此当我们进行更新时,事务日志已填满,SQL Server框消失了。

我们如何解决这个问题?

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

Answers:


7

无法告诉SQL Server不要使用事务日志。

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

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

您可以通过备份日志来释放事务日志空间。如果您不关心日志内容,请丢弃该文件。快捷方式是BACKUP LOG <Your Database Name> TO DISK = 'NUL:'。同样,除非您完全确定自己了解其中的含义,否则请不要在生产服务器上执行此操作

要注意的另一件事(尽管这与您的问题并不完全相关),请确保要扩展的表上定义了聚簇索引。如果不这样做,则该表可能会导致大量的堆碎片,并且在进行此类更改时可能不必要地变得很大。


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

PS如果您的事务日志很大,请检查您的恢复模型。如果您的恢复模型不是simple,那么自您上次备份日志以来已恢复了多长时间?


您的意思是自备份日志以来,备份数据库不会使日志变小。
HLGEM 2012年

@HLGEM:是的,我刚刚读了Paul Randal的文章。但是,如果您仅进行完全备份,则日志会持续增长。
Andomar 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.