如何重复运行SQL删除语句和缩小事务日志?

问题描述 投票:0回答:2

我的客户在他们的驱动器上空间不足,而且它完全由SQL DB和事务日志占用。不幸的是,移动数据库和日志不是我们目前可用的选项,因此我需要弄清楚如何从2个大型表中删除行。到目前为止,一位同事花了4天的时间试图做到这一点并且无法在其中留下痕迹。事务日志只有13GB可用,从这些表中删除大量数据可以快速删除13GB。显然,最快的方法是将我们想要保留的内容移动到临时表中,截断现有表,然后将其移回。不幸的是,这是一个医院内非常繁忙的环境,每小时有数万行写入这些表。所以,遗憾的是,我们不能暂时停止写入此表以便能够截断。

因此,我们一直从每个表中删除一个月的数据,然后缩小事务日志以再次执行此操作。我觉得必须有一种方法让这个重复,但我不完全确定我在做什么......我试过:

delete top (10000)
from Table 1_
where CreationDate_ < '2017-06-01' 

Go

delete top (10000)
from Table2_
where CreationDate_ < '2017-06-01' 

Go

dbcc shrinkfile (SQL_Log,4)

Go 2

Go 2

这似乎从每个表中删除10,000行,然后运行日志的缩小文件两次(由于某种原因,当我们只运行它两次时它不会完全缩小到4224kb大小),但它似乎没有重复。我也尝试从第一个删除语句开始添加(),并在第一个“Go 2”行之后结束。当我这样做时它只是说:

Incorrect syntax near "Go"

任何人都有任何线索如何做到这一点?如果我们可以让它工作,我计划将删除语句增加到远大于10,000的数字,并将脚本上的重复增加到大于2的数字,但我需要在实际执行之前让它工作那...

sql sql-server sql-delete repeat truncate
2个回答
1
投票

您可以使用WHILE循环并使用COUNT记录控制迭代次数。

DECLARE @Chunk INT = 10000
DECLARE @Date DATE = '2017-06-01'
DECLARE @Cnt INT = SELECT COUNT(*) FROM Table 1_ WHERE CreationDate_ < @Date
WHILE @Cnt > 0
  BEGIN
    delete top (@Chunk)
    from Table 1_
    where CreationDate_ < @Date
    SET @Cnt = @Cnt - @Chunk
  END
//Move on to the next group
SET @Date = '2017-07-01'
SET @Cnt = SELECT COUNT(*) FROM Table 1_ WHERE CreationDate_ < @Date

WHILE @Cnt > 0
   BEGIN
   // Your delete query
   SET @Cnt = @Cnt - @Chunk
END
//and so on

1
投票

您不需要重复收缩日志文件。如果数据库处于简单恢复模式,则只要您不在单个事务中删除太多行,日志文件就不会继续增长。清除所有行后,您可以将日志文件缩小到适合环境的值。

© www.soinside.com 2019 - 2024. All rights reserved.