Junhc

岂止于博客

MySQL日志

目录

1. 刷新日志
mysql> flush logs;
shell> mysqladmin flush-logs
shell> mysqladmin refresh
1. 错误日志
mysql> show variables like 'log_error';
+---------------+---------------------+
| Variable_name | Value               |
+---------------+---------------------+
| log_error     | /var/log/mysqld.log |
+---------------+---------------------+
1 row in set (0.00 sec)
2. 一般查询日志

查询日志分为一般查询日志和慢查询日志,它们是通过查询是否超出变量 long_query_time指定时间的值来判定的。在超时时间内完成的查询是一般查询,可以将其记录到一般查询日志中,但是建议关闭这种日志(默认是关闭的),超出时间的查询是慢查询,可以将其记录到慢查询日志中。

long_query_time = 10 # 指定慢查询超时时长,超出此时长的属于慢查询,会记录到慢查询日志中
log_output={TABLE|FILE|NONE}  # 定义一般查询日志和慢查询日志的输出格式,默认为file
general_log=off # 是否启用一般查询日志,为全局变量,必须在global上修改
sql_log_off=off # 在session级别控制是否启用一般查询日志,默认为off
general_log_file=/var/lib/mysql/iZ943gt64e4Z.log  # 默认是库文件路径下主机名加上.log

TABLE表示记录日志到表中,FILE表示记录日志到文件中,NONE表示不记录日志。只要这里指定为NONE,即使开启了一般查询日志和慢查询日志,也都不会有任何记录。

mysql> set @@global.general_log=1;
Query OK, 0 rows affected (0.01 sec)

mysql> show variables like 'general_log';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| general_log   | ON    |
+---------------+-------+
1 row in set (0.00 sec)
3. 慢查询日志

查询超出变量long_query_time指定时间值的为慢查询。但是查询获取锁(包括锁等待)的时间不计入查询时间内。
MySQL记录慢查询日志是在查询执行完毕且已经完全释放锁之后才记录的,因此慢查询日志记录的顺序和执行的SQL查询语句顺序可能会不一致(例如语句1先执行,查询速度慢,语句2后执行,但查询速度快,则语句2先记录)。

long_query_time=10 # 指定慢查询超时时长(默认10秒),超出此时长的属于慢查询
log_output={TABLE|FILE|NONE} # 定义一般查询日志和慢查询日志的输出格式,默认为file
log_slow_queries={yes|no}    # 是否启用慢查询日志,默认不启用
slow_query_log={1|ON|0|OFF}  # 也是是否启用慢查询日志,此变量和log_slow_queries修改一个另一个同时变化
slow_query_log_file=/mydata/data/hostname-slow.log  #默认路径为库文件目录下主机名加上-slow.log
log_queries_not_using_indexes=OFF # 查询没有使用索引的时候是否也记入慢查询日志
mysql> set @@global.slow_query_log=1;
Query OK, 0 rows affected (0.01 sec)

mysql> show variables like 'slow_query_log';
+----------------+-------+
| Variable_name  | Value |
+----------------+-------+
| slow_query_log | ON    |
+----------------+-------+
1 row in set (0.00 sec)
# mysqldumpslow --help
-d           debug
-v           verbose:显示详细信息
-t NUM       just show the top n queries:仅显示前n条查询
-a           don't abstract all numbers to N and strings to 'S':归类时不要使用N替换数字,S替换字符串
-g PATTERN   grep: only consider stmts that include this string:通过grep来筛选select语句。
4. 二进制日志

在MySQL 5.1之前,MySQL只有一种基于语句statement形式的日志记录格式。即将所有的相关操作记录为SQL语句形式。但是这样的记录方式对某些特殊信息无法同步记录,例如uuid,now()等这样动态变化的值。

从MySQL 5.1开始,MySQL支持statementrowmixed三种形式的记录方式。row形式是基于行来记录,也就是将相关行的每一列的值都在日志中保存下来,这样的结果会导致日志文件变得非常大,但是保证了动态值的确定性。还有一种mixed形式,表示如何记录日志由MySQL自己来决定。

mixed模式下默认会采用statement的方式记录,只有以下几种情况会采用row的形式来记录日志。

  1. 表的存储引擎为INNODB,这时对表的DML操作都会以row的格式记录。
  2. 使用了uuid()、user()、current_user()、found_rows()、row_count()等不确定函数。但测试发现对now()函数仍会以statement格式记录,而sysdate()函数会以row格式记录。
  3. 使用了insert delay语句。
  4. 使用了临时表。
参考资料