如何跟踪使SQL Server崩溃的SQL查询


9

我们有一台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数据库),如何过滤以查找有问题的查询?

谢谢!


1
一切都在同一台服务器上运行吗?意思是,带有Java的应用程序服务器是否也在数据库服务器上运行?
swasheck 2013年

1
与@swasheck的问题相关:您是否为SQL Server最大内存设置了显式值?您是否排除了外部存储压力?
Mike Fal 2013年

您是否尝试过查看黑匣子痕迹?他们可能会为您指明正确的方向。
datagod 2013年

我只是碰到了这个东西,从应用程序的角度来看,我留下的运行轨迹显示了一个空闲数据库。
约书亚

您是否使用全文搜索?另外,您正在运行的SQL Server的确切内部版本号是多少?
Kin Shah 2015年

Answers:


5

请按照如何使用DBCC MEMORYSTATUS命令监视SQL Server上的内存使用中概述的步骤进行操作。补救措施将取决于您的发现。您还可以阅读更易于访问的“ 如何识别Microsoft SQL Server内存瓶颈”

不过要提一个警告:您不太可能会发现个别的问题。追踪内存问题比这更微妙。请记住,当资源用尽并且查询引发内存不足错误时,引发错误的查询很可能只是受害者,而不是罪魁祸首。


谢谢-我已经看过这些内容,但是问题是服务器看起来可以正常工作,然后突然崩溃,它不会逐渐耗尽内存。我也无法从网上找到任何错误信息,该错误是“资源池“内部”中没有足够的系统内存来运行此查询”。实际上意味着-关于DBCC MEMORYSTATUS结果的内部资源池是什么?

这是开发服务器吗?如果是这样,您可以降级到H​​ibernate 3.1来验证问题是否消失了吗?您有两个查询的初始行,您必须尝试消除其中的一个,即SQL Server设置了内存限制并超出了内存限制,或者系统的其他部分正在消耗内存并且SQL Server受到了挤压。在崩溃时间前后对系统进行概要分析,以确定正在发生的情况。
epo

0

似乎您想Extended Events使用事件进行配置query_memory_grant_xxxxx

这是记录信息和存储的超大SQL引擎的最佳选择,您可以随时读取该SQL引擎(您也可以观看实时数据),当服务器重新启动时,存储的信息将不会被清除。 DMVs

快速设置步骤

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.