1.开启慢查询日志
vim /etc/my.cnf
slow-query-log = On #开启慢查询
slow_query_log_file = /data/mysql/mysql_slow_query.log #定义慢查询日志的路径
log_output = FILE #设置日志输出到文件,默认为输出到table
long_query_time = 5 #定义查过多少秒的查询算是慢查询
log_queries_not_using_indexes = ON #记录下没有使用索引的query
2.查询慢查询日志是否开启
set global long_query_time=5; //设置成5秒,
set slow_query_log='ON'; //加上global
set global slow_query_log='ON'; //启用慢查询
set global log_output = 'file'; //日志输出到文件
set global slow_query_log_file='/data/mysql/mysql_slow_query.log'; //日志输出路径
show variables like "%slow%"; //查看是当前会话的变量值,没生效需要断开重新连接
show global variables like 'long_query_time'; //直接查看
show variables like "%slow%"; // 查看是否已经打开了慢查询
结果分析:
slow_query_log 的值为ON 为开启慢查询日志,off表示关闭慢查询日志
slow_query_log_file 的值是记录的慢查询日志到文件中(默认为主机名.log)
slow_launch_time 是thread create的一个阈值,thread create的时间超过了这个值,这变量slow_launch_time的值加1.
long_query_time 指定了慢查询的阈值,即执行语句的时间若超过这个值则为慢查询语句
log_queries_not_using_indexes 如果该值是ON,则会记录所有没有利用索引来进行查询的语句,前提是slow_query_log 的值也是ON,否则,不会奏效
3.慢查询日志分析
mysqldumpslow能将相同的慢SQL归类,并统计出相同的SQL执行的次数,每次执行耗时多久、总耗时,每次返回的行数、总行数,以及客户端连接信息等。
mysqldumpslow语法说明:
-s ,按照什么方式起来排序。默认at,也就是按照平均查询时间来排序。都是按照倒序排列。c、t、l、r分别是按照记录次数、时间、查询时间、返回的记录数来排序,ac、at、al、ar,表示相应的倒叙;
al: average lock time 平均锁定时间
ar: average rows sent 平均返回行数
at: average query time 平均查询时间
c: count 总执行次数
l: lock time 总锁定时间
r: rows sent 总返回行数
t: query time 总查询时间
-t ,show the top n queries,显示前多少名的记录
-a ,默认不开启这个选项。mysqldumpslow将相似的SQL的值(字符串或者数字)替换为N,开启该选项,则显示真实值。不开启该选项,有点类似于Oracle的绑定变量的记录。
-g ,类似于grep命令,过滤出需要的信息。如,只查询A表的慢查询记录。
-l ,总时间中包含锁定时间
4.使用示例
// 返回记录最多的十个查询
mysqldumpslow -s r -t 10 slow.log
// 查询10条执行时间最慢的sql语句
mysqldumpslow -s t -t 10 slow.log
// 平均锁定时间最长的前10条SQL
mysqldumpslow -s al -t 10 slow.log
// 执行次数最多的前10条SQL
mysqldumpslow -s c -t 10 slow.log
// 平均执行时间最长的前10条SQL
mysqldumpslow -s at -t 10 slow.log
// 得到按照时间排序的前10条里面含有左连接的SQL:
mysqldumpslow -s t -t 10 -g "left join" slow.log
5.慢查询语句
select * from mysql.slow_log; #查询所有慢查询
select * from mysql.slow_log order by start_time desc limit 10; #查询最新的10条慢查询
6.日志内容
-- 执行SQL时间
# Time: 2019-12-31T05:54:23.893042Z
-- 执行SQL的主机信息
# User@Host: root[root] @ localhost [] Id: 40
-- SQL的执行信息
# Query_time: 4.013664 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 1
-- SQL执行时间
SET timestamp=1577771659;
-- SQL内容
select sleep(4);
7.阿里云RDS慢查询分析
8.binlog查看
1.查看bin log日志名
show binary logs;
2.下载binlog
阿里云的RDS =》备份恢复 =》日志备份,下载对应时间的binlog
3.解密binlog文件
mysqlbinlog -vv --base64-output=decode-rows ../data/mysql-bin.00218 > d:/tt.txt
sed -n '/23:28:32/,/23:33:32/p' myslq-bin-1027.log > sed.log