前面两章中,聊到了关于数据库性能优化的话题,而本文则再来聊一聊关于MySQL线上排查方面的话题。线上排查、性能优化等内容是面试过程中的“常客”,而对于线上遇到的“疑难杂症”,需要通过理性的思维去分析问题、排查问题、定位问题,最后再着手解决问题,同时,如果解决掉所遇到的问题或瓶颈后,也可以在能力范围之内尝试最优解以及适当考虑拓展性。
性能优化也好,线上排查也罢,其实无论在哪个技术栈中,做这些工作的核心思想亦是共通的,所以MySQL线上排查的步骤,同样可参考JVM的线上排查步骤。
在程序开发与运行过程中,出现Bug问题的几率无可避免,数据库出现问题一般会发生在下述几方面:
当程序在开发/运行期间发生故障时又该如何处理呢?首先在碰到这类故障问题时,得具备良好的排查思路,再结合丰富的理论知识基础,通过经验+数据的支持依次分析后加以解决。
当然,上述这句话说了跟没说差不多哈,接下来聊一聊具体的排查和解决问题的思路。
相对而言,解决故障问题也好,处理性能瓶颈也罢,通常思路大致都是相同的,步骤如下:
当然,上述过程是针对特殊问题以及经验老道的开发者而言的,作为“新时代的程序构建者”,那当然得学会合理使用工具来帮助我们快速解决问题:
前面给出了两套解决问题的步骤,面试/学习推荐前者,实际开发推荐后者,毕竟面试的时候人家问你怎么解决问题的,你总不能说靠百度,毕竟 “能够搜索出来的资料也是人写出来的,大家也能够成为这样的人!”。
数据库出现Bug的几率仅占一小部分,实际上一个业务系统中,各层面的节点都有可能存在一定的故障,但通常情况下来说,系统部署在线上出现问题,经过分析排查后,最终诱发问题的根本原因无非在于如下几点:
万变不离其宗,虽然上述中没有将所有可能会发生问题的位置写到,但总的来说,发生问题排查时,也就是这几个大的方向,先将发生问题的大体定位,然后再逐步推导出具体问题的位置,从而加以解决。
接着来聊一聊关于MySQL中一些Bug问题的排查手段,先从最基本的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的错误信息会由三部分组成:
当在执行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内部对每种不同的错误都有对应的错误码,所以出现错误信息时,先直接去搜索对应的错误码即可,如下:
基本上百度后就能出现对应