Skip to content

第15章 MySQL日志

🚀 学习目标 | Objective

MySQL 日志记录了 MySQL 数据库日常操作和错误信息。MySQL 有不同类型的日志文件(各自存储了不同类型的日志),从日志当中可以查询到 MySQL 数据库的运行情况、用户操作、错误信息等,可以为 MySQL 管理和优化提供必要的信息。对于MySQL的管理工作而言,这些日志文件是不可缺少的。本章将介绍MySQL各种日志的作用以及日志的管理。

🚀 内容导航 | Navigation

  • 了解什么是 MySQL 日志
  • 掌握二进制日志的用法
  • 掌握错误日志的用法
  • 掌握查询通用日志的方法
  • 掌握慢查询日志的方法
  • 熟练掌握综合案例中日志的操作方法和技巧

🚀 15.1 日志简介

MySQL日志主要分为 4 类,使用这些日志文件,可以查看 MySQL 内部发生的事情。这 4 类日志分别是:

  • 错误日志:记录 MySQL服务的启动、运行或停止MySQL服务时出现的问题。
  • 查询日志:记录建立的客户端连接和执行的语句。
  • 二进制日志记录所有更改数据的语句,可以用于数据复制
  • 慢查询日志:记录所有执行时间超过 long_query time 的所有查询或不使用索引的查询。

默认情况下,所有日志创建于 MySQL 数据目录中。通过刷新日志,可以强制 MySQL关闭和重新打开日志文件(或者在某些情况下切换到一个新的日志)。当执行一个 FLUSH LOGS 语句或执行 MySQLadmin flush-logsMySQLadmin refresh 时,将刷新日志。

如果正使用 MySQL 复制功能,在复制服务器上可以维护更多日志文件,这种日志称为接替日志。

启动日志功能会降低 MySQL数据库的性能。例如,在查询非常频繁的 MySQL 数据库系统中,如果开启了通用查询日志和慢查询日志,MySQL数据库会花费很多时间记录日志。同时,日志会占用大量的磁盘空间。

🚀 15.2 二进制日志

二进制日志主要记录 MySQL 数据库的变化。二进制日志以一种有效的格式,并且是事务安全的方式包含更新日志中可用的所有信息。二进制日志包含了所有更新了数据或者已经潜在更新了数据(例如,没有匹配任何行的一个DELETE)的语句。语句以“事件”的形式保存描述数据更改。

二进制日志还包含关于每个更新数据库的语句的执行时间信息。它不包含没有修改任何数据的语句。如果想要记录所有语句(例如,为了识别有问题的查询),需要使用一般查询日志。

使用二进制日志的主要目的是最大可能地恢复数据库,因为二进制日志包含备份后进行的所有更新。本节将介绍二进制日志相关的内容。

15.2.1 启动和设置二进制日志

默认情况下,二进制日志是关闭的,可以通过修改 MySQL 的配置文件来启动和设置二进制日志。

my.ini中[MySQLd]组下面有几个设置是关于二进制日志的:

ini
log-bin[=path/[filename]]
expire_logs_days = 10
max_binlog_size = 100M

log-bin 定义开启二进制日志;path 表明日志文件所在的目录路径;filename 指定了日志文件的名称,如文件的全名为filename.000001,filename.000002等,除了上述文件之外,还有一个名称为 flename.index 的文件,文件内容为所有日志的清单,可以使用记事本打开该文件。

expire_logs_days 定义了 MySQL 清除过期日志的时间,即二进制日志自动删除的天数。默认值为 0,表示“没有自动删除”。当 MySQL 启动或刷新二进制日志时可能删除该文件。

max_binlog_size定义了单个文件的大小限制,如果二进制日志写入的内容大小超出给定值,日志就会发生滚动(关闭当前文件,重新打开一个新的日志文件)。不能将该变量设置为大于1GB或小于4096B。默认值是1GB。

如果正在使用大的事务,二进制日志文件大小还可能会超过 max_binlog_size 定义的大小。

在 my.ini配置文件中的[MySQLd]组下,添加以下几个参数与参数值:

ini
[mysqld]
log-bin
expire_logs_days = 10
max_binlog_size = 100M

添加完毕之后,关闭并重新启动 MySQL 服务进程,即可打开二进制日志,然后可以通过 SHOW VARIABLES 语句来查询日志设置。

【例15.1】使用 SHOW VARIABLES 语句查询日志设置,执行的语句及结果如下:

sql
mysql> SHOW VARIABLES LIKE 'log_%';
+----------------------------------------+--------------------------+
| Variable_name                          | Value                    |
+----------------------------------------+--------------------------+
| log_bin                                | OFF                      |
| log_bin_basename                       |                          |
| log_bin_index                          |                          |
| log_bin_trust_function_creators        | OFF                      |
| log_bin_use_v1_row_events              | OFF                      |
| log_builtin_as_identified_by_password  | OFF                      |
| log_error                              | /var/log/mysql/error.log |
| log_error_verbosity                    | 3                        |
| log_output                             | FILE                     |
| log_queries_not_using_indexes          | OFF                      |
| log_slave_updates                      | OFF                      |
| log_slow_admin_statements              | OFF                      |
| log_slow_slave_statements              | OFF                      |
| log_statements_unsafe_for_binlog       | ON                       |
| log_syslog                             | OFF                      |
| log_syslog_facility                    | daemon                   |
| log_syslog_include_pid                 | ON                       |
| log_syslog_tag                         |                          |
| log_throttle_queries_not_using_indexes | 0                        |
| log_timestamps                         | UTC                      |
| log_warnings                           | 2                        |
+----------------------------------------+--------------------------+
21 rows in set (0.09 sec)

通过上面的查询结果可以看出,log_bin变量的值为ON,表明二进制日志已经打开。

MySQL重新启动之后,读者可以在自己机器上的 MySQL 数据文件夹下面看到新生成的后缀为.000001和.index的两个文件,文件名称为默认主机名称。例如,在笔者的机器上的文件名称为 Kevin-bin.000001 和 Kevin-bin.index。

如果想改变日志文件的目录和名称,可以对my.ini中的log-bin 参数修改如下:

ini
[mysqld]
log-bin="D:/mysql/log/binlog"

关闭并重新启动 MySQL服务之后,新的二进制日志文件将出现在 D:/mysql/log/ 文件夹下面,名称为binlog.000001和binlog.index。读者可以根据情况灵活设置。

特别提示

数据库文件最好不要与日志文件放在同一个磁盘上,这样,当数据库文件所在的磁盘发生故障时,可以使用日志文件恢复数据。

15.2.2 查看二进制日志

15.2.3 删除二进制日志

15.2.4 使用二进制日志恢复数据库

15.2.5 暂时停止二进制日志功能

15.3 错误日志

15.3.1 启动和设置错误日志

15.3.2 查看错误日志

15.3.3 删除错误日志

15.4 通用查询日志

15.4.1 启动和设置通用查询日志

15.4.2 查看通用查询日志

15.4.3 删除通用查询日志

15.5 慢查询日志

15.5.1 启动和设置慢查询日志

15.5.2 查看慢查询日志

15.5.3 删除慢查询日志

15.6 综合案例——MySQL日志的综合管理

15.7 专家解惑

15.8 经典习题