外观
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等日志管理系统
- 定期收集和分析日志数据
