MySQL的日志系统


    MySQL的日志是记录和系统相关的一些操作信息,其有不同类型的日志文件(各自存储了不同类型的日志),从它们当中可以查询到MYSQL里都做了些什么,对于MYSQL的管理工作,这些日志文件是不可缺少的,主要包括错误日志、慢查询日志、二进制日志和InnoDB的redo日志等。

一、错误日志(Error Log)


    错误日志,顾名思义,当然就是记录错误信息的日志,不过MySQL的错误日志文件,并不仅仅是记录错误信息,MySQL服务进程启动/关闭的信息也会被记录进来,也不是说什么错误都会记录,只有服务进程运行过程中发生的关键(critical)错误会被记录,另外mysqld进程发现某些表需要自动检查或修复的话,也会抛出相关信息到该日志文件。

在某些操作系统上运行的mysql崩溃时,会将堆栈的跟踪信息(stack trace)抛出到错误日志文件中,这些跟踪信息比较有利于故障排查。

    启用mysqld时附加--log-error参数(或配置log-error系统环境变量),指定错误日志的路径及文件名,如不指定的话,默认文件名为[host_name].err,保存在mysql的data文件夹下。执行FLUSH LOGS命令后,mysql会将当前错误日志文件附加-old保存,而且创建一个新的空错误日志文件(仅限指定--log-error的情况下会自动创建新文件)。--log-warnings参数(或log-warnings系统环境变量)用来控制警告信息是否记录,默认值为1即启用,指定为0时表示禁用。如果指定该参数值大于1,则连接失败的消息也会写入错误日志。

    使用mysqld_safe命令启动mysqld,mysqld_safe会将错误消息写到日志文件或者系统日志,在5.1.20版本之前,mysqld_safe的操作记录到文件;从5.1.20版本开始,mysqld_safe提供了两个新增错误日志选项:--syslog和--skip-syslog。从5.1.21版本开始,默认的不记录日志选项为--skip-syslog,该选项兼容5.1.20版本之前的错误日志行为。要明确指定输出的错误日志文件,就通过mysqld_safe启动服务时附加--log-error[=file_name]参数,如果要使用syslog,则指定--syslog参数。 对于记录到syslog的消息,来自mysqld_safe和mysqld的消息会分别打上"mysqld_safe"或"mysqld"的标签,从5.1.21版本开始,还可以通过--syslog-tag=[tag]的方式指定标签的名称,修改后实际记录的标签形式会变成"mysql_safe-[tag]"和"mysqld-[tag]"。


    如果是使用mysqld_safe命令启动mysqld进程,并且mysqld意外崩溃,则mysqld_safe将尝试重新启动mysqld进程,并且向错误日志中记录"restarted mysqld"信息。

查看错误日志的位置:      


mysql> show variables like 'log_error';
+---------------+----------------------------+
| Variable_name | Value                      |
+---------------+----------------------------+
| log_error     | /var/lib/mysql/sl62-vm.err |
+---------------+----------------------------+
1 row in set (0.00 sec)

也可以在my.cnf配置文件中指定MySQL错误日志的位置和文件名(在[mysqld]项下添加):


# errot log path
log_error=/var/lib/mysql/umt.err

此时再次查看错误日志:


mysql> show variables like 'log_error';
+---------------+------------------------+
| Variable_name | Value                  |
+---------------+------------------------+
| log_error     | /var/lib/mysql/umt.err |
+---------------+------------------------+
1 row in set (0.00 sec)



二、慢查询日志(Slow Query Log)

慢查询日志可以用来找到执行时间长的查询,可以用于优化,通过命令 show variables like 'long_query_time';来查看参数long_query_time的值:

mysql> show variables like 'long_query_time';
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.00 sec)

其中,value = 10.000000代表一个查询所使用的时间超过10秒时将在慢查询日志中被记录下来。可以通过set命令将该值变成所需的时间:

mysql> set long_query_time = 1;
Query OK, 0 rows affected (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)

使用选项--slow_query_log={ON|OFF}来停止或者启动慢查询日志,系统默认是不启动该日志的,可以使用命令show variables like 'log_slow_queries';来查看慢查询日志是否启动:


mysql> show variables like 'log_slow_queries';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| log_slow_queries | OFF   |
+------------------+-------+
1 row in set (0.00 sec)

开启慢查询日志
mysql> set global log_slow_queries = ON;
Query OK, 0 rows affected, 1 warning (0.02 sec)
由于log_slow_queries是全局变量,所以要加上global关键字

再次查询:
mysql> show variables like 'log_slow_queries';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| log_slow_queries | ON    |
+------------------+-------+
1 row in set (0.00 sec)


可以在my.cnf配置文件中使用选项--slow_query_log_file=file_name指定文件位置和文件名称。

    语句执行完并且所有锁释放后记入慢查询日志。记录顺序可以与执行顺序不相同。
    慢查询日志可以用来找到执行时间长的查询语句,并对其进行优化,可以使用mysqldumpslow命令获得日志中显示的查询摘要来处理慢查询日志。
    慢查询日志中,不使用索引的慢查询同使用索引的查询一样记录。通过选项--log-queries-not-using-indexes,可以防止不使用索引的慢查询记入慢查询日志。通过选项--log-slow-admin-statements,可以请求将慢管理语句,例如OPTIMIZE TABLE、ANALYZE TABLE和 ALTER TABLE写入慢查询日志。通过选项--log-slow-slave-statements,可以将复制查询的语句记入慢查询日志。