MySQL的7种日志(五):SlowLog

0.前言

续:

1.什么是Slowlog

SlowLog的超时时间long_query_time

# @long_query_time :我们设置了慢日志记录时间
# sqltime :mysql判断一个sql的执行用时
# cur_utime :这条sql从开始执行到结束,实际消耗的时间
# utime_after_lock:锁等待消耗时间
sqltime = cur_utim- utime_after_lock
if sqltime>=@long_query_time:
  recordIt() #写入慢日志
else:
  pass

2.MySQL慢日志的常用操作

开启

[mysqld]
slow_query_log = 1
slow_query_log_file = /data/mysql3306/mysql-slow.log #指定了慢查询日志的输出文件路径;
long_query_time = 1 # 超过多长时间(秒)的SQL 被记录

修改

set global long_query_time=0.5 #500毫秒


# 同样的以下参数值得被关注
- log_output
# 设置慢日志输出到哪里,正常都会放到file里,极少数情况下,可以改成table ,此时的慢日志会被记录到该MySQL实例的mysql.slow_log表中(很方便,但是线上别这样用,这个很容易成为那根稻草)

- log_queries_not_using_indexes
# 启用该变量,会记录期望检索所有行的查询语句,也就是说做表全扫描。使用索引的查询也会被记录。例如,使用完整索引扫描的查询使用索引,但会记录日志,因为索引不会限制行数。默认值是false。

- min_examined_row_limit
参数规定了只有当检索的行数超过了参数值的sql语句才会被记录到慢sql日志文件中,默认值是0,没有限制。可以和上一个参数log_queries_not_using_indexes搭配使用,可以避免记录一些访问小表的查询。

- log_throttle_queries_not_using_indexes
# 该参数限制每分钟记录到慢查询日志中的查询语句数量,默认值是0,不限制。

- log_slow_extra
- 参数log_slow_extra从MySQL 8.0.14开始可用,当启用时,将记录与慢sql相关的额外信息,如状态参数Handler_%。参数默认值为off,建议打开,将参数设置为on。

查看

tail /data/mysql3306/mysql-slow.log 

3.SlowLog的分析工具

方式一:自研的实时慢日志分析工作

方式二:利用第三方工具

pt-query-digest

#使用
pt-query-digest [OPTIONS] [DSN]

pt-query-digest --help
常用参数:
--create-review-table :当使用--review参数把分析结果输出到表中时,如果没有表就自动创建。
--create-history-table:当使用--history参数把分析结果输出到表中时,如果没有表就自动创建。
--filter :  对输入的慢查询按指定的字符串进行匹配过滤后再进行分析
--limit:限制输出结果百分比或数量,默认值是20,即将最慢的20条语句输出,如果是95%则按总响应时间占比从大到小排序,输出到总和达到95%位置截止。
--log=s :指定输出的日志文件
--history 将分析结果保存到表中,分析结果比较详细,下次再使用--history时,如果存在相同的语句,且查询所在的时间区间和历史表
           中的不同,则会记录到数据表中,可以通过查询同一CHECKSUM来比较某类型查询的历史变化。
--review:将分析结果保存到表中,这个分析只是对查询条件进行参数化,一个类型的查询一条记录,比较简单。
           当下次使用--review时,如果存在相同的语句分析,就不会记录到数据表中。
--output 分析结果输出类型,值可以是report(标准分析报告)、slowlog(Mysql slow log)、json、json-anon,一般使用report,以便于阅读。
--since:从该指定日期开始分析。
--until:截止时间,配合—since可以分析一段时间内的慢查询。

mysqldumpslow 自带的分析工具

mysqldumpslow   /data/mysql3306/mysql-slow.log
主要功能是, 统计不同慢sql的
出现次数(Count),
执行最长时间(Time),
累计总耗费时间(Time),
等待锁的时间(Lock),
发送给客户端的行总数(Rows),
扫描的行总数(Rows),
用户以及sql语句本身

mysqlsla 分析慢查询日志

#查询记录最多的10条,可以指定具体的数据库 
mysqlsla -lt slow -sort t_sum   -sf  "+select,update,INSERT" -db dboop  -top 10  /data/mysql3306/mysql-slow.log

#查询记录最多的20个sql语句
mysqlsla -lt slow --sort t_sum --top 20  /data/mysql3306/mysql-slow.log

#统计所有select的慢查询sql,并显示执行时间最长的100条sql,并写到sql_select.log中去

mysqlsla -lt slow  -sf "+select" -top 100 /data/mysql3306/mysql-slow.log

#统计dboop库中所有select和update的慢查询sql,并查询次数最多的100条sql

mysqlsla -lt slow  -sf "+select,update" -top 100 -sort c_sum  -db dboop /data/mysql3306/mysql-slow.log

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语句

方式三:发现有慢查询的时候,登上实例机器,直接看

>> Home

51ak

2024/09/10

Categories: mysql 日志 Tags: 原创 精品

《数据库工作笔记》公众号
扫描上面的二维码,关注我的《数据库工作笔记》公众号