配置文件开启慢日志功能:


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:

要处理哪个库的日志: