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/
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/
Essayez d'exécuter cette commande:
exec sp_updatestats
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:
Dans notre cas, le problème était dû aux raisons suivantes:
Il n'y avait aucune impasse et les services client ainsi que SQL Server disposaient de ressources suffisantes.
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.
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
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.
arrêtez juste et démarrez le service de navigateur de serveur de SQL encore, il a résolu mon problème