我有一个LOGGIN
数据库,它非常大 - 400 GB。它有数百万行。
我刚刚运行了delete
语句,耗时2.5小时,可能删除了数百万行。
delete FROM [DB].[dbo].[table]
where [Level] not in ('info','error')
这是一个简单的恢复模型数据库。但是,当我运行上述语句时,日志文件增长到800 GB并使服务器崩溃。为什么LOG文件对于简单的恢复模型数据库而言会增长?
将来如何避免这种情况?
感谢您的时间 - RM
答案 0 :(得分:5)
我打赌你试图在一次交易中运行整个删除。正确?
交易完成后,可以回收日志空间。由于事务从未完成,因此日志文件一直在增长,直到它崩溃服务器。
查看我的博客条目如何删除大数据。
解决方案的关键是以下,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表操作不会记录要删除的所有数据。
此致
约翰