SQL server - Delete语句增加LOG大小

时间:2014-01-13 19:00:13

标签: sql-server logfile

我有一个LOGGIN数据库,它非常大 - 400 GB。它有数百万行。

我刚刚运行了delete语句,耗时2.5小时,可能删除了数百万行。

 delete FROM [DB].[dbo].[table]
 where [Level] not in ('info','error')

这是一个简单的恢复模型数据库。但是,当我运行上述语句时,日志文件增长到800 GB并使服务器崩溃。为什么LOG文件对于简单的恢复模型数据库而言会增长?

将来如何避免这种情况?

感谢您的时间 - RM

1 个答案:

答案 0 :(得分:5)

我打赌你试图在一次交易中运行整个删除。正确?

交易完成后,可以回收日志空间。由于事务从未完成,因此日志文件一直在增长,直到它崩溃服务器。

查看我的博客条目如何删除大数据。

http://craftydba.com/?p=3079

解决方案的关键是以下,SIMPLE恢复模式,小批量DELETE,在清除结束时进行完全备份。选择最后需要的恢复模型。

以下是一些帮助您的示例代码。

--
-- Delete in batches in SIMPLE recovery mode
--

-- Select correct db
USE [MATH]
GO

-- Set to simple mode
ALTER DATABASE [MATH] SET RECOVERY SIMPLE;
GO

-- Get count of records
SELECT COUNT(*) AS Total FROM [MATH].[dbo].[TBL_PRIMES];
GO

-- Delete in batches
DECLARE @VAR_ROWS INT = 1;
WHILE (@VAR_ROWS > 0)
BEGIN
    DELETE TOP (10000) FROM [MATH].[dbo].[TBL_PRIMES]; 
    SET @VAR_ROWS = @@ROWCOUNT;
    CHECKPOINT;
END;
GO

-- Set to full mode
ALTER DATABASE [MATH] SET RECOVERY FULL;
GO

最后但同样重要的是,如果删除后的剩余数据量非常小,则执行以下操作可能会更快。

1 - SELECT * INTO [Temp Table] WHERE (clause = small data).
2 - DROP [Original Table].
3 - Rename [Temp Table] to [Original Table].
4 - Add any constraints or missing objects.

DROP表操作不会记录要删除的所有数据。

此致

约翰