MySQL 日志:常见的日志都有什么用?
MySQL 日志的内容非常重要,面试中经常会被问到。同时,掌握日志相关的知识也有利于我们理解 MySQL 底层原理,必要时帮助我们排查解决问题。
MySQL 中常见的日志类型主要有下面几类(针对的是 InnoDB 存储引擎):
- 错误日志(error log) :对 MySQL 的启动、运行、关闭过程进行了记录。
- 二进制日志(binary log,binlog) :主要记录的是更改数据库数据的 SQL 语句。
- 一般查询日志(general query log) :已建立连接的客户端发送给 MySQL 服务器的所有 SQL 记录,因为 SQL 的量比较大,默认是不开启的,也不建议开启。
- 慢查询日志(slow query log) :执行时间超过
long_query_time
秒钟的查询,解决 SQL 慢查询问题的时候会用到。 - 事务日志(redo log 和 undo log) :redo log 是重做日志,undo log 是回滚日志。
- 中继日志(relay log) :relay log 是复制过程中产生的日志,很多方面都跟 binary log 差不多。不过,relay log 针对的是主从复制中的从库。
- DDL 日志(metadata log) :DDL 语句执行的元数据操作。
二进制日志(binlog)和事务日志(redo log 和 undo log)比较重要,需要我们重点关注。
slow query log(慢查询日志)
慢查询日志有什么用?
慢查询日志记录了执行时间超过 long_query_time
(默认是 10s,通常设置为1s)的所有查询语句,在解决 SQL 慢查询(SQL 执行时间过长)问题的时候经常会用到。
找到慢 SQL 是优化 SQL 语句性能的第一步,然后再用EXPLAIN
命令可以对慢 SQL 进行分析,获 取执行计划的相关信息。
你可以通过 show variables like "slow_query_log";
命令来查看慢查询日志是否开启,默认是关闭的。
mysql> show variables like 'slow_query_log';
+----------------+-------+
| Variable_name | Value |
+----------------+-------+
| slow_query_log | OFF |
+----------------+-------+
你可以通过 SET GLOBAL slow_query_log=ON
命令将其开启。
long_query_time
参数定义了一个查询消耗多长时间才可以被定义为慢查询,默认是 10s,通过 SHOW VARIABLES LIKE '%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)
并且,我们还可以对 long_query_time
参数进行修改:
SET GLOBAL long_query_time=1
在实际项目中,慢查询日志可能会比较大,直接分析的话不太方便,我们可以借助 MySQL 官方的慢查询分析调优工具 mysqldumpslow。
如何查询当前慢查询语句的个数?
在MySQL中有一个变量专门记录当前慢查询语句的个数,可以通过 show global status like '%Slow_queries%';
命令查看。
mysql> show global status like '%Slow_queries%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Slow_queries | 10 |
+---------------+-------+