必须有一种方法可以删除SQL Server中没有重载日志的数据

dud*_*er4 5 sql t-sql sql-server

我需要删除一堆数据,并且没有磁盘空间让日志继续增长.在进一步调查此事后,看起来没有办法解决这个问题,但我想我肯定会问; 我很难相信这么简单的事情是不可能的.

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

Gil*_*ter 14

以块的形式进行删除,而不是尝试在不同时间之间缩小日志,在块之间进行日志备份(即如果您处于完全恢复状态)

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

由于数据库处于简单恢复状态,因此在每个块之间使用CHECKPOINT命令以块的形式运行delete.您无法在简单恢复中执行日志备份

这是在不填充日志的情况下删除的示例代码(在简单恢复中).不要将其包装在自定义事务中.这完全违背了批量删除的要点,因为在整个事务提交之前无法清除日志.

(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
Run Code Online (Sandbox Code Playgroud)

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


Ron*_*age 5

根据我保留的数据大小与我要删除的数据量,我使用的一个技巧是:

  1. 选择所有“要保留的数据”到另一个表中(仅用于临时存储)

  2. 截断原始表

  3. 将临时存储表中的所有数据插入到原始数据中

如果您保留的数量小于您要删除的数量,则效果很好。

如果所有数据库文件都在同一个磁盘(数据和日志)上并且要删除的数据大约是数据的一半,则类似的选项是使用bcp 命令行实用程序,然后再次使用 bcp 截断并插入数据文件。

我见过 DBA 使数据库脱机、备份日志、关闭日志记录并这样做,但这似乎很麻烦。:-)