web-dev-qa-db-fra.com

Actuellement, toutes mes demandes SQL affichant "System.ComponentModel.Win32Exception: l'opération d'attente a expiré"

Soudainement, toutes les demandes de serveur SQL affichant "System.ComponentModel.Win32Exception: l'opération d'attente a expiré". Quel est le moyen le plus rapide de trouver le problème?

Stack Trace: 


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

[SqlException (0x80131904): Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.]
   System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +1767866
   System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +5352418
   System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) +244
   System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) +1691
   System.Data.SqlClient.SqlDataReader.TryConsumeMetaData() +61
   System.Data.SqlClient.SqlDataReader.get_MetaData() +90
   System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +365
   System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds) +1406
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite) +177
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +53
   System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +134
   System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +41
   System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior) +10
   System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) +140
   System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) +316
   System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, String srcTable) +86
   System.Web.UI.WebControls.SqlDataSourceView.ExecuteSelect(DataSourceSelectArguments arguments) +1481
   System.Web.UI.DataSourceView.Select(DataSourceSelectArguments arguments, DataSourceViewSelectCallback callback) +21

J'ai le SQl qui cause le problème de blocage par,

http://www.sqlskills.com/blogs/paul/script-open-transactions-with-text-and-plans/

10
user960567

Voici comment j'ai pu trouver le problème, D'abord, vérifiez toutes les transactions ouvertes de votre base de données,

DBCC OPENTRAN ('Databse')

S'il y a une transaction ouverte, récupérez son SPID et insérez-le dans INPUTBUFFER

DBCC INPUTBUFFER (58)

Cela vous donnera le code SQL réel. Si vous voulez, vous pouvez tuer cette transaction,

KILL 58

BTW, dans mon application, je peux utiliser les données READ COMMITTED,

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

Ou

Select * from Products WITH NoLock

Voici un autre moyen de trouver rapidement le SQL,

SELECT
    [s_tst].[session_id],
    [s_es].[login_name] AS [Login Name],
    DB_NAME (s_tdt.database_id) AS [Database],
    [s_tdt].[database_transaction_begin_time] AS [Begin Time],
    [s_tdt].[database_transaction_log_bytes_used] AS [Log Bytes],
    [s_tdt].[database_transaction_log_bytes_reserved] AS [Log Rsvd],
    [s_est].text AS [Last T-SQL Text],
    [s_eqp].[query_plan] AS [Last Plan]
FROM
    sys.dm_tran_database_transactions [s_tdt]
JOIN
    sys.dm_tran_session_transactions [s_tst]
ON
    [s_tst].[transaction_id] = [s_tdt].[transaction_id]
JOIN
    sys.[dm_exec_sessions] [s_es]
ON
    [s_es].[session_id] = [s_tst].[session_id]
JOIN
    sys.dm_exec_connections [s_ec]
ON
    [s_ec].[session_id] = [s_tst].[session_id]
LEFT OUTER JOIN
    sys.dm_exec_requests [s_er]
ON
    [s_er].[session_id] = [s_tst].[session_id]
CROSS APPLY
    sys.dm_exec_sql_text ([s_ec].[most_recent_sql_handle]) AS [s_est]
OUTER APPLY
    sys.dm_exec_query_plan ([s_er].[plan_handle]) AS [s_eqp]
ORDER BY
    [Begin Time] ASC;
GO

http://www.sqlskills.com/blogs/paul/script-open-transactions-with-text-and-plans/

13
user960567

Essayez d'exécuter cette commande:

exec sp_updatestats
3
Dhaval

Ce type d'erreur de délai d'expiration de SQL Server peut se produire lors d'une tentative d'insertion ou de mise à jour d'une table particulière lorsqu'une requête SELECT de longue durée est en cours d'exécution sur cette table (en fonction du niveau d'isolement de SELECT).

En relation:

1
Jon Schneider

