22

我有一个 SQL Server [2012 Express with Advanced Services] 数据库,里面没有多少。我正在使用 EF Code First 开发应用程序,由于我的模型仍处于不断变化的状态,因此数据库每天都会被删除并重新创建数次。

今天早上,我的应用程序第一次运行时无法连接到数据库。经调查,数据库似乎处于“Recovery Pending”模式。

查看事件日志,我可以看到 SQL Server 已记录:

启动数据库(我的数据库)

...整夜大约每秒两次。(事件日志已填满,所以我无法看到昨天晚上之后的内容)。

那些“信息”日志条目在今天早上 6 点左右停止,紧随其后的是一个“错误”日志条目:

资源池“内部”内存不足,无法运行此查询

我的数据库到底发生了什么?

注意:我有可能让我的 Web 应用程序在一夜之间以“调试”模式运行 - 尽管没有任何人“驾驶”它,但我无法想象会有很多数据库流量(如果有的话)。

还值得一提的是,我在数据库中有一个全文目录(尽管正如我所说,目前数据库中几乎没有任何实际内容)。

我不得不说,这令人担忧——如果这发生在我的生产数据库中,我会不高兴

4

3 回答 3

26

使用 AUTO_CLOSE ON 数据库将在没有连接时立即关闭,并在每次建立连接时重新打开(运行恢复,尽管速度较快)。所以你看到了这条消息,因为你的应用程序每 2 秒就会连接到数据库。你可能总是有这种行为,以前从未注意到。现在您的数据库崩溃了,您调查了日志并发现了这个问题。虽然现在您知道并且可能会修复它很好,但这并不能解决您真正的问题,即数据库的可用性。

所以现在你有一个无法恢复的数据库,你会怎么做?您从上次备份中恢复并应用您的灾难恢复计划。真的,仅此而已。而且别无选择。

如果您想了解崩溃发生的原因(可能是大约 1 种原因中的任何一种......),那么您需要联系CSS(产品支持)。他们有办法指导您完成调查。

于 2012-08-22T12:19:17.850 回答
21

如果您想在事件日志中关闭此消息。只需转到 SQL Server Management Studio,

  1. 右键单击您的数据库
  2. 选择选项(从左侧面板)
  3. 查看“自动”部分,并将“自动关闭”更改为“假”
  4. 点击确定

就这样 :)

于 2014-10-03T18:53:05.680 回答
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
于 2013-08-01T07:29:20.580 回答