百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

慢SQL是如何拖垮数据库的?

mhr18 2025-02-10 13:29 20 浏览 0 评论

1000万云上开发者,全栈云产品0元试用:点击「链接」免费试用,即刻开启云上实践之旅!


本文结合一个实际故障案例出发,从小白的视角分析慢SQL是如何打垮数据库并引发故障的。

作者 | 全达领(达领)

来源 | 阿里开发者公众号


一、案发现场

上午9:49,应用报警:
4103.ERR_ATOM_CONNECTION_POOL_FULL,应用数据库连接池满。

上午9:49-10:08期间,陆续出现
4200.ERR_GROUP_NOT_AVALILABLE、4201.

ERR_GROUP_NO_ATOM_AVAILABLE、
4202.ERR_SQL_QUERY_TIMEOUT等数据库异常报警。

由于数据库承载了销售核心的用户组织权限功能,故障期间,期间销售工作台无法打开,大量小二反馈咨询。

上午10:08,定位到有应用基础缓存包升级发布,上午9点40刚完成最后一批发布,时间点相吻合,尝试通过打开缓存开关,系统恢复。


二、现场结论

对此次升级缓存包应用发布内容分析,发现升级的某个二方包中,删除了本地缓存逻辑,直接请求DB,而本次升级没有对请求的SQL进行优化,如下代码所示,该SQL从Oracle迁移到MySQL,由于数据库性能的差异,最终造成慢查询,平均一次执行2S多,大量慢SQL最终打挂数据库。

SELECT CRM_USER_ID AS LOGIN_ID, CRM_ROLE_ID AS ROLE_NAME, CRM_ORG_ID AS ORG_ID
    , CONCAT(CRM_USER_ID, '#', CRM_ROLE_ID, '#', CRM_ORG_ID) AS URO
    , CONCAT(CRM_ORG_ID, '#', CRM_ROLE_ID) AS ORG_ID_ROLE_NAME
FROM CRM_USER_ROLE_ORG
WHERE IS_DELETED = 'n'
    AND CONCAT(CRM_ORG_ID, '#', CRM_ROLE_ID) = '123#abc'
ORDER BY ID DESC;

经过讨论排查分析,得出以下结论:

  1. 之前逻辑走本地内存,本次升级中由于涉及到的某个二方库代码变更删除了本地逻辑改查DB
  2. 查询DB的SQL去O阶段没有进行优化,在MySQL下为慢SQL,大量慢SQL查询拖垮了数据库


三、进一步的疑问

面对上述结论,作为数据库方面的小白,有以下几个疑问,感觉需要深入挖掘:

  1. 这条SQL为何是慢SQL
  2. 发布的应用为非核心应用,只是与登录权限共用了一个数据库,当时发布应用的QPS只有0.几,为何可以把库打挂
  3. 之前已经申请过一波连接池扩容,从10扩到了15,发布的应用线上有流量的机器不过7台,为何可以把数据库压垮
  4. 事后复盘,发布前一天灰度时也有过慢SQL,为何当时没有压垮数据库


四、深入分析原理

带着以上疑问,结合以下相关知识,一层层剥开深层次的原因

4.1、慢SQL分析

CONCAT(CRM_ORG_ID, '#', CRM_ROLE_ID) = '123#abc'

该SQL由工具直接从Oracle翻译过来的

  • 虽然两个拼接的字段各自都有索引,但是使用函数后,MySQL是不会使用索引的,退化为了普通查询
  • 由于表数据量较大,全表40W+数据,导致扫描行数很多,平均扫描16W行、逻辑读38W行,执行2s左右

4.2、业务代码排查

  • 故障后第二天,有个别销售反馈页面打开较慢,有好几秒,怀疑是止血时的操作是切到了tair而不是回滚到本地缓存逻辑导致,不过此时还是有疑问,为何一个页面会慢好几秒呢,听起来就像是一次请求大量循环调用缓存导致。
  • 代理账号经定位,确实是如上假设,此处的业务代码逻辑为查找组织下的指定角色,会递归遍历所有子组织,最差情况下,一次页面请求,会有1000+次访问缓存/DB
  • 结合数据库当时慢SQL趋势,符合我们的猜测,虽然业务流量不大,但是每次请求会放大1000倍,最终导致问题SQL执行了1.5W+次,同时同下图可以看到,其他正常SQL由于系统忙被排队,响应也变慢,而这些基本都是基础用户组织权限相关,所以造成了业务系统不可用


4.3、druid连接池?数据库连接池?

  • 上文背景处有说道,应用连接池配置的为15,切应用流量本身很小,那么是什么原因导致整个库都被拖垮呢
  • 这里要从一次SQL请求的链路说起,如下图所示
    • 应用层通过tddl访问MySQL数据源,其中连接管理是在atom层,利用druid进行连接池的管理,我们平时所说的tddl线程池,指的就是druid连接池,这个配置维护在diamond中,一般有dba来设置。
    • 对于我们的应用来说,单个应用7台机器,maxPoolSize配置为15,数据库是单库单表,则单个应用的最大连接数为1*15,所有应用连接数为7*1*15=105
  • 注意以上只是应用维度的连接数推导,正常工作下连接池也不会达到max的,如果达到了,TDDL会抛出4103.ERR_ATOM_CONNECTION_POOL_FULL,应用数据库连接池满错误,与第一节现象吻合
  • 那么问题来了,这么几个连接,为何打垮整个数据库呢;看数据库的最大连接数可是有8000
  • 经与DBA同学咨询,了解到了数据库server端的内部处理线程池与druid没有任何关系,两者是两个层面的东西,所以需要研究下server端的处理逻辑
  • 同时这里提一点,由于我们很多应用都在连接数据库,所以需要评估下数据库的最大连接数是否可以满足这么多应用的机器的链接,即应用服务器总数 * 一个数据库实例上的分库数(atom) * maxPoolSize < max_user_connections


