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/
根据我保留的数据大小与我要删除的数据量,我使用的一个技巧是:
选择所有“要保留的数据”到另一个表中(仅用于临时存储)
截断原始表
将临时存储表中的所有数据插入到原始数据中
如果您保留的数量小于您要删除的数量,则效果很好。
如果所有数据库文件都在同一个磁盘(数据和日志)上并且要删除的数据大约是数据的一半,则类似的选项是使用bcp 命令行实用程序,然后再次使用 bcp 截断并插入数据文件。
我见过 DBA 使数据库脱机、备份日志、关闭日志记录并这样做,但这似乎很麻烦。:-)