Dans notre cas, le problème était dû aux raisons suivantes:

  1. Une application héritée exécutant .Net 4.0
  2. Le serveur a récemment été corrigé avec les derniers correctifs .Net (au 2018/08)
  3. La base de données en question a été mise en miroir

Il n'y avait aucune impasse et les services client ainsi que SQL Server disposaient de ressources suffisantes.

Notre solution:

1) Nous avons testé un roll-back des correctifs/service pack et cela a fonctionné (Non recommandé)

2) (Recommandé): selon Microsoft , les conditions ci-dessus nous ont imposé l'erreur:

Lorsqu'une application utilise Microsoft .NET Framework 3.5 ou Microsoft Fournisseur de données .NET Framework 4 pour Microsoft SQL Server (SQLClient) à Si vous vous connectez à une base de données en miroir, le message d'erreur suivant peut s'afficher message: 

Le délai d'attente a expiré. Le délai d'attente s'est écoulé avant la fin de l'opération ou le serveur ne répond pas. à System.Data.SqlClient.SqlInternalConnection.OnError (SqlException Exception, Boolean breakConnection) à l'adresse System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning () à System.Data.SqlClient.TdsParserStateObject.ReadSniError (TdsParserStateObject StateObj, erreur UInt32) à System.Data.SqlClient.TdsParserStateObject.ReadSni (DbAsyncResult AsyncResult, TdsParserStateObject stateObj) à l'adresse System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket () à System.Data.SqlClient.TdsParser.ConsumePreLoginHandshake (Boolean Encrypt, Boolean trustServerCert, Boolean & marsCapable) à l'adresse System.Data.SqlClient.TdsParser.Connect (ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Chiffrement booléen, TrustServerCert booléen, TrustServerCert booléen, TrustServerCert, Boolean System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin (ServerInfo ServerInfo, String newPassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, SqlConnection owningObject) à System propriété est définie sur la valeur par défaut valeur de 15 secondes, vous pouvez recevoir le message d'erreur après le la connexion est ouverte pendant 1,2 seconde.

Cause

Ce problème est dû à une erreur dans le connection-retry algorithme pour bases de données en miroir.

Lorsque l'algorithme de nouvelle tentative est utilisé, le fournisseur de données attend le premier appel (SniReadSync) à terminer. L'appel est envoyé au ordinateur principal qui exécute SQL Server et le temps d’attente est calculé en multipliant la valeur du délai d'attente de connexion par 0,08 . Toutefois, le fournisseur de données ne définit pas correctement une connexion à un. Damné. indiquer si une réponse est lente et si le premier appel SniReadSync n’est pas terminé avant l'expiration du délai d'attente.

Remarque La réponse lente dans ce cas peut être déclenchée par le serveur ou par latence du réseau.

Résolution

Ce problème est résolu dans le .NET Framework 4.5.2. En plus de .NET Framework 4.5.2, des correctifs sont disponibles pour d’autres .NET Fversions ramework


Plus de détails et téléchargement de correctif: https://support.Microsoft.com/en-us/help/2605597/fix-time-out-error-erren-when-a-mirrored-database-connection-is- créé-par-t

0
user919426

J'ai trouvé ce problème aussi mais j'ai réussi à le résoudre.

A l'origine, j'avais configuré tous les services SQL Server pour qu'ils soient démarrés manuellement. Mais ceci (après un certain démarrage en démarrant uniquement SQL Server (nom_serveur), cette erreur s'est produite. Pour le rappeler, j'ai constaté que le navigateur SQL Server et l'agent SQL Server (nom_serveur) devaient également être démarrés.

L'agent SQL Server (nom_serveur) ne serait pas démarré manuellement car il n'était pas utilisé. Je l'ai donc redéfini sur automatique pour qu'il démarre dès qu'un autre processus l'utilise.

0
Harvey

arrêtez juste et démarrez le service de navigateur de serveur de SQL encore, il a résolu mon problème

0
user3173814