gpt4 book ai didi

sql - 必须有一种方法可以删除 SQL Server 中的数据而不会使日志过载

转载 作者:行者123 更新时间:2023-12-02 21:38:40 24 4
gpt4 key购买 nike

我需要删除一堆数据,并且没有足够的磁盘空间让日志继续增长。进一步调查此事后,似乎没有任何办法解决这个问题,但我想我应该问一下;我很难相信如此简单的事情是不可能的。

我尝试循环、分块删除,并在每次迭代后在日志上调用shrinkfile。 SQL Server 似乎只是忽略了shrinkfile 命令。对备份日志执行相同操作(然后删除备份文件)。同样的事情 - 日志不断增长。我正在尝试的数据库的恢复模型很简单 - 我认为这会让事情变得更容易,但事实并非如此。

最佳答案

以 block 的形式进行删除,但不要尝试在两次之间缩小日志,而是在 block 之间进行日志备份(也就是说,如果您处于完全恢复状态)

问题是日志已满,因此必须增长。如果它已满,尝试缩小它是没有用的,日志中没有可用空间可以释放给操作系统。您需要做的是使文件内的空间可供重用。

由于数据库处于简单恢复状态,因此请在每个 block 之间使用 CHECKPOINT 命令按 block 运行删除。您无法在简单恢复中进行日志备份

这里是在不填充日志的情况下进行删除的示例代码(在简单恢复中)。不要将其包装在自定义事务中。这完全违背了批量删除的目的,因为只有整个事务提交后才能清除日志。

(SQL 2005 及更高版本。对于 SQL 2000,删除 TOP 并使用 SET ROWCOUNT)

DECLARE @Done BIT
SET @Done = 0
WHILE @Done = 0
BEGIN
DELETE TOP (20000) -- reduce if log still growing
FROM SomeTable WHERE SomeColumn = SomeValue
IF @@ROWCOUNT = 0
SET @Done = 1
CHECKPOINT -- marks log space reusable in simple recovery
END

要了解日志管理,请查看这篇文章 - http://www.sqlservercentral.com/articles/64582/

关于sql - 必须有一种方法可以删除 SQL Server 中的数据而不会使日志过载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1448857/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com