Sql-Server

如何跟踪導致 SQL Server 崩潰的 SQL 查詢

  • August 20, 2019

我們有一個 SQL Server 2008 數據庫伺服器(它恰好在 MS 故障轉移集群下執行,但我認為這與這裡無關)。

我們的應用程序執行 Hibernate 以訪問數據庫,並且由於我們最近從 v3.1 升級到 3.6,我們經常遇到 SQL Server 崩潰(每 24-48 小時,但有時更頻繁)。

有問題的具體問題似乎與記憶體有關。就在伺服器崩潰之前(然後似乎由故障轉移集群管理器自動重新啟動),我們得到了這些錯誤的負載:

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

也偶爾(但經常)的消息

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.

錯誤:17312,嚴重性:16,狀態:1。(參數:)。錯誤以簡潔模式列印,因為在格式化過程中出現錯誤。跟踪、ETW、通知等被跳過。

我也遇到了一些應用程序級別的錯誤,例如

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

然後是令人興奮且可能具有指導意義的錯誤:

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.

伺服器上的負載沒有改變,所以當它以前沒有表示發送給它的查詢存在問題時,它現在沒有理由耗盡記憶體。

現在的問題 - 我如何跟踪導致此錯誤的查詢(因此可能是所有問題)?似乎自從我們的 Hibernate 升級以來,它一直在 SQL Server 上觸發一些巨大的查詢,而這已經破壞了它。碰巧的是,我對它們可能是什麼有一些想法,但能夠追踪它們會很好。

我當然可以執行 SQL Server 分析器,但是一旦完成(並產生大量數據 - 這是一個繁忙的 OLTP 數據庫),我如何過濾以找到有問題的查詢?

謝謝!

按照如何使用DBCC MEMORYSTATUS命令監視 SQL Server 上的記憶體使用情況中的步驟進行操作。補救措施將取決於您的發現。您還可以閱讀如何辨識 Microsoft SQL Server 記憶體瓶頸,它更易於訪問。

不過需要注意的一點是:您不太可能會發現個別查詢是罪魁禍首。追踪記憶問題比這更微妙。請記住,當您耗盡資源並且查詢引發記憶體不足錯誤時,很可能引發錯誤的查詢只是受害者,而不是罪魁禍首。

似乎您想Extended Events使用 events 進行配置query_memory_grant_xxxxx

這是您記錄資訊和儲存的超大 SQL 引擎的最佳選擇,您可以隨時讀取(您也可以觀看實時數據),當伺服器重新啟動時,儲存的資訊不會被清除,不像DMVs

快速設置步驟..

引用自:https://dba.stackexchange.com/questions/39153