So verfolgen Sie SQL-Abfragen, bei denen SQL Server abstürzt

9

Wir haben einen SQL Server 2008-Datenbankserver (der zufällig unter MS Failover Clustering ausgeführt wird, aber ich denke nicht, dass dies hier relevant ist).

Unsere Anwendung führt Hibernate für den DB-Zugriff aus. Seit dem kürzlich durchgeführten Upgrade von Version 3.1 auf Version 3.6 stürzt SQL Server regelmäßig ab (alle 24 bis 48 Stunden, manchmal jedoch häufiger).

Das spezifische Problem scheint speicherbezogen zu sein. Kurz bevor der Server abstürzt (und dann anscheinend vom Failover-Cluster-Manager automatisch neu gestartet wird), werden folgende Fehler angezeigt:

Error: 701, Severity: 17, State: 130.
There is insufficient system memory in resource pool 'internal' to run this query.

auch gelegentliche (aber regelmäßige) Nachrichten von

Error: 17300, Severity: 16, State: 1. (Params:). The error is printed in terse mode because there was error during formatting. Tracing, ETW, notifications etc are skipped.

Fehler: 17312, Schweregrad: 16, Status: 1. (Parameter :). Der Fehler wird im knappen Modus gedruckt, da beim Formatieren ein Fehler aufgetreten ist. Ablaufverfolgung, ETW, Benachrichtigungen usw. werden übersprungen.

Ich bekomme auch einige Fehler auf App-Ebene wie

java.sql.SQLException: A time out occurred while waiting to optimize the query. Rerun the query.

und dann der aufregende und möglicherweise lehrreiche Fehler:

The query processor ran out of internal resources and could not produce a query plan. 
This is a rare event and only expected for extremely complex queries or queries that reference a very large number of tables or partitions. 
Please simplify the query. If you believe you have received this message in error, contact Customer Support Services for more information.

Die Auslastung des Servers hat sich nicht geändert, daher gibt es keinen Grund, warum ihm jetzt der Speicher ausgehen sollte, wenn zuvor kein Problem mit an ihn gesendeten Abfragen angezeigt wurde.

Nun zur Frage: Wie verfolge ich die Abfragen, die diesen Fehler verursachen (und damit vermutlich alle Probleme)? Es scheint, dass seit unserem Hibernate-Upgrade einige große Abfragen bei SQL Server ausgelöst wurden, und das hat es kaputt gemacht. Zufällig habe ich einige Ideen, was sie sein könnten, aber es wäre gut, sie verfolgen zu können.

Ich kann natürlich den SQL Server-Profiler ausführen, aber wie kann ich filtern, um die problematischen Abfragen zu finden, sobald dies erledigt ist (und eine enorme Datenmenge erzeugt hat - es handelt sich um eine ausgelastete OLTP-Datenbank)?

Vielen Dank!

Pete Storey
quelle
1
Läuft alles auf demselben Server? Wird der Anwendungsserver mit Java auch auf dem Datenbankserver ausgeführt?
Swasheck
1
In Verbindung mit der Frage von @ swasheck: Haben Sie einen expliziten Wert für den maximalen Speicher von SQL Server festgelegt? Haben Sie externen Speicherdruck ausgeschlossen?
Mike Fal
Haben Sie versucht, die Spuren der Black Box zu betrachten? Sie können Sie in die richtige Richtung weisen.
Datum
Ich habe gerade dieses Ding getroffen und Spuren, die ich laufen ließ, zeigen eine inaktive Datenbank aus der Anwendungsperspektive.
Joshua
Verwenden Sie eine Volltextsuche? Was ist die genaue Build No + Edition des SQL Servers, auf dem Sie ausgeführt werden?
Kin Shah

Antworten:

5

Befolgen Sie die Schritte unter Verwenden des DBCC MEMORYSTATUSBefehls zum Überwachen der Speichernutzung in SQL Server . Die Abhilfemaßnahme hängt von Ihren Ergebnissen ab. Sie können auch lesen, wie Sie Microsoft SQL Server-Speicherengpässe identifizieren, auf die Sie besser zugreifen können.

Ein Wort der Vorsicht: Es ist unwahrscheinlich, dass Sie einzelne Fragen finden, die schuld sind. Das Aufspüren von Speicherproblemen ist subtiler. Denken Sie daran, dass wenn Ihnen die Ressourcen ausgehen und eine Abfrage einen Speicherfehler auslöst, die Abfrage, die den Fehler auslöst, möglicherweise nur das Opfer und nicht der Schuldige ist.

Remus Rusanu
quelle
Danke - ich habe mir diese bereits angesehen, aber das Problem ist, dass der Server anscheinend einwandfrei funktioniert und dann plötzlich knallt. Der Speicher geht nicht allmählich aus. Es ist auch nicht klar, was ich online finden kann, was der Fehler "Es gibt nicht genügend Systemspeicher im Ressourcenpool 'intern', um diese Abfrage auszuführen." bedeutet eigentlich - was ist der interne Ressourcenpool in Bezug auf die Ergebnisse von DBCC MEMORYSTATUS?
Ist das ein Entwicklungsserver? Wenn ja, können Sie ein Downgrade auf Hibernate 3.1 durchführen, um zu überprüfen, ob das Problem behoben ist? Sie haben zwei erste Abfragezeilen und müssen versuchen, eine davon zu beseitigen. Entweder sind in SQL Server Speicherlimits festgelegt und überschreiten diese, oder ein anderer Teil des Systems verbraucht Speicher und SQL Server wird gequetscht. Profilieren Sie das System zu den Zeiten des Absturzes, um festzustellen, was gerade passiert.
Epo
0

Anscheinend möchten Sie die Extended EventsKonfiguration mithilfe der Ereignisse durchführen query_memory_grant_xxxxx.

Dies ist die beste Option für Sie, um die Informationen und die gespeicherte SQL Engine in Out-Size-Größe zu protokollieren, die Sie jederzeit lesen können (Sie können auch Live-Daten anzeigen). Die gespeicherten Informationen werden im Gegensatz zum Neustart des Servers nicht gelöscht DMVs

Schnelle Einrichtungsschritte ..

Shekar Kola
quelle