如何重复运行SQL删除语句和收缩事务日志?
How Do I Repeatedly Run SQL Delete Statements and Shrink Transaction Log?
我有一个客户 运行他们的驱动器 space 已用完,SQL 数据库和事务日志完全占用了它。不幸的是,目前移动数据库和日志不是我们可用的选项,因此我需要弄清楚如何从 2 个大量 table 中删除行。到目前为止,一位同事已经花了 4 天的时间来尝试这样做,但一直未能取得进展。事务日志只有 13GB 可用,从这些 table 中删除大量空间会很快擦除 13GB。显然,最快的方法是将我们想要保留的内容移动到临时 table,然后 运行 覆盖现有的 table,然后将它们移回。不幸的是,这是医院内极其繁忙的环境,每小时有数万行代码写入这些 table。所以,不幸的是,我们不能暂时停止写这个 table 以便能够 t运行cate.
所以我们一直在从这些 table 中的每一个中一次删除一个月的数据,然后缩小事务日志以再次执行此操作。我觉得必须有办法让它重复,但我不完全确定我在做什么......我试过:
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
这似乎从每个 table 中删除了 10,000 行,然后 运行s 日志的收缩文件两次(出于某种原因,当我们只运行 两次),但似乎没有重复。我还尝试添加 () 从第一个 delete 语句开始并在第一个 "Go 2" 行之后结束。当我这样做时,它只是说:
Incorrect syntax near "Go"
有人知道怎么做吗?如果我们能让它工作,我计划将 delete 语句增加到远远大于 10,000 的数字,并将脚本上的重复增加到比 2 大得多的东西,但我需要让它工作才能真正做到那...
您不需要反复收缩日志文件。如果数据库处于简单恢复模式,只要您不在单个事务中删除太多行,日志文件就不会继续增长。清除所有行后,您可以将日志文件缩小到对环境合理的范围。
您可以使用 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
我有一个客户 运行他们的驱动器 space 已用完,SQL 数据库和事务日志完全占用了它。不幸的是,目前移动数据库和日志不是我们可用的选项,因此我需要弄清楚如何从 2 个大量 table 中删除行。到目前为止,一位同事已经花了 4 天的时间来尝试这样做,但一直未能取得进展。事务日志只有 13GB 可用,从这些 table 中删除大量空间会很快擦除 13GB。显然,最快的方法是将我们想要保留的内容移动到临时 table,然后 运行 覆盖现有的 table,然后将它们移回。不幸的是,这是医院内极其繁忙的环境,每小时有数万行代码写入这些 table。所以,不幸的是,我们不能暂时停止写这个 table 以便能够 t运行cate.
所以我们一直在从这些 table 中的每一个中一次删除一个月的数据,然后缩小事务日志以再次执行此操作。我觉得必须有办法让它重复,但我不完全确定我在做什么......我试过:
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
这似乎从每个 table 中删除了 10,000 行,然后 运行s 日志的收缩文件两次(出于某种原因,当我们只运行 两次),但似乎没有重复。我还尝试添加 () 从第一个 delete 语句开始并在第一个 "Go 2" 行之后结束。当我这样做时,它只是说:
Incorrect syntax near "Go"
有人知道怎么做吗?如果我们能让它工作,我计划将 delete 语句增加到远远大于 10,000 的数字,并将脚本上的重复增加到比 2 大得多的东西,但我需要让它工作才能真正做到那...
您不需要反复收缩日志文件。如果数据库处于简单恢复模式,只要您不在单个事务中删除太多行,日志文件就不会继续增长。清除所有行后,您可以将日志文件缩小到对环境合理的范围。
您可以使用 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