剩余60%,完整内容请点击下方链接查看:

慢SQL是如何拖垮数据库的?


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关推荐

SpringBoot 各种分页查询方式详解(全网最全)

一、分页查询基础概念与原理1.1什么是分页查询分页查询是指将大量数据分割成多个小块(页)进行展示的技术,它是现代Web应用中必不可少的功能。想象一下你去图书馆找书,如果所有书都堆在一张桌子上,你很难...

《战场兄弟》全事件攻略 一般事件合同事件红装及隐藏职业攻略

《战场兄弟》全事件攻略,一般事件合同事件红装及隐藏职业攻略。《战场兄弟》事件奖励,事件条件。《战场兄弟》是OverhypeStudios制作发行的一款由xcom和桌游为灵感来源,以中世纪、低魔奇幻为...

LoadRunner(loadrunner录制不到脚本)

一、核心组件与工作流程LoadRunner性能测试工具-并发测试-正版软件下载-使用教程-价格-官方代理商的架构围绕三大核心组件构建,形成完整测试闭环:VirtualUserGenerator(...

Redis数据类型介绍(redis 数据类型)

介绍Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sortedset:有序集合)。1、字符串类型概述1.1、数据类型Redis支持...

RMAN备份监控及优化总结(rman备份原理)

今天主要介绍一下如何对RMAN备份监控及优化,这里就不讲rman备份的一些原理了,仅供参考。一、监控RMAN备份1、确定备份源与备份设备的最大速度从磁盘读的速度和磁带写的带度、备份的速度不可能超出这两...

备份软件调用rman接口备份报错RMAN-06820 ORA-17629 ORA-17627

一、报错描述:备份归档报错无法连接主库进行归档,监听问题12541RMAN-06820:WARNING:failedtoarchivecurrentlogatprimarydatab...

增量备份修复物理备库gap(增量备份恢复数据库步骤)

适用场景:主备不同步,主库归档日志已删除且无备份.解决方案:主库增量备份修复dg备库中的gap.具体步骤:1、停止同步>alterdatabaserecovermanagedstand...

一分钟看懂,如何白嫖sql工具(白嫖数据库)

如何白嫖sql工具?1分钟看懂。今天分享一个免费的sql工具,毕竟现在比较火的NavicatDbeaverDatagrip都需要付费才能使用完整功能。幸亏今天有了这款SQLynx,它不仅支持国内外...

「开源资讯」数据管理与可视化分析平台,DataGear 1.6.1 发布

前言数据齿轮(DataGear)是一款数据库管理系统,使用Java语言开发,采用浏览器/服务器架构,以数据管理为核心功能,支持多种数据库。它的数据模型并不是原始的数据库表,而是融合了数据库表及表间关系...

您还在手工打造增删改查代码么,该神器带你脱离苦海

作为Java开发程序,日常开发中,都会使用Spring框架,完成日常的功能开发;在相关业务系统中,难免存在各种增删改查的接口需求开发。通常来说,实现增删改查有如下几个方式:纯手工打造,编写各种Cont...

Linux基础知识(linux基础知识点及答案)

系统目录结构/bin:命令和应用程序。/boot:这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。/dev:dev是Device(设备)的缩写,该目录...

PL/SQL 杂谈(二)(pl/sql developer使用)

承接(一)部分。我们从结构和功能这两个方面展示PL/SQL的关键要素。可以看看PL/SQL的优雅的代码。写出一个好的代码,就和文科生写出一篇优秀的作文一样,那么赏心悦目。1、与SQL的集成PL/S...

电商ERP系统哪个好用?(电商erp哪个好一点)

电商ERP系统哪个好用?做电商的,谁还没被ERP折腾过?有老板说:“我们早就上了ERP,订单、库存、财务全搞定,系统用得飞起。”也有运营吐槽:“系统是上了,可库存老不准,订单漏单错单天天有,财务对账还...

汽车检测线系统实例,看集中控制与PLC分布控制

PLC可编程控制器,上个世纪70年代初,为取代早期继电器控制线路,开始采取存储指令方式,完成顺序控制而设计的。开始仅有逻辑运算、计时、计数等简单功能。随着微处理的发展,PLC可编程能力日益提高,已经能...

苹果五件套成公司年会奖品主角,几大小技巧教你玩转苹果新品

钱江晚报·小时新闻记者张云山随着春节的临近,各家大公司的年会又将陆续上演。上周,各大游戏公司的年会大奖,苹果五件套又成了标配。在上海的游戏公司中,莉莉丝奖品列表拉得相当长,从特等奖到九等奖还包含了特...

取消回复欢迎 发表评论: