玩转MySQL:定位排查解决突发Bug

引言

前面MySQL优化、调化两文中,聊到了关于数据库性能优化的话题,而本文则再来聊一聊关于MySQL线上排查方面的话题。线上排查、性能优化等内容是面试过程中的“常客”,而对于线上遇到的“疑难杂症”,需要通过理性的思维去分析问题、排查问题、定位问题,最后再着手解决问题,同时,如果解决掉所遇到的问题或瓶颈后,也可以在能力范围之内尝试最优解以及适当考虑拓展性。

性能优化也好,线上排查也罢,其实无论在哪个技术栈中,做这些工作的核心思想亦是共通的,所以MySQL线上排查的步骤,同样可参考JVM的线上排查步骤。

一、线上故障排查的思路与方向

在程序开发与运行过程中,出现Bug问题的几率无可避免,数据库出现问题一般会发生在下述几方面:

  • ①撰写的SQL语句执行出错,俗称为业务代码Bug。

  • ②开发环境执行一切正常,线上偶发SQL执行缓慢的情况。

  • ③线上部署MySQL的机器故障,如磁盘、内存、CPU100%,MySQL自身故障等。

当程序在开发/运行期间发生故障时又该如何处理呢?首先在碰到这类故障问题时,得具备良好的排查思路,再结合丰富的理论知识基础,通过经验+数据的支持依次分析后加以解决。

当然,上述这句话说了跟没说差不多哈,接下来聊一聊具体的排查和解决问题的思路。

1.1、线上排查及其解决问题的思路

相对而言,解决故障问题也好,处理性能瓶颈也罢,通常思路大致都是相同的,步骤如下:

  • ①分析问题:根据理论知识+经验分析问题,判断问题可能出现的位置或可能引起问题的原因,将目标缩小到一定范围。

  • ②排查问题:基于上一步的结果,从引发问题的“可疑性”角度出发,从高到低依次进行排查,进一步排除一些选项,将目标范围进一步缩小。

  • ③定位问题:通过相关的监控数据的辅助,以更“细粒度”的手段,将引发问题的原因定位到精准位置。

  • ④解决问题:判断到问题出现的具体位置以及引发的原因后,采取相关措施对问题加以解决。

  • ⑤尝试最优解(非必须):将原有的问题解决后,在能力范围内,且环境允许的情况下,应该适当考虑问题的最优解(可以从性能、拓展性、并发等角度出发)。

当然,上述过程是针对特殊问题以及经验老道的开发者而言的,作为“新时代的程序构建者”,那当然得学会合理使用工具来帮助我们快速解决问题:

  • ①摘取或复制问题的关键片段。

  • ②打开百度或谷歌后粘贴搜索。

  • ③观察返回结果中,选择标题与描述与自己问题较匹配的资料进入。

  • ④多看几个后,根据其解决方案尝试解决问题。

  • ⑤成功解决后皆大欢喜,尝试无果后“找人/问群”。

  • ⑥“外力”无法解决问题时自己动手,根据之前的步骤依次排查解决。

前面给出了两套解决问题的步骤,面试/学习推荐前者,实际开发推荐后者,毕竟面试的时候人家问你怎么解决问题的,你总不能说靠百度,毕竟 “能够搜索出来的资料也是人写出来的,大家也能够成为这样的人!”。

1.2、线上排查的方向

数据库出现Bug的几率仅占一小部分,实际上一个业务系统中,各层面的节点都有可能存在一定的故障,但通常情况下来说,系统部署在线上出现问题,经过分析排查后,最终诱发问题的根本原因无非在于如下几点:

  • 应用程序本身导致的问题 程序内部频繁触发GC,造成系统出现长时间停顿,导致客户端堆积大量请求。 JVM参数配置不合理,导致线上运行失控,如堆内存、各内存区域太小等。 Java程序代码存在缺陷,导致线上运行出现Bug,如死锁/内存泄漏、溢出等。 程序内部资源使用不合理,导致出现问题,如线程/DB连接/网络连接/堆外内存等。

  • 上下游内部系统导致的问题 上游服务出现并发情况,导致当前程序请求量急剧增加,从而引发问题拖垮系统。 下游服务出现问题,导致当前程序堆积大量请求拖垮系统,如Redis宕机/DB阻塞等。

  • 程序所部署的机器本身导致的问题 服务器机房网络出现问题,导致网络出现阻塞、当前程序假死等故障。 服务器中因其他程序原因、硬件问题、环境因素(如断电)等原因导致系统不可用。 服务器因遭到入侵导致Java程序受到影响,如木马病毒/矿机、劫持脚本等。

  • 第三方的RPC远程调用导致的问题 作为被调用者提供给第三方调用,第三方流量突增,导致当前程序负载过重出现问题。 作为调用者调用第三方,但因第三方出现问题,引发雪崩问题而造成当前程序崩溃。

万变不离其宗,虽然上述中没有将所有可能会发生问题的位置写到,但总的来说,发生问题排查时,也就是这几个大的方向,先将发生问题的大体定位,然后再逐步推导出具体问题的位置,从而加以解决。

接着来聊一聊关于MySQL中一些Bug问题的排查手段,先从最基本的SQL报错聊起,接着再讲讲慢查询该如何排查和解决,最后再说说线上机器/程序故障时该如何排查。

二、SQL语句执行出错排查

作为一个程序员,对MySQL数据库而言,接触最多的就是SQL语句的撰写,和写业务代码时一样,写代码时会碰到异常、错误,而写SQL时同样如此,比如:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'xxxxxxx' at line 1 复制代码

在之前的《MySQL命令大全-错误码》中曾说到过,MySQL的错误信息会由三部分组成:

  • ErrorCode:错误码,上述错误信息中的1064。

  • SQLState:SQL状态,也就是前面信息中的42000。

  • ErrorInfo:错误详情,:后面跟的一大长串描述则是具体的错误详情。

当在执行SQL时出现问题,一般都会抛出对应的错误信息,拿到了这些错误信息之后,其实解决的办法就比较简单了,首先可以参考具体的错误详情,如果英语好的小伙伴可以直接尝试阅读,如果英语不好的小伙伴可以借助一些翻译工具来转换成中文,比如上述的错误信息,从其给出的错误详情大致能够阅读出原因:

原文:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'xxxxxxx' at line 1 翻译:您的SQL语法有错误;请查看与MySQL-Server版本对应的手册,以了解在第1行“xxxxxxx”附近正确语法的使用方式。

从这段错误提示中可以明显得知:目前咱们执行SQL时遇到了一个语法错误,也就是SQL写错了,具体位置是第一行的'xxxxxxx'位置,所以如果要解决这个问题就很简单了,找到第一行'xxxxxxx'位置,观察后把SQL改对即可。

上述这种方式适用于绝大部分SQL报错的情况,如果遇到一个少见的错误,自己也无法从给出的错误信息中定位问题,这时最好的解决办法并不是自己研究,或者去问他人,而是直接百度/谷歌,作为一位合格的开发者,必须要能够熟练运用搜索引擎来解决问题,开发过程中遇到的80%问题都可以直接从网上找到答案,所以与其自己花精力去思考,或者去麻烦别人解决,不如直接在网上找现成的解决方案。

SQL执行报错,在网上要找这类问题的解决方案其实十分简单,毕竟MySQL内部对每种不同的错误都有对应的错误码,所以出现错误信息时,先直接去搜索对应的错误码即可,如下:

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值