MySQL高级篇五 日志分析
文章目录
一、慢查询日志
1.1、简介
- MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。
- 具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为10,意思是运行10秒以上的语句。
- 由他来查看哪些SQL超出了我们的最大忍耐时间值,比如一条sql执行超过5秒钟,我们就算慢SQL,希望能收集超过5秒的sql,
结合之前explain进行全面分析
。
1.2、使用
说明:
默认情况下,MySQL数据库没有开启慢查询日志,需要我们手动来设置这个参数。
当然,如果不是调优需要的话,一般不建议启动该参数,因为开启慢查询日志会或多或少带来一定的性能影响。慢查询日志支持将日志记录写入文件
1.2.1、查看是否开启
- 默认情况下slow_query_log的值为OFF,表示慢查询日志是禁用的,
- 可以通过设置slow_query_log的值来开启
查看是否开启(默认 OFF
)
SHOW VARIABLES LIKE '%slow_query_log%';
1.2.2、如何开启慢日志功能(临时)
01 开启命令:
set global slow_query_log=1;
使用set global slow_query_log=1开启了慢查询日志
只对当前数据库生效
如果MySQL重启后则会失效
。
02 设定超时时间:(全局变量设置,对当前连接不影响
)
# 设置超时时间为1秒,sql执行超过1秒就会被捕获
set global long_query_time=1
03 对当前连接立刻生效
# 设置超时时间为1秒,sql执行超过1秒就会被捕获
set session long_query_time=1.0
1.2.3、如果要永久生效,就必须修改配置文件my.cnf(其它系统变量也是如此)
- 关于慢查询的参数slow_query_log_file ,它指定慢查询日志文件的存放路径,
系统默认会给一个缺省的文件host_name-slow.log(如果没有指定参数slow_query_log_file的话)
- 说白点就是你没取文件名默认就是host_name-slow.log
修改my.cnf文件,[mysqld]下增加或修改参数
#开启慢日志功能
slow_query_log =1
# 指定慢日志数据记录的文件
slow_query_log_file=/var/lib/mysql/xxx.log
然后重启MySQL服务器。
1.2.4、什么数据会被记录
- 我们设置超时时间为2秒的话
- 如果sql执行时间
超过
2秒就会被记录下来 - 等于或者小于超时时间就不会被记录
1.2.5、归纳使用
01 查看当前多少秒算慢
SHOW VARIABLES LIKE 'long_query_time%';
02 设置慢的阙值时间
set global long_query_time=1
这边的问题:为什么设置后看不出变化?
- 方法一:需要重新连接或新开一个会话才能看到修改值。 SHOW VARIABLES LIKE ‘long_query_time%’;
- 方法二:或者通过set session long_query_time=1来改变当前session变量;
03 记录慢SQL并后续分析
实验一条慢sql
跟踪日志信息
04 查询当前系统中有多少条慢查询记录
show global status like '%Slow_queries%';
1.3、使用【mysqld】下配置:
全局配置,不是很推荐,建议采用临时的
# 开启慢日志功能
slow_query_log=1;
# 慢日志的文件,不指定的话,系统会默认生成一个
slow_query_log_file=/var/lib/mysql/xxxx.log
# 设置超时时间
long_query_time=3;
#log_output='FILE'表示将日志存入文件,默认值是'FILE' log_output='TABLE'表示将日志存入数据库,这样日志信息就会被写入到mysql.slow_log表中.
log_output=FILE
二、日志分析工具mysqldumpslow
2.1、查看mysqldumpslow的帮助信息
mysqldumpslow --help
参数说明:
- s: 是表示按照何种方式排序;
- c: 访问次数
- l: 锁定时间
- r: 返回记录
- t: 查询行数
- al:平均锁定时间
- ar:平均返回记录数
- at:平均查询时间
- t:即为返回前面多少条的数据
- g:后边搭配一个正则匹配模式,大小写不敏感的
2.2、常用的4种
01 得到返回记录集最多的10个SQL
mysqldumpslow -s r -t 10 /var/lib/mysql/xxx.log
02 得到访问次数最多的10个SQL
mysqldumpslow -s c -t 10 /var/lib/mysql/atguigu-slow.log
03 得到按照时间排序的前10条里面含有左连接的查询语句
mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/xxx.log
04 另外建议在使用这些命令时结合 | 和more 使用 ,否则有可能出现爆屏情况(数据过多,刷刷刷的那种)
mysqldumpslow -s r -t 10 /var/lib/mysql/atguigu-slow.log | more
三、Show Profile介绍
3.1、说明:
- mysql提供可以用来分析当前会话中语句执行的资源消耗情况。
- 可以用于SQL的调优的测量
- 默认情况下,参数处于关闭状态,并保存最近15次的运行结果
3.2、使用流程:
01 是否支持,看看当前的mysql版本是否支持
# 默认是关闭,默认是OFF
Show variables like 'profiling';
02 开启功能,默认是关闭,使用前需要开启
#查看 默认是OFF
show variables like 'profiling';
# 开启功能 ON
set profiling=1;
03 有SQL在运行, Show Profile就会帮我们分析
04 查看结果
#查看全部
show profiles;
04 查看结果之指定sql(用Query_ID)
# 号码是Query_ID
show profile cpu,block io for query 号码;
#例如:
show profile cpu,block io for query 9;
例如:
04 参数说明:
参数 | 说明 |
---|---|
ALL | 显示所有的开销信息 |
BLOCK IO | 显示块IO相关开销 |
CONTEXT SWITCHES | 上下文切换相关开销 |
CPU | 显示CPU相关开销信息 |
MEMORY | 显示内存相关开销信息 |
PAGE FAULTS | 显示页面错误相关开销信息 |
SOURCE | 显示和Source_function,Source_file,Source_line相关的开销信息 |
SWAPS | 显示交换次数相关开销的信息 |
3.3、出现的参数说明:
converting HEAP to MyISAM
⇒ 查询结果太大,内存都不够用了往磁盘上搬了。Creating tmp table
⇒ 是创建临时表很损耗性能(先拷贝数据到临时表,用完再删除)Copying to tmp table on disk
⇒ 把内存中临时表复制到磁盘,危险!!!- locked 数据库锁的因素
四、全局查询日志
尽量不要在生产环境开启这个功能,每条sql都记录起来,超级损耗性能
4.1、配置启用(方式一)
在mysql的my.cnf中,设置如下:
#开启
general_log=1
# 记录日志文件的路径
general_log_file=/path/logfile
#输出格式
log_output=FILE
4.2、编码启用(方式二)
# 1启动
set global general_log=1;
# 2存入表中 。全局日志可以存放到日志文件中,也可以存放到Mysql系统表中。存放到日志中性能更好一些,存储到表中
set global log_output='TABLE';
# 3查看 。此后,你所编写的sql语句,将会记录到mysql库里的general_log表,可以用下面的命令查看
select * from mysql.general_log;
五、批量插入数据案例
…
…
待补充
…