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!
quelle
Antworten:
Befolgen Sie die Schritte unter Verwenden des
DBCC MEMORYSTATUS
Befehls 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.
quelle
Anscheinend möchten Sie die
Extended Events
Konfiguration mithilfe der Ereignisse durchführenquery_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 ..
quelle