MySQL慢查集中收集处理


本文讨论如何将多台MySQL的慢查日志按日采集到数据库,后期可以根据采集到的数据进行分析和展现。

思路:通过logrotate每日切割慢查日志,历史慢查日志生成名携带日期,pt-query-digest分析前一天慢查,并将结果写入到mysql存储起来。不同数据库主机的慢查采用IP来区分,具体见脚本。

必须工具:

logrotate:用于每日割接增量日志,方便按日采集。

pt-query-digest:用于将慢查日志进行相关分析并存储到远程数据库中。

mysql:用于存储分析后的慢查询数据。

crontab:用户定时运行logrotate和pt-query-digest

步骤:

1,部署logrotate脚本,用于按日切割慢查日志

vi /etc/logrotate.d/mysqlslowlog

/var/lib/mysql/log/mysql-slow.log{
compress
copytruncate
create 666 mysql mysql
daily
dateext
delaycompress
missingok
notifempty
rotate 7
olddir /var/lib/mysql/log/
}

定时运行脚本

1 0 * * * /usr/sbin/logrotate -f /etc/logrotate.d/mysqlslowlog

2,部署pt-toolkits,安装包可从percona官方下载(安装3.0以上版本)

yum -y install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker
yum -y install perl-Time-HiRes perl-DBI perl-DBD-MySQL perl-Digest-MD5
tar zxvf percona-toolkit-3.6.0_x86_64.tar.gz 
mv percona-toolkit-3.6.0/bin/* /usr/bin

3,部署慢查处理脚本

mkdir /opt/script && vi /opt/script/slowlog.sh

#!/bin/sh
# 解析最新归档的慢查日志,并保持到远程数据库
. /etc/profile
. ~/.bash_profile
slow_date=`date +'%Y%m%d'`
addr_localip=`ifconfig eth0 | grep 'inet addr' | cut -d ':' -f2 | cut -d " " -f1`  #用于区分不同机器上的慢查
slowdb_user='xxxx'
slowdb_password='xxxxx'
slowdb_host='存储慢查分析数据的mysql ip'
slowdb_port=3306
slowdb_dbname='slow_query_log'
slowdb_tablesnip='global_query_review'
slowdb_tablehistory='global_query_review_history'
slowlog_file=mysql-slow.log-${slow_date}
slowlog_dir=/var/lib/mysql/log
# 只分析select,update,delete类型的慢查语句,因为这三类会有where条件,并过滤掉备份用户产生的慢查(\$evnet->{user}) ne 'backup'
if [ ! $addr_localip ];then
addr_localip=`ifconfig eth0 | grep -w 'inet' | awk -F " " {'print $2'}`
fi
if [ -f ${slowlog_dir}/${slowlog_file} ];then
pt-query-digest --user=${slowdb_user} --password=${slowdb_password} --review h=${slowdb_host},P=${slowdb_port},D=${slowdb_dbname},t=${slowdb_tablesnip} --history h=${slowdb_host},P=${slowdb_port},D=${slowdb_dbname},t=${slowdb_tablehistory} --no-report --limit=100% --filter=" (\$event->{fingerprint}=~m/^select/i || \$event->{fingerprint}=~m/^delete/i || \$event->{fingerprint}=~m/^update/i) and \$event->{add_column} = length(\$event->{arg}) and \$event->{hostname}=\"${addr_localip}\" and (\$event->{user}) ne 'backup'" ${slowlog_dir}/${slowlog_file}
fi

定时运行脚本(注意开始时间要在logrotate定时脚本执行完成后):

0 2 * * * /bin/sh /opt/script/slowlog.sh

原文链接:,转发请注明来源!