我有一个SQL Server [2012 Express with Advanced Services]数据库,其中没有太多内容。我正在使用EF Code First开发一个应用程序,由于我的模型仍然处于不稳定状态,因此数据库每天都会被丢弃并重新创建几次。
今天早上,我第一次运行时,我的应用程序无法连接到数据库。经过调查,似乎数据库处于“恢复待定”模式。
查看事件日志,我可以看到SQL Server已记录:
启动数据库(我的数据库)
......整晚大约每秒两次。 (事件日志填满了,所以昨天晚上我看不到。)
这些“信息”日志条目在今天早上6点左右停止,紧接着是“错误”日志条目,说:
资源池'internal'中没有足够的内存来运行此查询
我的数据库发生了什么事?
请注意:这只是可能,我留在“调试”模式运行一夜之间我的web应用程序 - 尽管没有任何人“驾驶”这我无法想象会有多少数据库流量,如果任何
值得一提的是,我在数据库中有一个全文目录(尽管如我所说,目前数据库中几乎没有任何实际内容。)
我不得不说,这令人担忧 - 如果发生在我的生产数据库中,我会不感到高兴!
答案 0 :(得分:24)
使用AUTO_CLOSE ON,数据库将在没有连接时立即关闭,并在每次建立连接时重新打开(运行恢复,尽管是快节奏的数据库)。所以你看到了这条消息,因为你的应用程序每隔2秒就会连接到数据库。你可能总是有这种行为,从未注意过。现在您的数据库崩溃了,您调查了日志并发现了这个问题。虽然很好,现在您知道并且可能会修复它,但这并不能解决您真正的问题,即数据库的可用性。
所以现在你有一个不会恢复的数据库,你做了什么?您从上次备份恢复并应用disaster recovery plan。真的,这就是它的全部。没有其他选择。
如果您想了解发生崩溃的原因(可能是大约1个原因中的任何一个......)那么您需要联系CSS(产品支持)。他们有办法指导您进行调查。
答案 1 :(得分:20)
如果要在事件日志中关闭此消息。 只需转到SQL Server Management Studio,
全部:)
答案 2 :(得分:2)
我有一个类似的问题,sql express数据库卡在恢复中。在调查日志之后,发现数据库每隔几分钟启动一次。运行脚本
select name, state_desc, is_auto_close_on from sys.databases where name = 'mydb'
显示自动关闭已设置为开启。
因此,似乎数据库始终处于恢复状态,但由于没有客户端连接,因此在再次脱机之前实际上会暂时联机一段时间。
我用以下脚本解决了这个问题。
Declare @state varchar(20)
while 1=1
begin
Select @state = state_desc from sys.databases where name='mydb';
If @state = 'ONLINE'
Begin
Alter database MyDb
Set AUTO_CLOSE_OFF;
Print 'Online'
break;
End
waitfor delay '00:00:02'
end