【问题标题】:SqlException when the database is not started but SQL Server is ready for connections数据库未启动但 SQL Server 已准备好连接时出现 SqlException
【发布时间】:2014-10-16 01:33:59
【问题描述】:

我正在处理 SQL Server 的“准备连接”状态与我的数据库启动时间之间的相当长的延迟。有时需要超过 2 分钟。这就是为什么我有时会在数据库上线之前尝试连接它的原因。你知道,如何减少“准备连接”和启动数据库之间的时间吗?或者我如何确定数据库是否在线以便从我的 C# 应用程序连接到它?

基本上我有一些连接字符串的“缓存”。这当然发生在第一个连接上,所以我的连接代码非常简单:

var result = new SqlConnection();

result.ConnectionString = "some connection string here";

try
{
   result.Open()
}
catch (Exception ex)
{
   //some logging stuff here
   throw;
}

这是 C# 异常:

System.Data.SqlClient.SqlException:无法打开登录请求的数据库“XXX”。登录失败。

这是 SQL Server 日志:

2014-03-31 08:21:05.65 - SQL Server 现在已准备好进行客户端连接。这是一条情报信息;无需用户操作。

2014-03-31 08:21:09.21 - 数据库模型(数据库 ID 3)在 1 秒内完成恢复(分析 234 毫秒,重做 0 毫秒,撤消 514 毫秒。)这只是一条信息性消息.无需用户操作。

2014-03-31 08:21:11.52 - 错误:18456,严重性:14,状态:38。

2014-03-31 08:21:11.52 - 用户“YYY”登录失败。原因:无法打开明确指定的数据库。 [客户:]

2014-03-31 08:21:13.88 - 清除 tempdb 数据库。

2014-03-31 08:21:21.38 - 数据库 msdb(数据库 ID 4)在 2 秒内完成恢复(分析 327 毫秒,重做 0 毫秒,撤消 468 毫秒。)这只是一条信息性消息.无需用户操作。

2014-03-31 08:21:32.98 - 启动数据库“tempdb”。

2014-03-31 08:21:40.30 - Service Broker 协议传输已禁用或未配置。

2014-03-31 08:21:40.41 - 数据库镜像协议传输被禁用或未配置。

2014-03-31 08:21:41.50 - 恢复完成。这只是一条信息性消息。无需用户操作。

2014-03-31 08:21:41.52 - Service Broker 管理器已启动。

2014-03-31 08:23:41.87 - 启动数据库“XXX”。

【问题讨论】:

  • 显示用于连接数据库的代码!!
  • 检查自动关闭属性:SELECT Name, is_auto_close_on FROM master.sys.databases
  • 自动关闭和镜像功能都被禁用。

标签: c# sql .net sql-server exception


【解决方案1】:

基于this link,最佳实践是查询Collat​​ion属性的值。

刚上线的数据库不一定准备好接受连接。要确定数据库何时可以接受连接,请查询 sys.databases 的 collat​​ion_name 列或 DATABASEPROPERTYEX 的 Collat​​ion 属性。

因此,当 Collat​​ion 属性不为空时,数据库已准备好进行连接。查询如下所示

SELECT DATABASEPROPERTYEX('MyDatabase', 'Collation')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-02
    • 2018-11-04
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 2013-10-23
    相关资源
    最近更新 更多