mysql 日志文件

1,789 阅读3分钟

这是我参与11月更文挑战的第 7 天,活动详情查看:2021最后一次更文挑战

日志文件记录了影响 mysql 数据库的各种类型活动,mysql 中常见的日志文件主要包括以下 4 种:

  • 错误日志
  • 二进制日志
  • 慢查询日志
  • 查询日志

这些日志文件可以帮助我们对mysql数据库的运行状态进行诊断,从而更好的进行数据库层面的优化。

错误日志

错误日志文件对 mysql 的启动,运行,关闭过程进行了记录。错误日志不仅记录了所有的错误信息,也记录了一些警告信息或者正确的信息。可以通过以下方式 找到错误日志的路径:

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

可以看到错误日志的全路径,这里我本机没有做过调整,所以默认使用的是主机名作为错误日志的文件名。如果你的 mysql 数据库不能正常启动,可以第一时间查找的文件就是错误日志文件,这里可能会记录相关的错误日志,通过这个日志来找到不能正常启动的原因。下面截取部分日志:

2021-05-06T08:57:03.359102Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2021-05-06T08:57:03.439761Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2021-05-06T08:57:03.495740Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '127.0.0.1' port: 33060, socket: /tmp/mysqlx.sock
2021-05-06T08:57:03.521389Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2021-05-06T08:57:03.521511Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
2021-05-06T08:57:03.529529Z 0 [System] [MY-010931] [Server] /opt/homebrew/Cellar/mysql/8.0.23_1/bin/mysqld: ready for connections. Version: '8.0.23'  socket: '/tmp/mysql.sock'  port: 3306  Homebrew.

慢查询日志

long_query_time

mysql 启动时可以设定一个阈值,mysql 会将运行时间超过该值的所有 sql语句都记录到慢查询日志中。如下:

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

mysql> show variables like 'log_slow_queries';
Empty set (0.01 sec)

设置 long_query_time 阈值之后,mysql 数据库会记录运行时间超过该阈值的所有 sql 语句,但是对于时间刚好等于 long_query_time 值的不会被记录。从 mysql 5.1 开始,long_query_time开始以微秒记录 sql 语句运行的时间,在此之前都是用秒作为单位记录的。

log_queries_not_using_indexes

这是另一个和慢查询有关的参数,这个参数表示,如果运行的 sql 语句没有使用索引,则 mysql 数据库同样会将这条 sql 语句记录到慢查询日志文件。

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

log_throttle_queries_not_using_indexes

mysql> show variables like 'log_throttle_queries_not_using_indexes';
+----------------------------------------+-------+
| Variable_name                          | Value |
+----------------------------------------+-------+
| log_throttle_queries_not_using_indexes | 0     |
+----------------------------------------+-------+
1 row in set (0.01 sec)

mysql 5.6.5 版本开始新增了 log_throttle_queries_not_using_indexes 这个参数,用来表示每分钟允许记录到 slow log 的且未使用索引的 sql 语句次数。该值默认是0,表示没有限制。在生产环境,如果没有使用索引,此类 sql 语句会频繁的被记录到 slow log,从而导致 slow log 文件不断增加,因此可以通过配置该值进行控制。