一般情况下,如果需要对mysql数据库的语句做一个总体调优,第一反应可能是通过long-query-time=0,然后通过slow-log对占用数据库运行时间最久的语句进行分析。但是会遇到以下情况:
- 5.1版本之前的mysql无法在不重启数据库的情况下调整log-slow
- 5.1版本之前不支持long-query-time=0的设置
- 即使支持以下两项,需要手动的对slow进行设置,并在调优结束后关闭(以免slow过大)
最近在planet上看到一篇文章可以很好的解决这种情况:
使用(需要perl的JSON的包支持):
mpdump > dump.txt
mpfilter < mpdump.txt | mpreport | head -100
其原理是mpdump是一个利用show processlist对系统正在运行的程序进行导出的脚本。
程序通过对一段时间内,快速的执行大量的show processlist,并通过后期的处理,来得出这段时间内损耗数据库时间最久的语句,并给出最后的报表。
之后自己进行了测试。测试之前主要有个顾虑,由于dump是不断的通过show processlist的执行来进行的,会不会频率如此之高的执行是mysql负载增加?服务器负载增加?
测试总结:
1. mpdump并不会对服务器增加过高的负载,从top来看不超过3%
2. mpdump并不会对mysql增加过高的负载,由于show processlist并不进行读表操作,因此对mysql影响不大,但是没有进一步对高负载下的mysql的运行情况进行测试,读者有兴趣可以自行测试。
3. mpreport最终显示的报告并不包含语句的执行时间,因此,report的效果不如 frequency*time的排序效果理想。
4. 综上,mpdump适用于production环境的语句监控,并且服务器mysql不便于通过重启来开启slow-log或者版本低于5.1不能记录time=0的语句。
mpdump及mpfilter的下载地址:
原文地址:
http://developer.cybozu.co.jp/kazuho/2009/07/using-a-statist.html?lang=en
阅读(1544) | 评论(0) | 转发(0) |