SQL日志和主动交易
-
10-10-2019 - |
题
我有一个Web服务器,其中SQL 2008运行了模拟的SQL 2005 DB,并且我有一个本地SQL 2005 DB用于测试环境。
这使我使用脚本进行备份/还原数据进行测试,因为2008服务器备份不会还原到2005服务器。
当我运行此SQL查询以减小我的Production Web SQL Server上表的大小(2008)
DELETE FROM TickersDay
WHERE (DATEDIFF(day, TickersDay.[date], GETDATE()) >= 8)
GO
我收到此消息:
Msg 9002, Level 17, State 4, Line 3
The transaction log for database 'VTNET' is full. To find out why space in the log
cannot be reused, see the log_reuse_wait_desc column in sys.databases
当我有时也会发布脚本时,它会出现。
当我运行此SQL命令时,我会得到以下结果:
SELECT [name], recovery_model_desc, log_reuse_wait_desc
FROM sys.databases
结果:
[name] recovery_model_desc log_reuse_wait_desc
VTNET SIMPLE ACTIVE_TRANSACTION
这是我的问题和问题:
- 我明白了..我有一个需要回滚命令的交易语句
<if @@ trancount> 0回滚> ..但是我有100个存储过程,所以在我这样做之前。
同时...如何消除这个问题?我尝试收缩,我尝试备份DB ...
如您所见,它处于简单模式...我不知道如何仅备份日志文件...(尚未找到该怎么做)...
解决方案
您可能只需获得SQL即可解决这个问题 不是 通过仅在仅删除所需的日期上使用索引来处理整个表。重新表明它是索引友好的
DELETE FROM TickersDay
WHERE TickersDay.[date] <= DATEADD(day, -8, GETDATE())
GO
如果您经常运行(至少每天),则只需在Tickersday([DATE])上通过索引处理1/9或更少,而如果您在现场使用Notatediff,则不必浏览整个桌子。
如果仍然引起这一点:
数据库“ VTNET”的事务日志已满
您确实需要增加日志大小,因为我怀疑它不设置自动化,并且对于此操作还不够大。要么开始查看删除删除(再次假设您在日期都有索引,因此有效地仅针对100行),例如
DELETE TOP (100) FROM TickersDay
WHERE TickersDay.[date] <= DATEADD(day, -8, GETDATE())
GO
您可以循环循环(@@ rowcount> 0),也可以更频繁地安排它作为滴答背景删除。
不隶属于 StackOverflow