SQL Server 预登录握手确认错误

19

我们有一个生产网站,其中混合了经典的ASP、内联的.Net和已编译的.Net,它们与同一物理服务器上的SQL Server实例进行通信,一切工作正常。为了测试一些新功能,我创建了一个QA版本的网站,并将其设置为连接到托管在另一台物理服务器上的VM上的数据库。它们处于不同的网络(DMZ / 内部),但都在千兆位的同一机架上,因此连接速度不应该是问题。

我们遇到的问题是QA版本会工作一段时间,然后突然崩溃,直到我重新启动应用程序池和网站。这不是负载问题,因为只有我和其他两个人测试这个流程,而且我已经确认了托管QA数据库的服务器没有资源问题(16GB RAM,3.2GB正在使用,处理器利用率在2%左右)。所有页面的变体(经典ASP、内联 .Net 和已编译的 .Net 页面)都会出现特定的错误(如下所示)。根据我所做的所有研究,我一直被指回防火墙问题,但即使我们打开了两个服务器之间的所有端口,它仍然会发生。最奇怪的部分是当我们在ASA(5515-X)上启用跟踪时,它几乎看不到任何流量,有时站点会立即返回该错误,而其他时候则需要30秒以上。这些页面没有进行任何复杂的查找(死亡的页面总共获取大约60条记录)。以下是完整的错误/堆栈跟踪:

  [Win32Exception (0x80004005): The wait operation timed out]

  [SqlException (0x80131904): Connection Timeout Expired.  The timeout period elapsed while attempting to consume the pre-login handshake acknowledgement.  This could be because the pre-login handshake failed or the server was unable to respond back in time.  The duration spent while attempting to connect to this server was - [Pre-Login] initialization=21008; handshake=12; ]
   System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +6749670
   System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) +815
   System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error) +817
   System.Data.SqlClient.TdsParserStateObject.ReadSniSyncOverAsync() +344
   System.Data.SqlClient.TdsParserStateObject.TryReadNetworkPacket() +48
   System.Data.SqlClient.TdsParser.ConsumePreLoginHandshake(Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, Boolean& marsCapable) +126
   System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, Boolean withFailover) +693
   System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, Boolean withFailover) +219
   System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString connectionOptions, SqlCredential credential, TimeoutTimer timeout) +6777754
   System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(TimeoutTimer timeout, SqlConnectionString connectionOptions, SqlCredential credential, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance) +6778255
   System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData) +878
   System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions) +1162
   System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions) +72
   System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) +6781425
   System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) +103
   System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection) +2105
   System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection) +116
   System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection) +1089
   System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) +6785863
   System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry) +233
   System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry) +278
   System.Data.SqlClient.SqlConnection.Open() +239
   System.Web.UI.Control.LoadRecursive() +71
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3178

我想展示一段代码块,但由于一旦这样做所有页面都会开始出问题,所以这并没有什么好处。在生产环境中这一切都很顺利,唯一的区别是虚拟机在不同的物理主机上,但鉴于这都是新的硬件,没有理由出现问题。

我在这里看到多个使用exec sp_updatestatsdbcc freeproccache的方法,但是两者都似乎没有什么作用。

我完全迷失了,有什么建议吗?


你说你已经打开了所有端口,那你的端口配置是什么,你是否从服务器中删除了软件防火墙? - user692942
默认端口(1433)和没有软件防火墙。我仍然认为这不是防火墙的问题,因为它一开始运行得很好,然后在中间没有任何更改的情况下停止了。如果是防火墙问题,我认为它不会是间歇性的。它要么工作,要么不工作。 - Scott Salyer
抱歉,我以为你说它在生产环境中可以工作,只是在开发环境中不行,可能是我误读了你的问题。如果它是间歇性的,那么它不会像你已经指出的那样是端口/防火墙问题。 - user692942
还有其他建议吗?我完全不知道该怎么办了。 - Scott Salyer
抱歉,我脑海中没有任何想法。也许可以尝试设置一个悬赏,这样你可能会得到更多人对问题的关注。 - user692942
4个回答

7

我曾经遇到一个类似的问题,使用 SQL Express 2014 时,发现是由于 Windows 防火墙的问题造成的。我们的某些服务器上安装有 SQL 2005/2008,但所有的服务器都禁用了 Windows 防火墙。

在我的电脑上进行了相应的更改后,问题得到完美解决!

谢谢!

Brendan


6
我几个月前也遇到了类似的问题。对于我来说,在SQL Server配置管理器中启用TCP/IP协议,同时允许IPv4和IPv6协议解决了这个问题。即使没有安装IPv6,我也见过出现这种情况。奇怪的是,当我只指定IPv4地址时,我甚至也经历了这种情况!

我曾经遇到过握手错误。有一天连接被阻止了。检查了IPV6后,连接成功了。谢谢! - Kyung Hwan Min
@KyungMin 很高兴能帮到你,Kyung。我的荣幸! :) - Brandon Osborne
1
这是完整的解决方案描述:https://dev59.com/aWUp5IYBdhLWcg3wJU5J#15488923 - saber tabatabaee yazdi

5

我遇到了相同的问题/错误信息。对我来说,这是服务器上的防火墙设置问题。确保TCP端口1433对传入流量开放。


4

在启用防火墙后,我遇到了这个错误。我已经按照启用SQL Server端口的方法添加了端口,但仍然出现了该错误。

在SQL Server配置管理器中同时启用命名管道和TCP/IP,您可以在以下位置找到它:

开始菜单>所有程序>Microsoft SQL Server>配置工具。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接