将列设置为NULL而不生成事务日志

时间:2017-01-06 16:26:29

标签: sql-server tsql

我有一个15GB的数据库,其中一些二进制数据占数据库的50%。我想删除那些不需要的数据,但我的事务日志的大小会爆炸。我有什么选择?

我只能删除一个列数据: UPDATE t SET binData=NULL WHERE binData IS NOT NULL

是的,空间可能是问题:因此我的问题。我需要在1000多个数据库上执行此操作(大多数是cca 1-2GB)。我没有2倍的可用空间

4 个答案:

答案 0 :(得分:0)

注意:请试试拳头。 请勿在生产中使用!!!

  1. 导入要保留在新临时表中的数据
  2. 截断原始表格
  3. 将数据从新临时表导入到原始表

答案 1 :(得分:0)

根据您上次的评论,似乎最好的方法是这样的:

注意:请先在测试盒/安装上尝试此操作。在没有进行前期测试和规划的情况下,请勿在生产中进行此操作!

  • 将DBs记录模式设置为Simple
  • ALTER TABLE t DROP COLUMN BinData
  • ALTER TABLE t ADD BinData [define column]
  • 将记录模式设置回完整
  • 进行完整备份
  • (可选)缩小.mdf文件

注意:无论如何,当您必须清除这样的列时,请在进程前将日志记录设置为“简单”,以使实际日志记录保持最小。

答案 2 :(得分:0)

select 1 
while @@rowcount > 0
begin 
   UPDATE t 
   SET top (100000) binData = NULL 
   WHERE binData IS NOT NULL
end

让db设置为截断登录检查点

答案 3 :(得分:0)

您可以简单地更新几个较小批次的记录。也许你必须在每批之后调用CHECKPOINT作为预防措施。如果您的数据库处于SIMPLE RECOVERY模式,则应自动回收分配的日志空间。如果您的数据库处于FULL RECOVERY模式,那么您必须在每个批处理后执行日志备份,以便允许在日志中重用已分配的空间。您可以通过这种方式控制日志大小。