内容简介:最近收到一SQL Server数据库服务器的告警邮件,告警内容具体如下所示:DATE/TIME:10/23/2018 4:30:26 PM
最近收到一SQL Server数据库服务器的告警邮件,告警内容具体如下所示:
DATE/TIME:10/23/2018 4:30:26 PM
DESCRIPTION: 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.
COMMENT: (None)
JOB RUN: (None)
关于 “ 8623 The query processor ran out of internal resources and could not produce a query plan” 这个错误,这篇文章不分析错误产生的原因以及解决方案。这里仅仅介绍如何捕获产生这个错误的 SQL 语句。因为出现这个错误,具体对应的SQL语句不会写入到错误日志。不能定位到具体SQL语句,很难解决这错误。所以解决问题的前提是先定位SQL语句。我们可以通过扩展事件或服务器端跟踪两种方式来定位SQL语句。
扩展事件(Extended Events)捕获
如下所示,脚本只需根据实际情况修改 filename 、 metadatafile 参数对应的值。就会创建扩展事件(Extented Events) overly_complex_queries
CREATE EVENT SESSION overly_complex_queries ON SERVER ADD EVENT sqlserver.error_reported ( ACTION (sqlserver.sql_text, sqlserver.tsql_stack, sqlserver.database_id, sqlserver.username) WHERE ([severity] = 16 AND [error_number] = 8623) ) ADD TARGET package0.asynchronous_file_target (set filename = 'D:\DB_BACKUP\overly_complex_queries.xel' , metadatafile = 'D:\DB_BACKUP\overly_complex_queries.xem', max_file_size = 10, max_rollover_files = 5) WITH (MAX_DISPATCH_LATENCY = 5SECONDS) GO -- Start the session ALTER EVENT SESSION overly_complex_queries ON SERVER STATE = START GO
然后我们测试,使用网上一个脚本测试验证,如下所示,执行这个脚本就会报 “ 8623 The query processor ran out of internal resources and could not produce a query plan” 错误,如下所示:
选中扩展事件(Extented Events)overly_complex_queries,单击右键 “ Watch Live Data"就能查看是那个SQL语句出现这个错误(sql_text),当然,也可以通过选项 “ View Target Data ” 查看所有捕获的数据。
注意:这个扩展事件只能运行在SQL Server 2012及后续版本,如果是SQL Server 2008的相关版本部署,就会报下面错误:
Msg 25706, Level 16, State 8, Line 1
The event attribute or predicate source, "error_number", could not be found.
Msg 15151, Level 16, State 1, Line 18
Cannot alter the event session 'overly_complex_queries', because it does not exist or you do not have permission.
服务器端跟踪(Server Side Trace)捕获
如上所示,刚好我们这台数据库服务器的版本为SQL Server 2008 R2,我们只能采取Server Side Trace来捕获这个错误的SQL语句。设置Server Side Trace脚本如下(相关参数需根据实际情况等设定):
-- 定义参数 declare @rc int declare @TraceID int declare @maxfilesize bigint set @maxfilesize = 1024 -- 初始化跟踪 exec @rc = sp_trace_create @TraceID output, 0, N'D:\SQLScript\trace_error_8623', @maxfilesize, NULL --此处的D:\SQLScript\trace_error_8623是文件名(可自行修改),SQL会自动在后面加上.trc的扩展名 if (@rc != 0) goto error -- 设置跟踪事件 declare @on bit set @on = 1 --trace_event_id=13 SQL:BatchStarting trace_event_id=22 ErrorLog exec sp_trace_setevent @TraceID, 13, 1, @on exec sp_trace_setevent @TraceID, 13, 3, @on exec sp_trace_setevent @TraceID, 13, 6, @on exec sp_trace_setevent @TraceID, 13, 7, @on exec sp_trace_setevent @TraceID, 13, 8, @on exec sp_trace_setevent @TraceID, 13, 11, @on exec sp_trace_setevent @TraceID, 13, 12, @on exec sp_trace_setevent @TraceID, 13, 14, @on exec sp_trace_setevent @TraceID, 13, 15, @on exec sp_trace_setevent @TraceID, 13, 35, @on exec sp_trace_setevent @TraceID, 13, 63, @on exec sp_trace_setevent @TraceID, 22, 1, @on exec sp_trace_setevent @TraceID, 22, 3, @on exec sp_trace_setevent @TraceID, 22, 6, @on exec sp_trace_setevent @TraceID, 22, 7, @on exec sp_trace_setevent @TraceID, 22, 8, @on exec sp_trace_setevent @TraceID, 22, 12, @on exec sp_trace_setevent @TraceID, 22, 11, @on exec sp_trace_setevent @TraceID, 22, 14, @on exec sp_trace_setevent @TraceID, 22, 14, @on exec sp_trace_setevent @TraceID, 22, 35, @on exec sp_trace_setevent @TraceID, 22, 63, @on -- 启动跟踪 exec sp_trace_setstatus @TraceID, 1 -- 记录下跟踪ID,以备后面使用 select TraceID = @TraceID goto finish error: select ErrorCode=@rc finish: GO
上面SQL会生成一个服务器端跟踪事件,并返回对应的id,如下查看所示:
注意:上面捕获 SQL:BatchStarting 事件( trace_event_id=13 ),是因为捕获 ErrorLog ( trace_event_id=22) 等事件时,都
无法捕获到对应的 SQL( 对应的 trace column 没有捕获 SQL 语句,暂时还没有找到一个好的解决方法)。这里也有个弊端,就是会捕获大量无关的 SQL 语句 。
测试过后,你可以使用SQL Profile工具打开D:\SQLScript\trace_error_8623.trc找到错误信息,对应的SQL语句(在这个时间点附近的SQL语句,一般为是错误信息后面的第一个SQL语句,需要做判断),如下截图所示:
也可以使用脚本查询,如下所示,也是需要自己判断定位SQL语句,一般都是 “ 8623 The query processor ran out of internal resources and could not produce a query plan ” 出现后紧接着的SQL。
SELECT StartTime,EndTime, TextData, ApplicationName,SPID,Duration,LoginName FROM ::fn_trace_gettable(N'D:\SQLScript\trace_error_8623.trc',DEFAULT) WHERE spid=64 ORDER BY StartTime
参考资料:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- js捕获错误信息
- Python捕获所有异常
- Android NativeCrash 捕获与解析
- Wireshark如何捕获USB流量
- 在 Docker 容器中捕获信号
- Laravel异常:捕获,处理和创建
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
互联网产品运营:产品经理的10堂精英课
丁华、聂嵘海、王晶 / 电子工业出版社 / 2017-5 / 59
《互联网产品运营:产品经理的10堂精英课》共有10章,前9章分别从互联网产品运营的9个点入手,最后一章辅以案例,分析当下市场热门产品的运营模式。 第1章点明在运营产品之前需要经过缜密的策划,这样才能有明确的运营方向;第2章讲述产品运营的定位,有了准确的定位,运营才不会走偏;第3章描述用户运营,用户是一款产品的根本,没有用户,产品就是死的;第4章讲述内容运营的技巧,产品内容要怎么运营才能受到用......一起来看看 《互联网产品运营:产品经理的10堂精英课》 这本书的介绍吧!