我们在连接到远程安装的 MSSQL 2012 实例的机器上部署了一些应用程序。除了一个应用程序,它们在本地管理员帐户下作为 Windows 服务运行。客户端在 Windows 7 32 位上运行,数据库在 Windows Server 2008 R2 64 位上运行。
我在四分之一的连接尝试中收到此错误:
SqlException (0x80131904): A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: TCP Provider, error: 0 - A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
bei System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
bei System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
bei System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity)
bei System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, SqlConnection owningObject)
bei System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, TimeoutTimer timeout)
bei System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject, TimeoutTimer timeout, SqlConnectionString connectionOptions, String newPassword, Boolean redirectedUserInstance)
bei System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, String newPassword, SqlConnection owningObject, Boolean redirectedUserInstance)
bei System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection)
bei System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options)
bei System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject)
bei System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject)
bei System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
bei System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
bei System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
bei System.Data.SqlClient.SqlConnection.Open()
我在所有应用程序中使用此连接字符串:
数据源=192.168.0.101\NAMEDINSTANCE;初始目录=数据库;集成安全=False;持久安全信息=False;用户ID=用户;密码=密码
我用无限 ping 请求检查了网络连接,但发生错误时没问题。首先我收到了类似的错误消息,虽然启用了 NamedPipes,但是在停用 NamedPipes(我们没有使用它)之后,上述错误以相同的频率发生。相同的设置正在其他机器上运行。该错误在几周前开始发生,然后才成功运行了大约 3 个月。这是一个离线设置,系统自部署以来没有更新(但我不能保证)。两台机器上的防火墙都关闭了。Windows 和 SQL-Server 事件日志都没有提示。我还更换了网络电缆以排除电缆断裂。
我现在有点卡住了,因为我不知道下一步该去哪里。也许有一些可用的连接字符串调整,或者我可以更改一些配置服务器或客户端。
更新: 在 granadaCoders 的帮助下,我发现 tcp 调用可能会被某些东西过滤掉。我使用 PortQry 进行检查。
portqry -n 192.168.0.101 -e 1433 -p tcp
TCP port 1433 (ms-sql-s service): FILTERED
如果这种情况一直发生,我会说防火墙阻止了我的呼叫,但在这种情况下,可能是某种系统过载导致失去我的请求。接下来要做的事情肯定是通过连接特定端口来检查它是否是 SQL Server Browser 故障。然后更换开关。
更新(2013-07-03):我编写了一个测试应用程序,它每秒打开一个连接并在故障系统上运行它。有效。我在几个连接中两次在其他应用程序上收到错误,但在我的测试应用程序中的 500 个连接内没有设法获得一次。
更新(2013 年 7 月 5 日:我忘记了该服务器还有另一个网络连接。这是几周前连接的。看起来这是这个问题的根本原因。