您的位置:首页 > 数据库 > MySQL

MySQL 慢查询日志的开启 与 分析 mysqldumpshow   and mysqlsla

2016-11-02 14:31 826 查看
配置文件开启慢日志功能:

vi /etc/my.cnf

#slow_query_log
slow-query-log = ON
slow-query-log-file = /home/mysql/slow-queries.log
long_query_time = 2 (超过2秒的SQL会被记录下来)
log-queries-not-using-indexes (log下来没有使用索引的query,可以根据情况决定是否开启)
log-slow-admin-statements

命令行开启慢查询日志功能:

首先查看log_output参数,确认日志信息输出到操作系统文件还是数据库的表中:
mysql> show variables like 'log_output';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output | FILE |
+---------------+-------+
1 row in set (0.00 sec)
mysql>
通过上面的结果可以发现,log_output的值为“FILE”,证明是输出到日志文件,
如果值为“TABLE”则将日志信息输出到默认“mysql”数据库中的相应日志表中(具体为:mysql.slow_log),
该表的默认引擎为CSV。

开启慢查询日志:
set global slow_query_log=on;

设置慢查询的阀值为4秒,超过2秒的查询都将记录到慢查询日志中:
set global long_query_time=2;

设置慢查询日志的名称和存储位置:
set global slow_query_log_file="home/mysql_slow_query.log";

其它可选的配置:
set global log_queries_not_using_indexes = true;
通过这个配置,可以将所有没有使用到索引的sql语句都记录到慢查询日志中
(即使执行时间小于long_query_time所指定的值!)。

查询出现慢查询次数的累计值(值由0变为1):
mysql> show global status like 'Slow_queries';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Slow_queries | 1 |
+---------------+-------+
1 row in set (0.00 sec)
mysql>

======================================

日志分析:

截取日志:

sed -n '/# Time: 161102 1:03:39/,/end/p' slow-queries.log > show.log

然后用mysqldumpshow命令取出耗时最长的前10条慢SQL进行分析。

mysqldumpshow -s t -t 10 slow.log

mysqldumpslow -s c -t 20 slow.log
mysqldumpslow -s r -t 20 slow.log

主要功能是, 统计不同慢sql的
出现次数(Count),
执行最长时间(Time),
累计总耗费时间(Time),
等待锁的时间(Lock),
发送给客户端的行总数(Rows),
扫描的行总数(Rows),

==========================

hackmysql.com推出的一款MySQL的日志分析工具mysqlsla

mysqlsla的安装与使用

wget http://hackmysql.com/scripts/mysqlsla-2.03.tar.gz tar -zxvf mysqlsla-2.03.tar.gz
perl Makefile.PL //执行perl脚本检查包依赖关系
make && make install

语法:
Slow log: mysqlsla -lt slow slow.log
General log: mysqlsla -lt general general.log
Binary log: mysqlbinlog bin.log | mysqlsla -lt binary -

mysqlsla -lt slow /home/show.log | more

mysqlsla -lt show /home/show.log

统计慢查询文件为dowload_server1-slow.log的所有select的慢查询sql,并显示执行时间最长的10条sql,并写到sql_time.sql中去
mysqlsla -lt slow -sf "+select" -top 10 dowload_server1-slow.log >test_time.log

统计慢查询文件为dowload_server1-slow.log的数据库为ultraxsmutf8的所有select和update的慢查询sql,并查询次数最多的100条sql,并写到sql_num.sql中去

mysqlsla -lt slow -sf "+select,update" -top 100 -sort c_sum -db ultraxsmutf8 dowload_server1

格式说明如下:
总查询次数 (queries total), 去重后的sql数量 (unique)
输出报表的内容排序(sorted by)
最重大的慢sql统计信息, 包括 平均执行时间, 等待锁时间, 结果行的总数, 扫描的行总数.
Count, sql的执行次数及占总的slow log数量的百分比.
Time, 执行时间, 包括总时间, 平均时间, 最小, 最大时间, 时间占到总慢sql时间的百分比.
95% of Time, 去除最快和最慢的sql, 覆盖率占95%的sql的执行时间.
Lock Time, 等待锁的时间.
95% of Lock , 95%的慢sql等待锁时间.
Rows sent, 结果行统计数量, 包括平均, 最小, 最大数量.
Rows examined, 扫描的行数量.
Database, 属于哪个数据库
Users, 哪个用户,IP, 占到所有用户执行的sql百分比
Query abstract, 抽象后的sql语句
Query sample, sql语句
除了以上的输出, 官方还提供了很多定制化参数, 是一款不可多得的好工具.

mysqlsla常用参数说明:

1) -log-type (-lt) type logs:
通过这个参数来制定log的类型,主要有slow, general, binary, msl, udl,分析slow log时通过制定为slow.

2) -sort:
制定使用什么参数来对分析结果进行排序,默认是按照t_sum来进行排序。
t_sum:按总时间排序
c_sum:按总次数排序
c_sum_p: sql语句执行次数占总执行次数的百分比。

3) -top:
显示sql的数量,默认是10,表示按规则取排序的前多少条

4) –statement-filter (-sf) [+-][TYPE]:
过滤sql语句的类型,比如select、update、drop.
[TYPE]有SELECT, CREATE, DROP, UPDATE, INSERT,例如"+SELECT,INSERT",不出现的默认是-,即不包括。

5) db:要处理哪个库的日志:

例如,只取backup库的select语句、按c_sum_p排序的前2条记录

mysqlsla -lt slow -sort c_sum_p -sf "+select" -db backup -top 2 /tmp/127_slow.log

使用参数说明
(1). --log-type (-lt) type logs:
通过这个参数来制定log的类型,主要有slow, general, binary, msl, udl,分析slow log时通过制定为slow.
(2). --sort:
制定使用什么参数来对分析结果进行排序,默认是按照t_sum来进行排序。
t_sum按总时间排序, c_sum按总次数排序
(3). --top:
显示sql的数量,默认是10,表示取按规则排序的前多少条
(4). --statement-filter (-sf) [+-][TYPE]:
过滤sql语句的类型,比如select、update、drop. [TYPE]有SELECT, CREATE, DROP, UPDATE, INSERT,例如"+SELECT,INSERT",不出现的默认是-,即不包括。
(5). --databases db:
要处理哪个库的日志:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息