这片博文我们会详细说明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