编辑mysql配置文件/etc/my.cnf
,添加如下配置:
[mysqld]
log-error=/alidata/log/mysql/mysql_error.log
注意对于错误日志文件
/alidata/log/mysql/mysql_error.log
要提前创建好,设置为mysql用户,要mysql用户可读写
修改my.cnf
在配置文件my.cnf(一般为/etc/my.cnf)中的 [mysqld] 增加如下参数。
[mysqld]
# 表示是否开启慢查询日志,1开0关
slow_query_log = 1
# 指定慢查询日志路径,需要MySQL对该路径有写权限若没有指定,默认名字为hostname_slow.log
slow_query_log_file = /alidata/log/mysql/mysql_slow_query.log
# 表示查询时间>=1秒才记录日志,默认10s
long_query_time = 1
# 表明记录没有使用索引的 SQL 语句(不建议用)
log_queries_not_using_indexes = 1
重启MySQL服务,即可纪录慢查询日志。
通过如下命令可以检查上述参数配置生效情况。
mysql> show variables like 'slow_query%';
+---------------------+-------------------------------+
| Variable_name | Value |
+---------------------+-------------------------------+
| slow_query_log | ON |
| slow_query_log_file | /var/lib/mysql/slow-query.log |
+---------------------+-------------------------------+
2 rows in set (0.00 sec)
mysql> show variables like 'long_query_time';
+-----------------+----------+
| Variable_name | Value |
+-----------------+----------+
| long_query_time | 1.000000 |
+-----------------+----------+
1 row in set (0.00 sec)
mysqldumpslow
mysqldumpslow是MySQL自带的分析慢查询的工具。该工具是Perl脚本。
常用参数如下。
-s:排序方式,值如下
c:查询次数
t:查询时间
l:锁定时间
r:返回记录
ac:平均查询次数
al:平均锁定时间
ar:平均返回记录书
at:平均查询时间
-t:top N查询
-g:正则表达式
例子
我们执行了多次类似如下的查询。
select * from db_user where name like 'zb%';
select * from db_user where name like 'aaa%';
select * from db_user where name like 'bc%';
...
获取访问次数最多的5个SQL语句
$ mysqldumpslow -s c -t 5 /var/lib/mysql/slow-query.log
按照查询时间排序的top 5的SQL语句
$ mysqldumpslow -s t -t 5 /var/lib/mysql/slow-query.log
按照时间排序且含有'like'的top 5个SQL语句
$ mysqldumpslow -s t -t 3 -g "like" /var/lib/mysql/slow-query.log
默认情况下,MySQL不启动慢查询日志。若要检查慢查询,需要我们手动设置这个参数。一般情况下,若非调优需要,不建议启动该参数,因为开启慢查询日志或多或少会带来一定的性能影响。慢查询日志支持将日志记录写入文件,也支持将日志记录写入数据库表。
一般查询日志又称通用查询日志,是 MySQL 中记录最详细的日志,该日志会记录 mysqld 所有相关操作,当 clients 连接或断开连接时,服务器将信息写入此日志,并记录从 clients 收到的每个 SQL 语句。当你怀疑 client 中的错误并想要确切知道 client 发送给mysqld的内容时,通用查询日志非常有用。
默认情况下,general log 是关闭的,开启通用查询日志会增加很多磁盘 I/O, 所以如非出于调试排错目的,不建议开启通用查询日志。相关参数配置介绍如下:
vim /etc/my.cnf
[mysqld]
#默认值是0,即不开启,可设置为1
general_log = 0
# 指定日志位置及名称
general_log_file = /alidata/log/mysql/mysql_general.log