0

我有一个使用 SQL 2008 运行模拟 SQL 2005 数据库的 Web 服务器,并且我有一个用于测试环境的本地 SQL 2005 数据库。

这导致我使用脚本来备份/恢复数据以进行测试,因为 2008 服务器备份不会恢复到 2005 服务器。

当我在生产 Web SQL Server (2008) 上运行此 SQL 查询以减小表的大小时

 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 Rollback > .. 但我有 100 个存储过程,所以在我这样做之前....

  1. 与此同时......我怎样才能消除这个问题?我试过 SHRINKING 并尝试备份 Db ......

  2. 如您所见,它处于简单模式...我不知道如何备份 LOG ONLY 文件...(还没有找到如何做到这一点)...

4

1 回答 1

1

您可以通过仅在需要删除的日期上使用索引让 SQL NOT处理整个表来解决此问题。改写为索引友好

DELETE FROM TickersDay
WHERE TickersDay.[date] <= DATEADD(day, -8, GETDATE())
GO

如果您足够频繁地运行此操作(至少每天),那么它只需要通过 TickersDay([Date]) 上的索引处理 1/9 或更少,如果您在字段上使用 DATEDIFF,则不必遍历整个表。

如果这仍然导致:

数据库“VTNET”的事务日志已满

您确实需要增加日志大小,因为我怀疑它没有设置为自动增长并且对于此操作来说不够大。要么,要么开始考虑批量删除(再次假设你有一个日期索引,所以这有效地只针对 100 行),例如

DELETE TOP (100) FROM TickersDay
WHERE TickersDay.[date] <= DATEADD(day, -8, GETDATE())
GO

您可以循环它(当@@rowcount > 0 时),或者只是更频繁地安排它作为一个涓涓的后台删除。

于 2011-01-12T21:11:10.593 回答