Skip to content

MySQL 日志类型与配置

错误日志

功能与作用

  • 记录服务器启动、关闭信息
  • 记录错误和警告信息
  • 记录关键事件
  • 用于故障诊断和问题排查

配置参数

  • log_error: 错误日志文件路径
  • log_error_verbosity: 错误日志详细程度(1-3)
  • log_warnings: 警告信息记录级别

配置示例

ini
# 错误日志配置
log_error = /var/log/mysql/error.log
log_error_verbosity = 3
log_warnings = 2

查看方法

bash
# 查看错误日志
cat /var/log/mysql/error.log

# 实时查看错误日志
tail -f /var/log/mysql/error.log

# 查看最近的错误
grep -i error /var/log/mysql/error.log | tail -n 20

慢查询日志

功能与作用

  • 记录执行时间超过阈值的SQL语句
  • 用于性能分析和优化
  • 帮助识别慢查询和性能瓶颈

配置参数

  • slow_query_log: 启用慢查询日志
  • slow_query_log_file: 慢查询日志文件路径
  • long_query_time: 慢查询阈值(秒)
  • log_queries_not_using_indexes: 记录未使用索引的查询
  • min_examined_row_limit: 最小扫描行数
  • log_slow_admin_statements: 记录慢管理语句
  • log_slow_slave_statements: 记录从库慢查询

配置示例

ini
# 慢查询日志配置
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow-query.log
long_query_time = 0.1
log_queries_not_using_indexes = 1
min_examined_row_limit = 100
log_slow_admin_statements = 1
log_slow_slave_statements = 1

查看与分析

bash
# 查看慢查询日志
cat /var/log/mysql/slow-query.log

# 使用 mysqldumpslow 分析
mysqldumpslow -s t /var/log/mysql/slow-query.log

# 查看最慢的10条查询
mysqldumpslow -s t -t 10 /var/log/mysql/slow-query.log

# 使用 pt-query-digest 分析
pt-query-digest /var/log/mysql/slow-query.log

二进制日志

功能与作用

  • 记录数据变更操作
  • 用于主从复制
  • 用于数据恢复
  • 提供时间点恢复能力

配置参数

  • log_bin: 启用二进制日志
  • log_bin_basename: 二进制日志文件前缀
  • binlog_format: 二进制日志格式(STATEMENT, ROW, MIXED)
  • expire_logs_days: 二进制日志过期时间(天)
  • max_binlog_size: 单个二进制日志文件大小
  • sync_binlog: 二进制日志同步策略
  • binlog_row_image: ROW格式下的行镜像模式

配置示例

ini
# 二进制日志配置
log_bin = mysql-bin
expire_logs_days = 7
max_binlog_size = 100M
binlog_format = ROW
sync_binlog = 1
binlog_row_image = FULL

管理与维护

bash
# 查看二进制日志列表
SHOW BINARY LOGS;

# 查看当前二进制日志
SHOW MASTER STATUS;

# 刷新二进制日志
FLUSH BINARY LOGS;

# 清除过期二进制日志
PURGE BINARY LOGS BEFORE '2023-01-01 00:00:00';

# 清除到指定日志文件
PURGE BINARY LOGS TO 'mysql-bin.000100';

一般查询日志

功能与作用

  • 记录所有SQL语句
  • 用于审计和故障排查
  • 详细记录服务器活动

配置参数

  • general_log: 启用一般查询日志
  • general_log_file: 一般查询日志文件路径

配置示例

ini
# 一般查询日志配置
general_log = 0
general_log_file = /var/log/mysql/general.log

注意事项

  • 一般查询日志会产生大量日志,影响性能
  • 建议只在故障排查时临时启用
  • 定期清理日志文件,避免磁盘空间耗尽

中继日志

功能与作用

  • 从库接收的主库二进制日志
  • 用于主从复制过程
  • 记录待执行的复制事件

配置参数

  • relay_log: 中继日志文件前缀
  • relay_log_index: 中继日志索引文件
  • relay_log_info_file: 中继日志信息文件
  • relay_log_purge: 自动清理中继日志
  • relay_log_recovery: 中继日志恢复功能

配置示例

ini
# 中继日志配置
relay_log = mysql-relay-bin
relay_log_purge = 1
relay_log_recovery = 1

管理与维护

bash
# 查看中继日志状态
SHOW SLAVE STATUS\G

# 清除中继日志
RESET SLAVE ALL;

# 手动清理中继日志
PURGE RELAY LOGS;

审计日志

功能与作用

  • 记录用户操作审计
  • 用于安全合规
  • 详细记录访问和操作

配置方法

  • 使用 MySQL Enterprise Audit(企业版)
  • 使用 MariaDB Audit Plugin
  • 使用 Percona Audit Log Plugin

