我有一个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

这是我的问题和问题:

  1. 我明白了..我有一个需要回滚命令的交易语句

<if @@ trancount> 0回滚> ..但是我有100个存储过程,所以在我这样做之前。

  1. 同时...如何消除这个问题?我尝试收缩,我尝试备份DB ...

  2. 如您所见,它处于简单模式...我不知道如何仅备份日志文件...(尚未找到该怎么做)...

有帮助吗?

解决方案

您可能只需获得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),也可以更频繁地安排它作为滴答背景删除。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top