2011-01-12 65 views
0

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

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

当我运行该SQL查询,以减少我的生产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. 我明白了..我有一个需要回滚命令的交易声明

<如果@@ TRANCOUNT> 0还原> ..但我有100个存储过程,所以我才这样做....

  1. 与此同时...我怎样才能根除这一问题?我已经尝试收缩,我已经尝试备份Db ...

  2. 正如你所看到的,它是在SIMPLE模式下...我不知道如何备份一个仅记录文件......(还没有找到如何做到这一点)......

回答

1

你也许能够得到解决这个问题只需通过让SQL 处理利用整个表上只需要日期索引删除。另一种方式如果你运行这个频率足够高(至少每天),它是指数型

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

那么它只有通过对TickersDay索引来处理1/9日或更小([日]),而不必去如果您在现场使用DATEDIFF,则可以通过整个表。

如果仍然导致此:

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

你真的需要增加日志的大小,因为我怀疑它是不是设置为自动增长并且这个操作不够大。要么是这样或者开始考虑批量删除(再次假设你有一个日期索引,所以这只能有效地定位到100行)。

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

您既可以循环它(@@ rowcount> 0),也可以更频繁地安排它作为滴漏背景删除。

+0

感谢您的详细解释和答案(多个)...不知道哪些工作,但我增加了大小(和使用不受限制),并使用您的查询,它的工程很棒!足够的未提交的交易bs ...我以后会担心的.. – CraigJSte 2011-01-12 22:52:21