Aufspüren von Timeout-Fehlern bei Anwendungen in SQL Server


8

SQL Server 2008 SP3

Wie kann ich diese Timeout-Fehler aufspüren?

Geben Sie hier die Bildbeschreibung ein

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?


Antworten:


5

Aaron Bertrand hat mich mit seinem Kommentar auf den richtigen Weg gebracht

Und ich glaube, Sie sollten in der Lage sein, nach Dauer und Fehler <> 0 zu filtern.

Erstellt einen serverseitigen Trace mit der Profilvorlage tsql_duration

  1. Das Ereignis "Benutzerfehlermeldung" wurde hinzugefügt

  2. 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.


2

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:

  • Erstellen Sie in Profiler eine Ablaufverfolgung, die die Startereignisse und abgeschlossenen Ereignisse für gespeicherte Prozeduren und TSQL erfasst
  • Laden Sie diese Daten in eine Tabelle
  • Fragen Sie diese Daten ab, um die Startereignisse und dann die Endereignisse zu finden.

Wie das Beispiel im Video für SP:Starting(44) und SP:Completed(43) zeigt, sobald Sie Ihre Trace-Daten in eine Tabelle aufgenommen haben:

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

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.


Ziemlich sicher, dass Sie diese mit einem Filter bei Fehlern erfassen können - es sei denn, der Client hat die Verbindung getrennt, sollte er SQL Server weiterhin benachrichtigen können. "Hey, ich habe die Ausführung dieser Abfrage aufgegeben." Zumindest bin ich mir zu 99,9% sicher, dass wir solche Ereignisse auf diese Weise in Performance Advisor erfassen (über Trace).
Aaron Bertrand

1
Wenn Sie eine Ablaufverfolgung verwenden, sollte unmittelbar vor oder nach (abhängig von der Ablaufverfolgung) dem Zeitlimit ein Aufmerksamkeitsereignis auftreten.
Sean Gallardy - Rentner

Hallo @AaronBertrand. Es stellt sich heraus, dass der SQL Server-Profiler ein Benutzerfehlerereignis mit dem Wert 2 - Abbrechen erfasst hat, wenn IIS die Abfrageausführung abbricht. Ich habe nichts in Attention oder in einem Fall bemerkt, in dem stmt: complete leer war.
Craig Efrein

@Craig Ich dachte, das wäre der Fall (war aber viel zu faul, um etwas zum Testen aufzurüsten).
Aaron Bertrand

1

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.