SQL Server 2008 SP3
Comment localiser ces erreurs de dépassement de délai?
Les erreurs sont affichées sur un tableau de bord intranet utilisé spécifiquement pour le rapport d'erreurs dans IIS. Je soupçonne qu'il y a un délai d'attente par défaut de 30 secondes dans l'application Web et si une requête prend plus de trente secondes, une exception est levée. Comme de nombreuses requêtes prennent plus de 30 secondes sur ces serveurs SQL, je ne peux pas simplement filtrer dans le profileur en fonction de la durée.
Deux serveurs IIS récupèrent les données de sept instances SQL Server) desservant le site Web surveillé par ce tableau de bord.
Puis-je utiliser "Événement de message d'erreur utilisateur" et "Événement d'erreur OLEDB" pour suivre ces erreurs dans SQL Server Profiler?
Aaron Bertrand m'a mis sur la bonne voie avec son commentaire
Et je pense que vous devriez pouvoir filtrer la durée et l'erreur <> 0.
Création d'une trace côté serveur à l'aide du modèle de profil tsql_duration
Ajout de l'événement de message d'erreur utilisateur
Ajout des filtres suivants
erreur <> 0
erreur <> 1
gravité <> 10
Cela a évité de capturer les commandes SE DATABASE
Le message d'erreur capturé par le profileur était 2 - Abandonner et la classe d'événements était 10 RPC: terminé.
Vous pouvez utiliser l'événement Attention dans le profileur avec les événements pour capturer les instructions T-SQL. Il ne précise pas nécessairement ce qu'est l'événement d'attention lorsque je l'ai testé, donc je suppose que le fait qu'il suit la séquence d'événements vous permet d'estimer les requêtes qui ont un problème. Je n'ai pas eu l'occasion de le tester complètement avec du code et tout.
J'ai cependant rencontré un exemple exact avec des événements étendus qui peuvent être utilisés pour trouver des requêtes de délai d'expiration, et cet exemple est avec SQL Server 2008. Il est de Jonathan Kehayias: n XEvent par jour (9 sur 31) - Cibles Semaine - pair_matching
Les erreurs de délai d'attente sont côté client et l'erreur provient du fournisseur (ou client) utilisé avec la connexion à la base de données. SQL Server ne suit pas nécessairement ni n'offre aucune méthode intuitive pour les retrouver.
À l'aide d'une trace, les délais d'expiration côté SQL Server sont essentiellement des requêtes qui ont un début mais pas de fin. Je suis tombé sur une très bonne vidéo qui passe par un exemple de Sean McCown Trouver les délais d'expiration des requêtes avec Profiler . Maintenant, ce n'est pas une preuve solide comme le note Sean dans la vidéo, il y a d'autres choses qui pourraient empêcher une transaction de se terminer.
Un résumé des étapes:
Comme l'exemple va dans la vidéo pour SP:Starting
(44) et SP:Completed
(43) une fois vos données de trace dans une table:
SELECT *
INTO #TraceStart
FROM MyTraceData
WHERE EventClass = 44
SELECT *
INTO #TraceEnd
FROM MyTraceData
WHERE EventClass = 45
SELECT TextData
FROM #TraceStart
EXCEPT
SELECT TextData
FROM #TraceEnd
Je m'attendrais à ce que cela soit plus facile à faire avec les événements étendus, mais je n'ai jamais essayé de transférer cette méthode vers les événements étendus. Je ne sais pas si la version SQL Server 2008 des événements étendus a ouvert l'accès aux erreurs au niveau du client comme 2012 et les versions ultérieures. Ce qui précède n'est qu'une méthode rapide et sale qui fonctionne toujours.
Vérifiez-vous également le blocage?
Le blocage pourrait certainement contribuer à des délais d'attente et peut être assez facilement suivi. Un délai d'attente qui n'est pas lié à un bloc présente un autre problème. Le délai d'expiration de 30 secondes est un paramètre client commun , mais il peut être contrôlé par l'objet de commande. Si vous le définissez sur 0, la connexion n'expirera pas.
Pour configurer la surveillance du blocage à l'aide des notifications d'événements et du Service Broker, lisez le message de Tony Rogerson:
Dans son exemple, il surveille les blocs de 10 secondes ou plus (et pour chaque incrément de période, 20, 30, 40 secondes, etc.) Je surveille toutes les 25 secondes, ce qui me donne un aperçu du délai d'expiration de ce qui est en cours d'exécution . Les processus bloqués et bloquants apparaîtront dans la description XML du bloc.
La conservation des informations dans un tableau fournit également un historique que vous pouvez consulter au fil du temps.