YOLO813

Mysql数据库慢日志排查

    数据库的水很深,优化的方向很多,一般来讲,我们拿到一个数据库的查询语句,都能在互联网上查到一些优化的思路,例如,添加索引,联合索引等,那么怎么查看数据库里面的慢日志呢?

    现在很多大厂都提供了配套服务,例如阿里云的rds,实例会话里面可以看到当前数据库里面的查询语句,可以查询到慢日志(慢日志只是一个定义,这个时间取决于long_query_time,mariadb10.3.27版本中默认是10秒,下文会讲到),一般个人做站玩玩的基本都是自己搭建数据库吧,所以记录下自己查询数据库慢日志的学习过程。


    我的数据库版本,以下均在root权限下完成:

mysql  Ver 15.1 Distrib 10.3.27-MariaDB, for Linux (x86_64) using readline 5.1

    进入数据库,输入如下命令,最后的;符号不要省略

show variables like "%log%";

我们可以看到general_log默认是关闭状态,据说开启日志记录对数据库有5%-10%的性能影响(尚未考证,但肯定是有影响的,毕竟是开启了一项功能),所以一般是测试才来使用的,

    使用如下命令打开日志记录:

set global general_log=1;

    下面的general_log_file值代表着记录查询日志的名称,有的是记录了日志的绝对路径,我这边只有一个名字,文件路径通过配置文件也比较好找,一般是在数据库存储数据data的目录下,我是使用yum工具安装的mariadb,所以配置文件在/etc/my.cnf.d/目录下:

cd /etc/my.cnf.d/
cat mariadb-server.cnf

    可以看到我的数据目录存放在/var/lib/mysql目录下,进入到该目录

cd /var/lib/mysql
ls

    就可以看到自己的日志记录文件了,我们使用如下命令打开日志的最后一行,这样就可以实时刷新日志了:

tail -f iZcrZ.log

    可以看到,现在无论对数据库进行什么操作,日志都会同步刷新到界面上,上面有一行zxf@的前缀,这是什么意思呢?我一开始也有点纳闷,后面查看了自己django网站的配置文件发现,这是数据库当前连接用户名的含义,配置文件如下:

    所以建议网站的数据库单独命名给一个用户,否则后面排查日志很容易混淆自己测试的语句和网站用户访问的语句。

    同理,我们可以打开慢日志记录,

set gloabl slow_query_log=1;

    很快可以发现当前目录多出了一个slow日志,为了测试效果,我将超时时间超过1秒就算入慢日志

#查看慢日志默认时间
show variables like "%query%";
set global long_query_time=1;


    这里分开是为了强调一个事情,在MySQL 5.1版本之后,可以直接使用set global命令开启(慢)日志查询而不用重启mysql,就像我上面的那样,但是在我使用xshell开启慢日志时,不管我怎么设置开启或设置慢日志的时间,或者重新登录mariadb,使用如下命令查询value一直没有变化,百度和谷歌也没答案,干脆就就放着出去晃了

show variables like "%query%";

    结果在外面使用macbook登录finalshell查看时,居然生效了。。。我也不知道这到底是个什么原因,继续测试吧

    开启慢日志,会出现一个iZ-slow.log,但是这并不意味着原来的日志记录就失效了,之前的日志记录功能还在,只不过超出了设定了long_query_time的查询语句会被记录到iZ-slow.log中方便排查问题。

    使用如下两条语句测试:

select sleep(3);
select user from mysql.user;

    上面第一张图是正常日志,记录了两条语句记录;下面一张图片是慢日志记录,只记录超过long_query_time时间的语句。


    有了慢日志记录,很容易就可以查到哪些语句需要去优化。在网上找到监控mysql的4种可视化方式,我使用了其中两种Mytop,Innotop,具体的文章链接在下方参考中,用法都挺简单的,而且在测试过程中,我发现这二者并不需要开启日志记录(general_log等都为关闭状态),照样可以记录查询语句,了解的还不是很透,后面有时间再来记录详细的用法。

    实测,日志文件很大的话,可以在关闭状态时删除,下次开启又会自动生成。


备注:

    谷歌搜索发现提示“您的网页不适合在移动设备上浏览”,自己在search.google.com测试确实是提示网页不适合在移动设备上浏览,但右侧的屏幕截图明显和我想象的不一样,毕竟我已经写了屏幕自适应版本,而在上面的网页加载信息点击后提示“网页只加载了部分内容”,原来是自己写的robots.txt 禁止 Googlebot 抓取css、js文件,这可真是个大失误,特此记录。


参考

#监控mysql服务端的四种方式
https://www.tecmint.com/mysql-performance-monitoring/