SQL Server 2008 SP3
Wie kann ich diese Timeout-Fehler aufspüren?
Die Fehler werden in einem Intranet-Dashboard angezeigt, das speziell für die Fehlerberichterstattung in IIS verwendet wird. Mein Verdacht ist, dass es in der Webanwendung ein Standardzeitlimit von 30 Sekunden gibt. Wenn eine Abfrage länger als 30 Sekunden dauert, wird eine Ausnahme ausgelöst. Da es auf diesen SQL-Servern viele Abfragen gibt, die länger als 30 Sekunden dauern, kann ich den Profiler nicht einfach nach Dauer filtern.
Auf der von diesem Dashboard überwachten Website werden zwei IIS-Server bereitgestellt, die Daten von sieben SQL Server-Instanzen abrufen.
Könnte ich das "User Error Message Event" und das "OLEDB Errors Event" verwenden , um diese Fehler in SQL Server Profiler zu verfolgen?
quelle
Antworten:
Aaron Bertrand hat mich mit seinem Kommentar auf den richtigen Weg gebracht
Erstellt einen serverseitigen Trace mit der Profilvorlage tsql_duration
Das Ereignis "Benutzerfehlermeldung" wurde hinzugefügt
Folgende Filter wurden hinzugefügt
Fehler <> 0
Fehler <> 1
Schweregrad <> 10
Dadurch wurde vermieden, dass die Befehle USE DATABASE erfasst wurden
Die vom Profiler erfasste Fehlermeldung war 2 - Abbruch und die Ereignisklasse war 10 RPC: Abgeschlossen.
quelle
Sie können das Attention- Ereignis im Profiler mit den Ereignissen zum Erfassen der T-SQL-Anweisungen verwenden. Es gibt nicht unbedingt genau an, was das Aufmerksamkeitsereignis ist, als ich es getestet habe. Ich denke also, dass es der Ereignissequenz folgt, können Sie die Abfragen schätzen, bei denen ein Problem auftritt. Ich hatte keine Chance, es mit Code und allem zu testen.
Ich bin jedoch auf ein genaues Beispiel mit erweiterten Ereignissen gestoßen, mit dem Timeout-Abfragen gefunden werden können, und dieses Beispiel stammt aus SQL Server 2008. Es stammt von Jonathan Kehayias: Ein XEvent pro Tag (9 von 31) - Zielwoche - pair_matching
Timeout-Fehler sind clientseitig und der Fehler kommt von dem Anbieter (oder Client), der mit der Datenbankverbindung verwendet wird. SQL Server verfolgt nicht unbedingt den Überblick oder bietet keine intuitive Methode, um diese aufzuspüren.
Bei Verwendung einer Ablaufverfolgung sind Zeitüberschreitungen auf der SQL Server-Seite im Grunde Abfragen, die einen Start haben, aber nicht abgeschlossen sind. Ich bin auf ein sehr gutes Video gestoßen, das ein Beispiel von Sean McCown zeigt. Finden Sie mit Profiler Abfrage-Timeouts . Jetzt ist es kein solider Beweis, wie Sean im Video feststellt, dass es andere Dinge gibt, die dazu führen könnten, dass eine Transaktion kein Ende hat.
Eine Zusammenfassung der Schritte:
Wie das Beispiel im Video für
SP:Starting
(44) undSP:Completed
(43) zeigt, sobald Sie Ihre Trace-Daten in eine Tabelle aufgenommen haben:Ich würde erwarten, dass dies mit erweiterten Ereignissen einfacher zu tun ist, habe aber nie versucht, diese Methode auf erweiterte Ereignisse zu übertragen. Ich bin nicht sicher, ob die SQL Server 2008-Version von Extended Events den Zugriff auf Fehler auf Clientebene wie 2012 und höher eröffnet hat. Das Obige ist nur eine schnelle und schmutzige Methode, die immer noch funktioniert.
quelle
Prüfen Sie auch auf Blockierung?
Das Blockieren kann sicherlich zu Zeitüberschreitungen führen und kann ziemlich einfach verfolgt werden. Ein Timeout, das nicht mit einem Block zusammenhängt, weist ein anderes Problem auf. Das 30-Sekunden-Timeout ist eine übliche Clienteinstellung , kann jedoch vom Befehlsobjekt gesteuert werden. Wenn Sie den Wert auf 0 setzen, tritt keine Zeitüberschreitung für die Verbindung auf.
Lesen Sie den Beitrag von Tony Rogerson, um die Überwachung für das Blockieren mithilfe von Ereignisbenachrichtigungen und Service Broker einzurichten :
http://sqlblogcasts.com/blogs/tonyrogerson/archive/2007/04/06/event-notifications-monitoring-blocked-processes-and-other-events-end-to-end-how-to-set-it- up-and-make-it-work.aspx
In seinem Beispiel überwacht er Blöcke von 10 Sekunden oder länger (und für jedes Periodeninkrement 20, 30, 40 Sekunden usw.), die ich alle 25 Sekunden überwache, wodurch ich einen genauen Überblick über das laufende Zeitlimit bekomme . Sowohl der blockierte als auch der blockierende Prozess werden in der XML-Beschreibung des Blocks angezeigt.
Wenn Sie die Informationen in einer Tabelle aufbewahren, erhalten Sie auch einen Verlauf, den Sie im Laufe der Zeit überprüfen können.
quelle