MySQL慢查询可视化工具Anemometer安装与使用

Anemometer是一款开源的MySQL慢查询可视化工具,它使用pt-query-digest工具解析MySQL慢查询日志,将解析结果显示在Web页面上,提供丰富的查询方式,用户在页面上能够更加方便地查看MySQL慢查询信息。本文简单介绍Anemometer安装部署方式以及遇到的一些问题。

1. 环境依赖

  • MySQL数据库,用于存储Anemometer使用的一些查询分析数据。
  • pt-query-digest工具,用于解析MySQL慢查询日志,解析结果将存储在MySQL数据库中。
  • php web server,php版本 5.5及以上。

操作系统为CentOS 7.2,MySQL版本 5.7.19。关于以上环境的配置和工具的安装,本文不再详细描述,网上有很多文章可供参考。

2. 安装Anemometer

下载源码:

cd /var/www/html
git clone https://github.com/box/Anemometer.git anemometer

导入数据:

cd anemometer

mysql -S /mysql/data/mysql.sock < install.sql

mysql -S /mysql/data/mysql.sock -e “grant ALL ON slow_query_log.* to ‘anemometer’@’%’ IDENTIFIED BY ‘123456’;”

修改配置文件:

cd conf/

cp sample.config.inc.php config.inc.php

vim config.inc.php

$conf['datasources']['localhost'] = array(
        'host'  => '127.0.0.1',
        'port'  => 3306,
        'db'    => 'slow_query_log',
        'user'  => 'anemometer',
        'password' => '123456',
        'tables' => array(
                'global_query_review' => 'fact',
                'global_query_review_history' => 'dimension'
        )
);

配置插件explain连接MySQL的账号和密码,如下:

$conf['plugins'] = array(
        ...
    'explain'       =>      function ($sample) {
        $conn['user'] = 'anemometer';
        $conn['password'] = 'superSecurePass';
        
        return $conn;
    },
);

重启web 服务器,这里使用的是apache httpd服务器。

systemctl restart httpd.service

访问页面:

http://192.168.56.200/anemometer/index.php

3. 导入一些慢查询日志

pt-query-digest 
--user=anemometer 
--password=123456 
--review h=127.0.0.1,D=slow_query_log,t=global_query_review 
--history h=127.0.0.1,D=slow_query_log,t=global_query_review_history 
--no-report
--limit=0% 
--filter=" \$event->{Bytes} = length(\$event->{arg}) and \$event->{hostname}=\"$HOSTNAME\""
/mysql/data/slow.log

4. 问题

(1)打开Anemometer首页,提示缺少BCMath扩展。

Anemometer requires the BCMath extension

解决:安装php-bcmath扩展
yum install -y php-bcmath.x86_64

(2)服务器时区设置问题

将服务器时区设置为UTC时区。

(3)pt-query-digest 解析慢日志导入到数据库报错。

anemometer 与 pt-query-digest 生成的表global_query_review_history 表结构不同,pt-query-digest版本为3.1.0,可能与anemometer使用的表结构不兼容。pt-query-digest解析慢日志的结果导入到anemometer数据库,这个逻辑需要修改源码或者进行二次开发。

(4)group查询报错
MySQL5.7 sql_mode打开ONLY_FULL_GROUP_BY后,Anemometer的一些不规范的group by语句查询会报错。

GROUP BY checksum
修改为
GROUP BY checksum,snippet

SELECT checksum AS `checksum`,
  LEFT(dimension.sample,20) AS `snippet`,
  ROUND(SUM(Rows_examined_sum)/SUM(rows_sent_sum),2) AS `index_ratio`,
  SUM(Query_time_sum) / SUM(ts_cnt) AS `query_time_avg`,
  ROUND(SUM(Rows_sent_sum)/SUM(ts_cnt),0) AS `rows_sent_avg`,
  SUM(ts_cnt) AS `ts_cnt`,
  SUM(Query_time_sum) AS `Query_time_sum`,
  SUM(Lock_time_sum) AS `Lock_time_sum`,
  SUM(Rows_sent_sum) AS `Rows_sent_sum`,
  SUM(Rows_examined_sum) AS `Rows_examined_sum`,
  SUM(Full_scan_sum) AS `Full_scan_sum`,
  SUM(Tmp_table_sum) AS `Tmp_table_sum`,
  SUM(Filesort_sum) AS `Filesort_sum`
 FROM `global_query_review` AS `fact`
 JOIN `global_query_review_history` AS `dimension` USING (`checksum`)
 WHERE dimension.hostname_max = "127.0.0.1"
  AND dimension.ts_min >= "2020-03-09 13:53:29"
  AND dimension.ts_min <= "2020-03-10 13:53:29"
 GROUP BY checksum
 ORDER BY Query_time_sum DESC
 LIMIT 20

5. 总结

Anemometer 源码最后一次更新是2016年,随着pt-query-digest和MySQL版本的更新,可能有一些不兼容,需要基于源码进行改造或者二次开发,但是改起来也不太困难,总的来说,Anemometer还算是一个不错的MySQL慢查询可视化工具。

发表评论