git地址:https://github.com/hcymysql/slowquery
1、percona-toolkit工具的安装
yum install perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL perl-DBI perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker -y
tar zxvf percona-toolkit-3.0.12_x86_64.tar.gz
cd percona-toolkit-3.0.12
perl Makefile.PL
make
make install
vi /etc/profile
export PATH=/root/percona-toolkit-3.0.12/bin
source /etc/profile
2、php web mysql环境的搭建
yum install httpd mysql php php-mysql -y
3、安装Slowquery并配置
mv slowquery /var/www/html/
cd /var/www/html/slowquery/slowquery_table_schema
导入dbinfo_table_schema.sql和slowquery_table_schema.sql表结构文件到你的运维管理机MySQL里。
mysql -uroot -pmypassword sql_db < ./dbinfo_table_schema.sql
mysql -uroot -pmypassword sql_db < ./slowquery_table_schema.sql
录入你要监控的MySQL主库配置信息
例如:
mysql> INSERT INTO sql_db.dbinfo VALUES (1,‘192.168.148.101’,‘test’,‘admin’,‘123456’,3306);
修改配置文件soar_con.php,将里面的配置改成你的运维管理机MySQL的地址(用户权限最好是管理员)
cd /var/www/html/slowquery/
vi soar_con.php
<?php
//-test-dsn soar测试环境,用来分析SQL使用
$test_user='root';
$test_pwd='mypassword';
$test_ip='192.168.148.101';
$test_port='3306';
$test_db='test';
?>
修改配置文件config.php,将里面的配置改成你的运维管理机MySQL的地址(用户权限最好是管理员)
vi config.php
<?php
//将里面的配置改成你的运维管理机MySQL的地址
$con = mysqli_connect("192.168.148.101","root","mypassword","sql_db","3306") or die("数据库链接错误".mysqli_connect_error());
mysqli_query($con,"set names utf8");
?>
vi /etc/httpd/conf/httpd.conf
找到DirectoryIndex index.html的位置,在其后面添加index.php,保存退出
service httpd restart
4、导入慢查询日志
进入到slowquery/client_agent_script目录下,把slowquery_analysis.sh脚本拷贝到生产MySQL主库上做慢日志分析推送,并修改里面的配置信息
定时任务(10分钟一次)
cd /var/www/html/slowquery/client_agent_script
vi slowquery_analysis.sh
#!/bin/bash
#改成你的运维管理机MySQL地址(用户权限最好是管理员)
slowquery_db_host="192.168.148.101"
slowquery_db_port="3306"
slowquery_db_user="root"
slowquery_db_password="mypassword"
slowquery_db_database="sql_db"
#改成你的生产MySQL主库地址(用户权限最好是管理员)
mysql_client="/usr/local/mysql/bin/mysql"
mysql_host="192.168.148.101"
mysql_port="3306"
mysql_user="root"
mysql_password="mypassword"
#改成你的生产MySQL主库慢查询目录和慢查询执行时间(单位秒)
slowquery_dir="/data/mysql/data/slow.log/"
slowquery_long_time=2
slowquery_file=`$mysql_client -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -e "show variables like 'slow_query_log_file'"|grep log|awk '{print $2}'`
pt_query_digest="/root/percona-toolkit-3.0.12/bin/pt-query-digest"
#改成你的生产MySQL主库server_id
mysql_server_id=148101
#collect mysql slowquery log into slowquery database
$pt_query_digest --user=$slowquery_db_user --password=$slowquery_db_password --port=$slowquery_db_port --review h=$slowquery_db_host,D=$slowquery_db_database,t=mysql_slow_query_review --history h=$slowquery_db_host,D=$slowquery_db_database,t=mysql_slow_query_review_history --no-report --limit=100% --filter=" \$event->{add_column} = length(\$event->{arg}) and \$event->{serverid}=$mysql_server_id " $slowquery_file > /tmp/slowquery_analysis.log
##### set a new slow query log ###########
tmp_log=`$mysql_client -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -e "select concat('$slowquery_dir','slowquery_',date_format(now(),'%Y%m%d%H'),'.log');"|grep log|sed -n -e '2p'`
#config mysql slowquery
$mysql_client -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -e "set global slow_query_log=1;set global long_query_time=$slowquery_long_time;"
$mysql_client -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -e "set global slow_query_log_file = '$tmp_log'; "
#delete log before 7 days
cd $slowquery_dir
/usr/bin/find ./ -name 'slowquery_*' -mtime +7|xargs rm -f ;
####END####
crontab -e
*/10 * * * * /bin/bash /var/www/html/slowquery/client_agent_script/slowquery_analysis.sh > /dev/null 2>&1
5、访问界面,查看慢查询
打开浏览器访问http://192.168.148.101/slowquery/slowquery.php#reloaded
6、配置邮件报警
cd /var/www/html/slowquery/alarm_mail
vi sendmail.php
<?php
$get_mail_content = get_include_contents('get_top100_slowsql.php');
function get_include_contents($filename) {
if (is_file($filename)) {
ob_start();
include $filename;
$contents = ob_get_contents();
ob_end_clean();
return $contents;
}
return false;
}
$smtpserver = "smtp.126.com";//SMTP服务器
$smtpserverport = 25;//SMTP服务器端口
$smtpusermail = "test@126.com";//SMTP服务器的用户邮箱
$smtpemailto = 'test@126.com';//发送给谁
$smtpuser = "test@126.com";//SMTP服务器的用户帐号,注:部分邮箱只需@前面的用户名
$smtppass = "123456";//SMTP服务器的授权码
$mailtitle='【告警】慢查询报警推送TOP100条,请及时优化.';
$mailcontent='下面的慢查询语句或许会影响到数据库的稳定性和健康性,请您在收到此邮件后及时优化语句或代码。数据库的稳定性需要大家的共同努力,感谢您的配合!<br><br>' .$get_mail_content .'<br><br>该邮件由slowquery系统自动发出,请勿回复,
语句详细执行情况请登录<a href="http://xxxxx">slowquery系统查看.<br><br>';
system("./sendEmail -f $smtpusermail -t $smtpemailto -s $smtpserver:$smtpserverport -u '$mailtitle' -o message-charset=utf8 -o message-content-type=html -m '$mailcontent' -xu $smtpusermail -xp '$smtppass'");
?>