SQL语句执行超时引发网站首页访问故障问题

非常抱歉,今天早上 6:37~8:15 期间,由于获取网站首页博文列表的 SQL 语句出现突发的查询超时问题,造成访问网站首页时出现 500 错误,由此给您带来麻烦,请您谅解。

故障的情况是这样的。

故障期间日志中记录了大量下面的错误。

2020-02-03 06:37:24.635 [Error] An unhandled exception has occurred while executing the request./Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddlewareSystem.Data.SqlClient.SqlException (0x80131904): Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. ---> System.ComponentModel.Win32Exception (258): Unknown error 258 at System.Data.SqlClient.SqlCommand.<>c.<ExecuteDbDataReaderAsync>b__126_0(Task`1 result)

数据库服务器(阿里云 RDS SQL Server 2016 实例)的 CPU 消耗突增。

数据库服务器的 IOPS 暴增。

通过阿里云 RDS 控制台的 CloudDBA 可以查看到故障期间获取首页博文的 SQL 语句被执行了3万多次,执行这么多次是由于查询超时,无法建立缓存,每次请求都要访问数据库。

发现故障后,我们通过阿里云 RDS 的主备切换恢复了正常。

经过对故障的排查分析,锁定的最大嫌疑对象是 SQL Server 参数嗅探(详见园子里的博文 什么是 SQL Server 参数嗅探)。

对于这种因为重用他人生成的执行计划而导致的水土不服现象,SQL Server 有一个专有名词,叫“参数嗅探 parameter sniffing”。

而且我们找到了引发 SQL Server 参数嗅探问题的条件。

在我们的 open api 中提供了获取首页博文列表的 web api ,但没有限制可以获取的最大博文数,也就是下面的 ItemCount 参数(除了 open api ,其他地方调用时 ItemCount 值都是 20 )。

SELECT TOP (@ItemCount)

假如有人调用 open api 时给 ItemCount 传了一个很大的值,比如 20000 ,虽然调用的是同样的 SQL 语句,但由于 ItemCount 的值不同, SQL Server 可能会生成相差很大的执行计划,对于 ItemCount 20000 性能比较好的执行计划,对于 ItemCount 20 可能性能极差。如果查询 ItemCount 20000 时生成的执行计划被缓存下来,查询 ItemCount 20 时继续使用这个执行计划,就会出现本来好好的 SQL 查询突然变得性能极差。我们今天遇到的故障很可能就是这个原因,而且故障时就一个 SQL 语句出现问题(正好就这个 SQL 查询缓存了水土不服的执行计划),其他都正常,也验证了这个猜测。

通过这次故障,我们吸取的教训是一定要在代码中对 ItemCount 与 PageSize 的最大值进行限制,它不仅仅是带来不必要的低性能查询,而且可能会因为 SQL Server 参数嗅探问题拖垮整个数据库。

总结

以上所述是小编给大家介绍的SQL语句执行超时引发网站首页访问故障问题,希望对大家有所帮助!

(0)

相关推荐

  • SQL查询超时的设置方法(关于timeout的处理)

    为了优化OceanBase的query timeout设置方式,特调研MySQL关于timeout的处理,记录如下. 复制代码 代码如下: mysql> show variables like '%time%'; +----------------------------+-------------------+ | Variable_name | Value | +----------------------------+-------------------+ | connect_timeo

  • 解决PHP mysql_query执行超时(Fatal error: Maximum execution time …)

    [错误原因]:mysql_query执行超时.[解决办法]:修改php.ini中的 max_execution_time的值,默认为300,单位是秒,例如:;max_execution_time = 300;将其改为:max_execution_time = 3000最后,重新启动服务管理器即可~

  • C#访问SqlServer设置链接超时的方法

    本文实例讲述了C#访问SqlServer设置链接超时的方法.分享给大家供大家参考.具体实现方法如下: 下面这段代码设置超时时间为60秒,默认为30秒 using (connection) { SqlCommand sqlcommand = connection.CreateCommand(); sqlcommand.CommandTimeout = 60; //默认时间为 30 秒 sqlcommand.CommandText = sqlText; ... 希望本文所述对大家的C#程序设计有所帮

  • Mysql DNS反向解析导致连接超时过程分析(skip-name-resolve)

    MySQL数据库收到一个网络连接后,首先拿到对方的IP地址,然后对这个IP地址进行反向DNS解析从而得到这个IP地址对应的主机名.用主机名在权限系统里面进行权限判断.反向DNS解析是耗费时间的,有可能让用户感觉起来很慢.甚至有的时候,反向解析出来的主机名并没有指向这个IP地址,这时候就无法连接成功了. 可以在配置文件里面禁止MySQL进行反向DNS解析,只需在my.cnf的[mysqld]段落中加入如下行即可: skip-name-resolve (windows与linux下一样的) 设备在连

  • PHP访问MySQL查询超时处理的方法

    目前两个客户端扩展库连接超时可以设置选项来操作,比如mysqli: 复制代码 代码如下: <?php //创建对象 $mysqli = mysqli_init(); //设置超时选项 $mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5); //连接 $mysqli->real_connect('localhost', 'my_user', 'my_password', 'world'); //如果超时或者其他连接失败打印错误信息 if (mysq

  • SQL语句执行超时引发网站首页访问故障问题

    非常抱歉,今天早上 6:37~8:15 期间,由于获取网站首页博文列表的 SQL 语句出现突发的查询超时问题,造成访问网站首页时出现 500 错误,由此给您带来麻烦,请您谅解. 故障的情况是这样的. 故障期间日志中记录了大量下面的错误. 2020-02-03 06:37:24.635 [Error] An unhandled exception has occurred while executing the request./Microsoft.AspNetCore.Diagnostics.E

  • 腾讯面试:一条SQL语句执行得很慢的原因有哪些?---不看后悔系列(推荐)

    说实话,这个问题可以涉及到 MySQL 的很多核心知识,可以扯出一大堆,就像要考你计算机网络的知识时,问你"输入URL回车之后,究竟发生了什么"一样,看看你能说出多少了. 之前腾讯面试的实话,也问到这个问题了,不过答的很不好,之前没去想过相关原因,导致一时之间扯不出来.所以今天,我带大家来详细扯一下有哪些原因,相信你看完之后一定会有所收获,不然你打我. 开始装逼:分类讨论 一条 SQL 语句执行的很慢,那是每次执行都很慢呢?还是大多数情况下是正常的,偶尔出现很慢呢?所以我觉得,我们还得

  • 根据mysql慢日志监控SQL语句执行效率

    根据mysql慢日志监控SQL语句执行效率 启用MySQL的log-slow-queries(慢查询记录). 在Linux环境下先要找到my.cnf文件(一般在/etc/mysql/),然后可能会发现该文件修改后无法保存,原因是你没有相应的权限,可以从属性中看到该文件的所有者是root,这时要先以root的身份打开它: sudo nautilus /etc/mysql 接着再打开my.cnf文件然后找到[mysqld]标签在下面加上: log-slow-queries=/path/slow.lo

  • SQL语句执行顺序详解

    我们做软件开发的,大部分人都离不开跟数据库打交道,特别是erp开发的,跟数据库打交道更是频繁,由于SQL 不同于与其他编程语言的最明显特征是处理代码的顺序.在大数编程语言中,代码按编码顺序被处理,但是在SQL语言中,第一个被处理的子句是FROM子句,尽管SELECT语句第一个出现,但是几乎总是最后被处理. 每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入.这些虚拟表对调用者(客户端应用程序或者外部查询)不可用.只是最后一步生成的表才会返回 给调用者.如果没有在查询中指定某一子句,将跳过

  • 一条 SQL 语句执行过程

    目录 一.MySQL体系架构 -连接池组件 -缓存组件 -分析器 -优化器 -执行器 二.写操作执行过程 三.读操作执行过程 四.SQL执行顺序 一.MySQL 体系架构 - 连接池组件 1.负责与客户端的通信,是半双工模式,这就意味着某一固定时刻只能由客户端向服务器请求或者服务器向客户端发送数据,而不能同时进行. 2.验证用户名和密码是否正确(数据库 MySQL 的 user 表中进行验证),如果错误返回错误通知Access denied for user 'root'@'localhost'

  • MySql中sql语句执行过程详细讲解

    目录 前言: sql语句的执行过程: 查询缓存: 分析器: 优化器: 执行器: 总结 前言: 很多人都在使用mysql数据库,但是很少有人能够说出来整个sql语句的执行过程是怎样的,如果不了解执行过程的话,就很难进行sql语句的优化处理,也很难设计出来优良的数据库表结构.这篇文章主要是讲解一下sql语句的执行过程. sql语句的执行过程: 客户端.连接器.分析器.优化器.执行器.存储引擎几个阶段. 连接器的作用:管理链接.权限验证的处理. 分析器的作用:词法分析.语法分析. 优化器的作用:执行计

  • SQL语句执行深入讲解(MySQL架构总览->查询执行流程->SQL解析顺序)

    前言: 一直是想知道一条SQL语句是怎么被执行的,它执行的顺序是怎样的,然后查看总结各方资料,就有了下面这一篇博文了. 本文将从MySQL总体架构--->查询执行流程--->语句执行顺序来探讨一下其中的知识. 一.MySQL架构总览: 架构最好看图,再配上必要的说明文字. 下图根据参考书籍中一图为原本,再在其上添加上了自己的理解. 从上图中我们可以看到,整个架构分为两层,上层是MySQLD的被称为的'SQL Layer',下层是各种各样对上提供接口的存储引擎,被称为'Storage Engin

  • Postgresql 查看SQL语句执行效率的操作

    Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看 SQL 语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句. Explain语法: explain select - from - [where ...] 例如: explain select * from dual; 这里有一个简单的例子,如下: EXPLAIN SELECT * FROM tenk1; QUERY PLAN ---------

  • MyBatis核心源码深度剖析SQL语句执行过程

    目录 1 SQL语句的执行过程介绍 2 SQL执行的入口分析 2.1 为Mapper接口创建代理对象 2.2 执行代理逻辑 3 查询语句的执行过程分析 3.1 selectOne方法分析 3.2 sql获取 3.3 参数设置 3.4 SQL执行和结果集的封装 4 更新语句的执行过程分析 4.1 sqlsession增删改方法分析 4.2 sql获取 4.3 参数设置 4.4 SQL执行 5 小结 1 SQL语句的执行过程介绍 MyBatis核心执行组件: 2 SQL执行的入口分析 2.1 为Ma

  • SQL语句执行顺序图文介绍

    大家好,我们的数据库已经介绍完了,这里给大家总结一下. 我们这段主要是学习了SQL的增删改查语句,其中查询是我们的重点.我们是以SQL Server 2005来学习的SQL语句,关于SQL Server的图形界面操作,和关于视图.数据库备份还原这些大家下来要下来看一下. 关于Oracle,我们都已经学习了SQL语句,那么Oracle其实已经学习了一大半,就接下来自己学习Oracle主要是看一下他的概念,Oracle和SQL Server还是有很大不同的,熟悉他的表空间这些概念,了解他的图形界面,

随机推荐