这片博文我们会详细说明MySQL本身的日志,不包含重做日志和undo日志(这两个日志是innodb存储引擎的日志)。

MySQL本身的日志有以下几种(MySQL5.7版本):

  • 错误日志
  • 慢查询日志
  • 通用日志
  • 二进制日志

错误日志

默认情况下,错误日志是无法被禁止;错误日志的位置及日志名使用log_error参数指定,若是没有指定,则默认错误日志名为hostname.err(错误日志是以.err为后缀的)。yum安装的MySQL错误日志默认路径是在/var/log/mysqld.log下的!

在MySQL的官方文档中还介绍了可以把MySQL的错误日志写入到系统日志中,但是如果这样的话,查看会不太方便,不再细说给出官方链接: https://dev.mysql.com/doc/refman/5.7/en/error-log-syslog.html

log_error_verbosity:系统变量控制服务器记录错误日志的详细性,以便将错误,警告和注释信息写入错误日志。其有三个取值,1:仅限错误;2:错误和警告;3:错误,警告和注释,默认数值是3。如果该值大于2,则服务器将记录中止的连接以及新连接尝试的拒绝访问错误。

log_timestamps:系统变量控制写入错误日志(以及常规查询日志和慢速查询日志文件)的消息中时间戳的时区。允许的值为UTC(默认值)和系统(本地系统时区)。

刷新错误日志和重命名:

如果使用flush error logs、flush logs或mysqladmin flush-logs刷新日志,服务器将关闭并重新打开它正在写入的任何错误日志文件。要重命名错误日志文件,请在刷新之前手动执行此操作。刷新日志,然后打开一个具有原始文件名的新文件。

[root@mgt01 mysql]# ll -h mgt01.err                      #当前错误日志
-rw-r----- 1 mysql mysql 2.1M Jan  5 15:05 mgt01.err
[root@mgt01 mysql]# mv mgt01.err mgt01.bak               #更改当前错误日志的名字
[root@mgt01 mysql]# mysqladmin flush-logs                #执行刷新日志操作,就会重新打开一个以原错误日志名命名的新文件。
[root@mgt01 mysql]# ll -h mgt01.err mgt01.bak 
-rw-r----- 1 mysql mysql 2.1M Jan  5 15:06 mgt01.bak
-rw-r----- 1 mysql mysql  489 Jan  5 15:09 mgt01.err

 

慢查询日志

慢查询日志由执行时间超过long_query_time指定的秒数的SQL语句组成,并且要求至少检查min_examined_row_limit行。慢速查询日志可用于查找执行时间较长的查询,因此是优化的候选查询。

开启慢查询日志,可以把sql语句执行时间较长的语句写入慢查询日志中,以便查看。

慢查询日志的参数

在MySQL默认情况下,禁用慢查询日志。若开启慢查询日志可以使用slow_query_log参数,把其设置为1或on。

使用slow_query_log_file指定慢查询日志的文件格式,文件名,文件位置。默认文件在数据库目录下面的,文件名为host-name-slow.log。

long_query_time: 设置慢查询日志的时间限制,默认值是10s,最小值是0.该值可以指定为微妙的分辨率。(MySQL5.7版本)

默认情况下,不记录管理语句,也不记录不使用索引进行查找的语句。

要在慢查询日志中记录管理语句,则启用log_slow_admin_statements系统变量。管理语句包含ALTER TABLE, ANALYZE TABLE, CHECK TABLE, CREATE INDEX, DROP INDEX, OPTIMIZE TABLE,和 REPAIR TABLE。

要在慢查询日志的语句中包含不使用索引进行查询的语句,则使用log_queries_not_using_indexes系统变量。(即使启用了该变量,服务器也不会记录由于表少于两行而不使用索引的查询);开启这个参数后,慢查询日志会比较快的增长,因此引入了log_throttle_queries_not_using_indexes参数,这个参数设定每分钟记录到日志的未使用索引的语句数目,超过这个数目后只记录语句数量和花费的总时间。

log_slow_slave_statements:记录从库上的慢查询语句。

log_output: 参数指定慢查询日志输出到文件或者记录在数据库的表中。

一个实例如下:

slow_query_log=ON
long_query_time=3
slow_query_log_file=                   #不指定,默认是在当前数据库目录下面,以当前主机名命名的hostname-slow.log语句。
log_output=FILE
log_queries_not_using_indexes
mysql> select sleep(5);
+----------+
| sleep(5) |
+----------+
|        0 |
+----------+
1 row in set (5.00 sec)

[root@mgt01 mysql]# mysqldumpslow  mgt01-slow.log       #查看慢查询日志

Reading mysql slow query log from mgt01-slow.log
Count: 1  Time=5.00s (5s)  Lock=0.00s (0s)  Rows=1.0 (1), root[root]@localhost
  select sleep(N)
Usage: mysqldumpslow [ OPTS... ] [ LOGS... ]

Parse and summarize the MySQL slow query log. Options are

  --verbose    verbose
  --debug      debug
  --help       write this text to standard output

  -v           verbose
  -d           debug
  -s ORDER     what to sort by (al, at, ar, c, l, r, t), 'at' is default
                al: average lock time
                ar: average rows sent
                at: average query time
                 c: count
                 l: lock time
                 r: rows sent
                 t: query time  
  -r           reverse the sort order (largest last instead of first)
  -t NUM       just show the top n queries
  -a           don't abstract all numbers to N and strings to 'S'
  -n NUM       abstract numbers with at least n digits within names
  -g PATTERN   grep: only consider stmts that include this string
  -h HOSTNAME  hostname of db server for *-slow.log filename (can be wildcard),
               default is '*', i.e. match all
  -i NAME      name of server instance (if using mysql.server startup script)
  -l           don't subtract lock time from total time
mysqldumpslow的选项

相关文章: