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

时间:2017-12-29 15:45:30

标签: sql sql-server sql-delete repeat truncate

我的客户驱动器上的空间不足,而且它完全被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大小),但它没有好像重复一遍。我也尝试过添加()从第一个删除语句开始,然后在第一个&#34; Go 2&#34;之后结束。线。当我这样做时,它只是说:

Incorrect syntax near "Go"

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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