Appearance
第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-logs
或 MySQLadmin 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。读者可以根据情况灵活设置。
特别提示
数据库文件最好不要与日志文件放在同一个磁盘上,这样,当数据库文件所在的磁盘发生故障时,可以使用日志文件恢复数据。