日志文件
日志文件记录mysql数据库的各种类型活动。常用日志有:错误日志、查询日志、慢查询日志、二进制日志。
错误日志
错误日志文件对mysql的启动、运行、关闭过程进行了记录。
定位错误日志文件位置:
mysql> show variables like 'log_error';
+---------------+--------+
| Variable_name | Value |
+---------------+--------+
| log_error | stderr |
+---------------+--------+
# stderr 代表错误输出;可在my.conf 设置log_error的存贮路径,如log_error = /data/mysql/mysql-error.log
当mysql数据库不能正常启动时,第一个必须查找的文件就是错误日志文件,该文件记录了出错信息。
慢查询日志
慢查询能为SQL语句的优化带来很好的帮助。
可以设一个阀值,将运行时间超过改制的所有SQL语句都记录到慢查询日志文件中。该阀值可以通过参数long_query_time来设置,默认值
为10,代表10秒。
show VARIABLES like '%long%';
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
SHOW variables like 'log_slow_queries';
配置:
slow_query_log = 1 # 开启慢查询日志
long_query_time = 10 # 阀值时间,默认10秒
slow_query_log_file = /data/mysql/mysql-slow.log # 慢查询日志存贮位置
log-queries-not-using-indexes = on # 记录没有使用索引的query
show VARIABLES like '%slow_query%';
+---------------------+----------------------------------+
| Variable_name | Value |
+---------------------+----------------------------------+
| slow_query_log | ON |
| slow_query_log_file | /var/lib/mysql/msmaster-slow.log |
注意两点:
- 设置阀值后,mysql会记录运行时间超过该值的所有SQl语句,但对于运行时间正好等于阀值的情况并不会记录。即源代码里是判断大于long_query_time,而非大于等于。
- log-queries-not-using-indexes 记录没有使用索引的query
mysqldumpslow
随着mysql运行时间累积,慢查询日志文件会越来越大,此时分析文件就显得不容易了。mysql提供mysqldumpslow命令:
$ /usr/bin/mysqldumpslow /var/lib/mysql/msmaster-slow.log
Reading mysql slow query log from /var/lib/mysql/msmaster-slow.log
Count: 1 Time=0.00s (0s) Lock=0.00s (0s) Rows=0.0 (0), 0users@0hosts
# -s,排序,c,t,l,r以及ac,at,al,ar分别是按照query次数,时间,lock时间,返回记录排序。加a就是倒序。
# -t,top n,跟上数字就是算出top多少条
# -g,跟正则表达式。
$ /usr/bin/mysqldumpslow -s al -n 10 /var/lib/mysql/msmaster-slow.log; # 查询锁定最长的10条sql语句;
mysql5.1开始可以将慢查询的日志记录放入一张表中,查询更加直观。慢查询表在mysql中名为slow_log。
mysql> SHOW CREATE TABLE mysql.slow_log;
*************************** 1. row ***************************
Create Table: CREATE TABLE `slow_log` (
`start_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
`user_host` mediumtext NOT NULL,
`query_time` time(6) NOT NULL,
`lock_time` time(6) NOT NULL,
`rows_sent` int(11) NOT NULL,
`rows_examined` int(11) NOT NULL,
`db` varchar(512) NOT NULL,
`last_insert_id` int(11) NOT NULL,
`insert_id` int(11) NOT NULL,
`server_id` int(10) unsigned NOT NULL,
`sql_text` mediumblob NOT NULL,
`thread_id` bigint(21) unsigned NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log'
参数log_output指定慢查询输出格式,默认FILE,可以修改为TABLE,然后就可以查询slow_log表了。
mysql> show variables like 'log_output';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output | FILE |
+---------------+-------+
1 row in set (0.00 sec)
查询日志
查询日志记录所有对mysql数据库请求的信息,不论这些请求是否得到正确的执行。默认文件名:主机名.log。
查询日志甚至记录了对access denied的请求。从mysql5.1开始,可以将查询日志的记录放入mysql库中的general_log表中,用法与slow_log一样。
二进制日志
二进制日志记录了对数据库执行更改的所有操作,不包括select和show操作。二进制还包含了执行数据库更改操作的时间和执行时间等信息。
主要作用:
- 恢复:某些数据的恢复需要二进制日志。
- 复制
通过配置参数log-bin[=name]启动二进制日志。如果不指定name,默认以主机名,后缀为二进制日志额序列号,所在路径为数据库所在目录(datadir);
mysql> show variables like 'datadir';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| datadir | /var/lib/mysql/ |
+---------------+-----------------+