Percona Audit Log Plugin 配置

ini
# 审计日志配置
plugin_load_add = 'audit_log.so'
audit_log = FORCE_PLUS_PERMANENT
audit_log_file = /var/log/mysql/audit.log
audit_log_format = JSON
audit_log_policy = ALL

查看与分析

bash
# 查看审计日志
cat /var/log/mysql/audit.log

# 分析审计日志
jq '.' /var/log/mysql/audit.log | grep -i 'query'

事务日志(redo log)

功能与作用

  • 记录事务操作
  • 确保数据持久性
  • 支持崩溃恢复
  • 提高事务性能

配置参数

  • innodb_log_file_size: 单个redo log文件大小
  • innodb_log_files_in_group: redo log文件数量
  • innodb_log_group_home_dir: redo log文件目录
  • innodb_flush_log_at_trx_commit: redo log刷新策略
  • innodb_log_buffer_size: redo log缓冲区大小

配置示例

ini
# 事务日志配置
innodb_log_file_size = 256M
innodb_log_files_in_group = 2
innodb_log_group_home_dir = ./
innodb_flush_log_at_trx_commit = 1
innodb_log_buffer_size = 16M

回滚日志(undo log)

功能与作用

  • 记录事务回滚信息
  • 支持事务回滚操作
  • 支持MVCC(多版本并发控制)

配置参数

  • innodb_undo_directory: undo log目录
  • innodb_undo_tablespaces: undo表空间数量
  • innodb_undo_log_truncate: 启用undo log截断
  • innodb_max_undo_log_size: undo log最大大小

配置示例

ini
# 回滚日志配置
innodb_undo_directory = ./
innodb_undo_tablespaces = 2
innodb_undo_log_truncate = 1
innodb_max_undo_log_size = 1G

日志文件管理

日志轮转

  • 使用 logrotate 进行日志轮转
  • 配置示例:
txt
/var/log/mysql/*.log {
    daily
    rotate 7
    missingok
    compress
    delaycompress
    postrotate
        mysqladmin flush-logs
    endscript
}

磁盘空间管理

  • 定期检查日志文件大小
  • 设置合理的日志过期时间
  • 监控磁盘空间使用情况
  • 配置告警机制

日志安全

  • 限制日志文件权限
  • 加密敏感日志
  • 定期备份重要日志
  • 遵循最小权限原则

不同版本的日志特性

MySQL 5.7

  • 引入 log_error_verbosity 参数
  • 增强慢查询日志功能
  • 支持JSON格式审计日志

MySQL 8.0

  • 引入 log_bin_trust_function_creators 参数
  • 增强二进制日志功能
  • 支持密码轮换日志
  • 改进日志格式和内容

MariaDB

  • 增强审计日志功能
  • 提供更多日志格式选项
  • 改进日志性能

日志配置最佳实践

生产环境

  • 启用错误日志和慢查询日志
  • 合理设置慢查询阈值
  • 配置二进制日志用于复制和恢复
  • 禁用一般查询日志
  • 设置适当的日志过期时间

开发环境

  • 可以启用一般查询日志
  • 设置较低的慢查询阈值
  • 详细记录所有操作
  • 定期清理日志文件

高可用环境

  • 确保所有节点日志配置一致
  • 集中管理日志
  • 配置日志同步机制
  • 建立日志分析系统

常见问题(FAQ)

Q1: 如何确定慢查询日志的合理阈值?

A1: 可以根据应用特性和性能要求确定:

  • 对于OLTP应用,建议设置为0.1-0.5秒
  • 对于分析型应用,可设置为1-5秒
  • 逐步调整,找到适合自己环境的阈值

Q2: 二进制日志格式选择哪种更好?

A2: 根据实际情况选择:

  • ROW 格式:最安全,复制准确性高,适合大多数场景
  • STATEMENT 格式:日志量小,性能好,但可能存在复制不一致
  • MIXED 格式:自动选择,平衡安全性和性能

Q3: 如何处理日志文件过大的问题?

A3: 可以采取以下措施:

  • 配置合理的日志过期时间
  • 使用 logrotate 进行日志轮转
  • 定期手动清理日志文件
  • 考虑使用日志集中管理系统

Q4: 一般查询日志启用后性能下降严重怎么办?

A4: 建议:

  • 立即禁用一般查询日志
  • 只在必要时临时启用
  • 考虑使用更轻量级的日志方案
  • 优化服务器硬件配置

Q5: 如何集中管理多台MySQL服务器的日志?

A5: 可以使用以下方案:

  • 配置rsyslog将日志发送到中央服务器
  • 使用ELK Stack(Elasticsearch, Logstash, Kibana)
  • 使用Graylog等日志管理系统
  • 定期收集和分析日志数据