Appearance
MySQL 日志
1. 错误日志 (Error Log)
错误日志记录了 MySQL 服务启动、运行和关闭过程中发生的错误或警告信息。它是排查问题的首要工具。
相关系统变量:
SQL
SHOW VARIABLES LIKE '%log_error%';配置文件:
INI
[mysqld]
log_error = /path/to/error.log2. 二进制日志 (Binary Log)
二进制日志记录了所有对数据库的 DDL 和 DML 语句(但不包括查询语句),以及这些操作的时间。它主要用于数据恢复和主从复制。
相关系统变量:
SQL
SHOW VARIABLES LIKE '%log_bin%';配置文件:
INI
[mysqld]
server-id = 1 # 主从复制时需要唯一 ID查看日志文件:
SQL
SHOW BINARY LOGS;Note:可以使用
mysqlbinlog工具回放日志来恢复数据。
2.1. 日志格式
二进制日志的格式决定了日志记录的具体方式和内容。MySQL 支持三种主要的二进制日志格式:STATEMENT、ROW 和 MIXED。以下是对这三种格式的详细说明:
2.1.1. ROW(默认)
记录的是每行数据的具体变化。例如,对于 UPDATE users SET age = 25 WHERE id = 1;,日志会记录受影响的行在修改前后的具体值(如 id=1, age=20 变为 id=1, age=25)。
优点:
- 精确记录每一行变化,主从复制一致性高;
- 适合处理非确定性函数或复杂逻辑(如触发器、存储过程);
缺点:
- 日志文件较大,尤其是对大表或批量操作时,因为每行变化都会被记录;
- 可读性较差,难以直接理解具体操作;
2.1.2. STATEMENT
记录的是执行的 SQL 语句本身。例如,执行 UPDATE users SET age = 25 WHERE id = 1; 时,二进制日志中会记录这条完整的 SQL 语句。
优点:
- 日志文件较小,因为只记录语句而非具体的行数据;
- 易于阅读和理解,便于调试;
缺点:
- 某些情况下可能导致主从不一致。例如,使用非确定性函数(如
NOW()或RAND())时,主库和从库执行结果可能不同; - 对于复杂的语句(如包含触发器或存储过程),可能难以准确复制;
2.1.3. MIXED
结合了 STATEMENT 和 ROW 的优点,根据具体情况自动选择日志记录方式。默认情况下使用 STATEMENT 格式,但在某些特定场景(例如非确定性函数或不安全的语句)切换为 ROW 格式。
优点:
- 平衡了日志文件大小和复制一致性;
- 灵活性高,适应多种场景;
缺点:
- 日志行为可能不够直观,难以预测具体记录方式;
Tip:适用于大多数常规场景,尤其是对日志大小和一致性都有一定要求的系统。
2.1.4. 查看和设置格式
查看当前格式:
SQLSHOW VARIABLES LIKE 'binlog_format';设置格式:
INI[mysqld] binlog_format=ROWTip:更改格式可能需要重启 MySQL 服务,并且在主从复制环境中,主从节点的格式需要保持一致。
2.1.5. 选择建议
ROW:适合追求高一致性、对复杂操作支持要求高的场景;STATEMENT:适合日志体积敏感、对一致性要求不高的场景;MIXED:默认推荐,适用于大多数情况,提供灵活性和可靠性;
2.2. 定期清理
查看清理计划:
SQL
SHOW VARIABLES LIKE '%binlog_expire_logs%';设置过期时间:
INI
expire_logs_days = 7 # 保留 7 天手动清理:
SQL
PURGE BINARY LOGS TO 'mysql-bin.000010'; # 删除指定文件之前的日志3. 查询日志 (General Query Log)
查询日志记录了客户端发送给 MySQL 的所有查询语句,包括 SELECT、INSERT 等。适合开发和调试时使用,但生产环境慎用,因为会显著影响性能。
配置文件:
INI
[mysqld]
general_log = 1
general_log_file = /path/to/query.log动态启用:
SQL
SET GLOBAL general_log = 'ON';
SET GLOBAL general_log_file = '/path/to/query.log';检查是否启用:
SQL
SHOW VARIABLES LIKE '%general_log%';4. 慢查询日志 (Slow Query Log)
慢查询日志记录执行时间超过指定阈值的查询,帮助优化数据库性能。
配置文件:
INI
[mysqld]
slow_query_log = 1
slow_query_log_file = /path/to/slow.log
long_query_time = 2 # 记录超过 2 秒的查询
log_queries_not_using_indexes = 1 # 记录未使用索引的查询动态启用:
SQL
SET GLOBAL long_query_time = 2;
SET GLOBAL slow_query_log = 'ON';检查是否启用:
SQL
SHOW VARIABLES LIKE '%slow_query_log%';5. 总结
| 日志类型 | 用途 | 配置参数 | 注意事项 |
|---|---|---|---|
| 错误日志 | 记录错误和警告 | log_error | 始终启用,排查问题必备 |
| 二进制日志 | 数据恢复、主从复制 | log_bin | 生产环境需定期清理 |
| 查询日志 | 记录所有查询 | general_log | 调试用,生产环境慎用 |
| 慢查询日志 | 性能优化 | slow_query_log | 生产环境推荐启用 |