web-dev-qa-db-fra.com

Erreur d'accusé de réception de prise de contact préalable à la connexion SQL Server

Nous avons un site Web de production avec un mélange d'ASP classique, de .Net en ligne et de .Net compilé qui parle à une instance de SQL Server où les deux sont des machines virtuelles sur la même boîte physique et tout ce qui fonctionne très bien. Afin de faire quelques tests avec de nouvelles fonctionnalités, j'ai créé une version QA du site et l'ai configuré pour se connecter à une base de données sur un VM hébergé sur un autre serveur physique. Ce sont des réseaux différents (DMZ/internal), mais tous dans le même rack sur gigabit donc les vitesses de connexion ne devraient pas être un problème.

Le problème que nous rencontrons est que la version QA fonctionnera un peu puis mourra soudainement jusqu'à ce que je redémarre le pool d'applications et le site. Ce n'est pas un problème de charge car ce n'est que moi et deux autres personnes qui testent ce processus et j'ai confirmé que le serveur où se trouve la base de données QA n'a pas de problème de ressources (16 Go de RAM, 3,2 Go en cours d'utilisation et l'utilisation du processeur oscille dans le 2%). L'erreur spécifique (illustrée ci-dessous) se produit avec toutes les variantes des pages - ASP classique, .Net en ligne et les pages .Net compilées. Sur la base de toutes les recherches que j'ai faites, je continue de signaler qu'il s'agit d'un problème de pare-feu, mais nous avons même ouvert tous les ports entre les deux serveurs et cela se produit toujours. La partie la plus étrange est lorsque nous activons le traçage sur notre ASA (5515-X), il ne voit pratiquement pas de trafic et parfois le site repousse cette erreur immédiatement tandis que d'autres fois cela prend plus de 30 secondes. Les pages en question n'effectuent pas de recherches intenses (une page qui meurt récupère un total d'environ 60 enregistrements). Voici la trace complète de l'erreur/pile:

  [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

Je montrerais un bloc de code, mais puisque toutes les pages commencent à mourir une fois que l'on le fait, cela ne fera pas beaucoup de bien. Tout cela fonctionne très bien en production, la seule différence est que les machines virtuelles sont sur des hôtes physiques différents, mais étant donné qu'il s'agit de tout nouveau matériel, il n'y a aucune raison que cela pose des problèmes.

J'ai également rencontré plusieurs choses ici où l'utilisation de exec sp_updatestats et dbcc freeproccache, mais ni l'un ni l'autre ne semblait faire la différence.

Je suis complètement perdu alors des suggestions?

18
RubyHaus

Eu un problème similaire avec SQL Express 2014, qui s'est avéré être un problème de pare-feu Windows, certains de nos serveurs ont SQL 2005/2008 sur eux, tous avec le pare-feu Windows désactivé.

J'ai fait le changement sur mon PC et cela a parfaitement fonctionné par la suite!

Merci

Brendan

7
brendan

J'ai rencontré moi-même un problème similaire à celui-ci il y a quelques mois.

Pour moi, l'activation de TCP/IP pour IPV4 et IPV6 dans le gestionnaire de configuration SQL Server a résolu le problème. J'ai également vu cela se produire même lorsque IPV6 n'est pas installé. Curieusement, j'ai même rencontré ce comportement même lorsque je spécifie uniquement des adresses IPV4?!

6
coderpro

Eu le même problème/erreur msg. Pour moi, ce sont les paramètres du pare-feu sur le serveur. Assurez-vous que TCP port 1433 est ouvert pour le trafic entrant.

4
Louis

J'ai eu cette erreur après l'activation du pare-feu. J'ai ajouté des ports au pare-feu, regardez activez le port sqlserver puis j'ai de nouveau cette erreur.

Activez les canaux nommés et TCP/IP dans le gestionnaire de configuration SQL Server, vous pouvez le trouver dans:

Menu Démarrer> allprogram> Microsoft SQL Server> outils de configuration.

3
hmfarimani