Skip to content

MySQL 日志体系

日志的基本概念

日志的定义

MySQL 日志是记录数据库运行状态、操作行为和错误信息的重要文件,对于数据库的监控、故障诊断、性能优化和数据恢复至关重要。

日志的作用

  • 故障诊断:记录数据库运行过程中的错误信息,帮助定位和解决问题
  • 性能分析:记录慢查询和资源使用情况,用于性能优化
  • 数据恢复:记录数据变更操作,用于数据库恢复和复制
  • 安全审计:记录用户操作行为,用于安全审计和合规性检查
  • 运行监控:记录数据库运行状态,用于监控和告警

日志的分类

MySQL 支持多种类型的日志,主要包括:

  • 错误日志(Error Log):记录 MySQL 服务器启动、运行和关闭过程中的错误信息
  • 查询日志(General Query Log):记录所有客户端的查询操作
  • 慢查询日志(Slow Query Log):记录执行时间超过阈值的查询
  • 二进制日志(Binary Log):记录所有数据变更操作,用于复制和恢复
  • 中继日志(Relay Log):用于主从复制,记录从主库接收的二进制日志
  • 事务日志(Transaction Log):InnoDB 存储引擎的重做日志(Redo Log)和回滚日志(Undo Log)
  • 审计日志(Audit Log):记录用户访问和操作数据库的详细信息

错误日志

错误日志的作用

错误日志是 MySQL 最重要的日志之一,记录了 MySQL 服务器的启动、运行和关闭过程中的关键信息,包括:

  • 服务器启动和关闭信息
  • 错误和警告信息
  • 事件调度器运行信息
  • 复制相关信息

错误日志的配置

配置参数

参数名称说明默认值
log_error错误日志文件路径hostname.err(Linux)/ hostname.err(Windows)
log_error_verbosity错误日志详细程度2(记录错误、警告和注释)
log_warnings是否记录警告信息ON

配置示例

ini
# 配置错误日志路径
log_error = /var/log/mysql/mysql-error.log

# 配置错误日志详细程度(1-3,3最详细)
log_error_verbosity = 3

# 启用警告日志
log_warnings = 2

错误日志的查看

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

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

# 查看最近100行错误日志
tail -n 100 /var/log/mysql/mysql-error.log

错误日志的管理

  • 定期归档:定期将旧的错误日志归档,避免日志文件过大
  • 日志轮转:使用 logrotate 等工具实现日志自动轮转
  • 监控告警:监控错误日志中的关键错误信息,及时告警

查询日志

查询日志的作用

查询日志记录所有客户端发送给 MySQL 服务器的查询语句,包括:

  • 连接和断开连接信息
  • 所有 SQL 语句(包括 SELECT、INSERT、UPDATE、DELETE 等)
  • 语句执行的时间戳

查询日志的配置

配置参数

参数名称说明默认值
general_log是否启用查询日志OFF
general_log_file查询日志文件路径hostname.log
log_output日志输出格式(FILE、TABLE 或 BOTH)FILE

配置示例

ini
# 启用查询日志
general_log = ON

# 配置查询日志路径
general_log_file = /var/log/mysql/mysql-general.log

# 配置日志输出格式
log_output = FILE

查询日志的查看

文件格式查看

bash
# 查看查询日志
cat /var/log/mysql/mysql-general.log

# 实时查看查询日志
tail -f /var/log/mysql/mysql-general.log

表格式查看

sql
-- 启用表格式查询日志
SET GLOBAL log_output = 'TABLE';

-- 查看查询日志
SELECT * FROM mysql.general_log ORDER BY event_time DESC;

-- 清空查询日志表
TRUNCATE TABLE mysql.general_log;

查询日志的注意事项

  • 查询日志会记录所有 SQL 语句,包括敏感信息,需要注意安全
  • 查询日志会产生大量的日志数据,影响性能,生产环境中建议关闭
  • 只在调试和 troubleshooting 时临时启用

慢查询日志

慢查询日志的作用

慢查询日志记录执行时间超过阈值的查询语句,用于性能分析和优化,包括:

  • 执行时间超过 long_query_time 阈值的查询
  • 未使用索引的查询(当 log_queries_not_using_indexes 启用时)
  • 查询扫描行数超过 min_examined_row_limit 阈值的查询

慢查询日志的配置

配置参数

参数名称说明默认值
slow_query_log是否启用慢查询日志OFF
slow_query_log_file慢查询日志文件路径hostname-slow.log
long_query_time慢查询时间阈值(秒)10
log_queries_not_using_indexes是否记录未使用索引的查询OFF
log_slow_admin_statements是否记录慢管理语句OFF
log_slow_slave_statements是否记录从库上的慢查询OFF
min_examined_row_limit查询扫描行数阈值0

配置示例

ini
# 启用慢查询日志
slow_query_log = ON

# 配置慢查询日志路径
slow_query_log_file = /var/log/mysql/mysql-slow.log

# 设置慢查询时间阈值(0.1秒)
long_query_time = 0.1

# 记录未使用索引的查询
log_queries_not_using_indexes = ON

# 记录慢管理语句
log_slow_admin_statements = ON

# 设置查询扫描行数阈值
min_examined_row_limit = 100

慢查询日志的查看和分析

直接查看

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

使用 mysqldumpslow 工具

bash
# 查看慢查询统计
mysqldumpslow /var/log/mysql/mysql-slow.log

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

# 查看按时间排序的慢查询
mysqldumpslow -s t -t 10 /var/log/mysql/mysql-slow.log

使用 pt-query-digest 工具

bash
# 安装 pt-query-digest
yum install percona-toolkit -y

# 分析慢查询日志
pt-query-digest /var/log/mysql/mysql-slow.log > slow_query_analysis.txt

慢查询日志的管理

  • 定期分析:定期分析慢查询日志,找出性能瓶颈
  • 日志轮转:使用 logrotate 等工具实现日志自动轮转
  • 动态调整:根据业务需求动态调整慢查询阈值

二进制日志

二进制日志的作用

二进制日志是 MySQL 最重要的日志之一,记录了所有数据变更操作,主要用于:

  • 数据恢复:通过二进制日志恢复数据库到指定时间点
  • 主从复制:从库通过读取主库的二进制日志实现数据同步
  • 数据审计:记录所有数据变更操作,用于审计

二进制日志的格式

MySQL 支持三种二进制日志格式:

基于语句的格式(Statement-Based Logging, SBL)

  • 记录执行的 SQL 语句
  • 日志体积小
  • 可能导致主从数据不一致
  • MySQL 5.7 之前的默认格式

基于行的格式(Row-Based Logging, RBL)

  • 记录每行数据的变更
  • 主从数据一致性高
  • 日志体积大
  • MySQL 5.7 及之后的默认格式

混合格式(Mixed Logging, MBL)

  • 根据语句类型自动选择 SBL 或 RBL
  • 兼顾性能和一致性

二进制日志的配置

配置参数

参数名称说明默认值
log_bin是否启用二进制日志OFF
log_bin_basename二进制日志文件前缀hostname-bin
log_bin_index二进制日志索引文件路径hostname-bin.index
binlog_format二进制日志格式ROW
expire_logs_days二进制日志过期天数0(永不过期)
max_binlog_size单个二进制日志文件大小限制1073741824(1GB)
sync_binlog二进制日志同步磁盘的频率1(每次事务提交都同步)

配置示例

ini
# 启用二进制日志
log_bin = /var/lib/mysql/mysql-bin

# 配置二进制日志格式
binlog_format = ROW

# 配置二进制日志过期天数
expire_logs_days = 7

# 配置单个二进制日志文件大小
max_binlog_size = 512M

# 配置二进制日志同步频率
sync_binlog = 1

二进制日志的查看

使用 SHOW BINARY LOGS 命令

sql
-- 查看二进制日志列表
SHOW BINARY LOGS;

-- 查看当前正在使用的二进制日志
SHOW MASTER STATUS;

使用 mysqlbinlog 工具

bash
# 查看二进制日志内容
mysqlbinlog /var/lib/mysql/mysql-bin.000001

# 查看指定时间范围内的二进制日志
mysqlbinlog --start-datetime="2026-01-25 00:00:00" --stop-datetime="2026-01-25 12:00:00" /var/lib/mysql/mysql-bin.000001

# 查看指定位置范围内的二进制日志
mysqlbinlog --start-position=107 --stop-position=1000 /var/lib/mysql/mysql-bin.000001

二进制日志的管理

手动清理二进制日志

sql
-- 删除指定日期之前的二进制日志
PURGE BINARY LOGS BEFORE '2026-01-25 00:00:00';

-- 删除指定日志文件之前的二进制日志
PURGE BINARY LOGS TO 'mysql-bin.000010';

自动清理二进制日志

通过配置 expire_logs_days 参数,MySQL 会自动清理过期的二进制日志。

二进制日志备份

二进制日志是恢复数据的重要依据,需要定期备份到安全的位置。

中继日志

中继日志的作用

中继日志是主从复制架构中的重要组件,从库用于存储从主库接收的二进制日志,然后由从库的 SQL 线程应用这些日志。

中继日志的配置

配置参数

参数名称说明默认值
relay_log中继日志文件前缀hostname-relay-bin
relay_log_index中继日志索引文件路径hostname-relay-bin.index
relay_log_recovery从库启动时是否自动恢复中继日志OFF
max_relay_log_size单个中继日志文件大小限制1073741824(1GB)

配置示例

ini
# 配置中继日志文件前缀
relay_log = /var/lib/mysql/mysql-relay-bin

# 启用中继日志自动恢复
relay_log_recovery = ON

# 配置单个中继日志文件大小
max_relay_log_size = 512M

中继日志的管理

  • 中继日志会自动轮转,无需手动管理
  • 从库同步完成后,已应用的中继日志会被自动删除
  • 启用 relay_log_recovery 可以在从库崩溃时自动恢复中继日志

事务日志

事务日志的作用

事务日志是 InnoDB 存储引擎的重要组件,包括重做日志(Redo Log)和回滚日志(Undo Log),主要用于:

  • 崩溃恢复:系统崩溃后恢复未提交的事务
  • 事务回滚:支持事务的回滚操作
  • MVCC 实现:支持多版本并发控制

重做日志(Redo Log)

重做日志的作用

重做日志记录了 InnoDB 存储引擎的所有数据变更操作,用于在系统崩溃后恢复未写入数据文件的变更。

重做日志的配置

参数名称说明默认值
innodb_log_file_size单个重做日志文件大小48M
innodb_log_files_in_group重做日志文件数量2
innodb_log_group_home_dir重做日志文件路径.(数据目录)
innodb_flush_log_at_trx_commit重做日志刷新策略1(每次事务提交都刷新)
innodb_flush_log_at_timeout重做日志刷新超时时间1(秒)

配置示例

ini
# 配置单个重做日志文件大小
innodb_log_file_size = 256M

# 配置重做日志文件数量
innodb_log_files_in_group = 2

# 配置重做日志文件路径
innodb_log_group_home_dir = /var/lib/mysql

# 配置重做日志刷新策略
innodb_flush_log_at_trx_commit = 1

回滚日志(Undo Log)

回滚日志的作用

回滚日志记录了数据变更前的状态,用于事务回滚和 MVCC 实现。

回滚日志的配置

参数名称说明默认值
innodb_undo_directory回滚表空间文件路径.(数据目录)
innodb_undo_log_truncate是否自动截断回滚日志ON
innodb_undo_tablespaces回滚表空间数量2
innodb_max_undo_log_size单个回滚表空间大小限制1073741824(1GB)

配置示例

ini
# 配置回滚表空间文件路径
innodb_undo_directory = /var/lib/mysql/undo

# 启用自动截断回滚日志
innodb_undo_log_truncate = ON

# 配置回滚表空间数量
innodb_undo_tablespaces = 2

# 配置单个回滚表空间大小限制
innodb_max_undo_log_size = 2GB

审计日志

审计日志的作用

审计日志记录用户访问和操作数据库的详细信息,用于安全审计和合规性检查,包括:

  • 用户登录和退出信息
  • 数据库操作语句
  • 操作时间和结果
  • 客户端 IP 地址

审计日志的实现方式

MySQL 审计日志有多种实现方式:

MySQL Enterprise Audit

MySQL 企业版的审计插件,提供全面的审计功能。

MariaDB Audit Plugin

开源的审计插件,兼容 MySQL,可以从 MariaDB 官网下载。

Percona Audit Log Plugin

Percona 提供的审计插件,用于 Percona Server for MySQL。

第三方审计工具

如 McAfee MySQL Audit、Imperva SecureSphere 等。

审计日志的配置示例(MariaDB Audit Plugin)

ini
# 加载审计插件
plugin_load_add = server_audit=server_audit.so

# 启用审计日志
server_audit_logging = ON

# 配置审计日志文件路径
server_audit_file_path = /var/log/mysql/mysql-audit.log

# 配置审计事件类型
server_audit_events = CONNECT,QUERY,TABLE

# 配置审计日志格式
server_audit_format = OLD

日志的监控和分析

日志监控工具

  • MySQL Enterprise Monitor:MySQL 企业版的监控工具,提供全面的日志监控
  • Percona Monitoring and Management (PMM):开源的 MySQL 监控工具
  • Zabbix:支持 MySQL 日志监控的开源监控系统
  • Prometheus + Grafana:通过 Exporter 收集 MySQL 日志指标

日志分析工具

  • mysqldumpslow:分析慢查询日志
  • pt-query-digest:Percona Toolkit 中的慢查询分析工具
  • mysqlbinlog:查看和分析二进制日志
  • Logstash + Elasticsearch + Kibana (ELK Stack):集中式日志管理和分析平台

日志的性能影响和优化

日志对性能的影响

不同类型的日志对 MySQL 性能的影响程度不同:

  • 错误日志:影响较小,仅在发生错误时写入
  • 查询日志:影响较大,记录所有 SQL 语句
  • 慢查询日志:影响中等,仅记录慢查询
  • 二进制日志:影响较大,记录所有数据变更
  • 事务日志:影响中等,InnoDB 存储引擎的核心组件

日志性能优化

  1. 合理启用日志:只启用必要的日志,生产环境中建议关闭查询日志
  2. 调整日志格式:根据需求选择合适的日志格式
  3. 优化日志刷新策略:根据数据安全性需求调整日志刷新频率
  4. 日志轮转和清理:定期轮转和清理日志,避免日志文件过大
  5. 使用高效的日志存储:使用 SSD 存储日志,提高写入性能
  6. 合理配置日志参数:根据业务需求调整日志参数

不同版本间的日志差异

MySQL 5.5

  • 二进制日志默认格式为 STATEMENT
  • 不支持审计日志
  • 慢查询日志功能相对简单

MySQL 5.6

  • 引入了基于行的二进制日志格式
  • 增强了慢查询日志功能
  • 引入了事件调度器日志

MySQL 5.7

  • 默认二进制日志格式改为 ROW
  • 增强了错误日志的详细程度
  • 引入了 sys schema,方便日志分析
  • 支持更多的日志配置选项

MySQL 8.0

  • 引入了新的日志管理工具 mysqlbinlog
  • 增强了二进制日志的安全性
  • 支持密码加密存储在日志中
  • 引入了新的审计日志功能
  • 增强了慢查询日志的性能

日志管理最佳实践

日志配置最佳实践

  1. 根据需求启用日志:只启用必要的日志类型
  2. 合理配置日志参数:根据业务需求调整日志参数
  3. 使用合适的日志格式:根据性能和一致性需求选择日志格式
  4. 配置日志轮转:使用 logrotate 等工具实现日志自动轮转
  5. 设置日志过期时间:避免日志文件无限增长

日志安全最佳实践

  1. 保护日志文件:设置合适的权限,防止未授权访问
  2. 加密敏感信息:对日志中的敏感信息进行加密
  3. 定期备份日志:将日志备份到安全的位置
  4. 限制日志访问:只允许授权人员访问日志
  5. 审计日志访问:记录日志文件的访问行为

日志分析最佳实践

  1. 定期分析日志:建立定期日志分析机制
  2. 自动化分析:使用工具自动分析日志,生成报告
  3. 建立基线:建立正常的日志基线,便于发现异常
  4. 关联分析:结合多种日志进行关联分析
  5. 及时响应:对日志中的异常信息及时响应和处理

常见问题处理

日志文件过大

症状

  • 日志文件占用大量磁盘空间
  • 日志写入性能下降

处理方法

  • 配置日志自动轮转
  • 设置日志过期时间
  • 定期手动清理日志
  • 调整日志配置,减少日志生成量

日志写入性能问题

症状

  • 日志写入延迟
  • 数据库性能下降

处理方法

  • 使用 SSD 存储日志
  • 调整日志刷新策略
  • 减少不必要的日志记录
  • 优化日志配置参数

日志丢失

症状

  • 部分日志记录丢失
  • 无法进行数据恢复

处理方法

  • 配置合适的日志刷新策略
  • 定期备份日志
  • 启用日志校验和
  • 监控日志文件完整性

日志分析困难

症状

  • 日志格式不统一
  • 日志量过大,难以分析
  • 缺乏有效的分析工具

处理方法

  • 使用集中式日志管理平台
  • 标准化日志格式
  • 使用自动化分析工具
  • 建立日志分析流程和规范

常见问题(FAQ)

Q1: 生产环境中应该启用哪些日志?

A1: 生产环境中建议启用以下日志:

  • 错误日志(必须启用)
  • 慢查询日志(建议启用)
  • 二进制日志(主从复制必须启用)
  • 事务日志(InnoDB 存储引擎默认启用)

查询日志和审计日志根据业务需求选择性启用。

Q2: 如何选择合适的二进制日志格式?

A2: 二进制日志格式的选择建议:

  • 对于主从复制,建议使用 ROW 格式,确保数据一致性
  • 对于数据恢复,ROW 格式提供更可靠的恢复
  • 对于性能要求较高的场景,可以考虑使用 MIXED 格式

Q3: 如何优化慢查询日志的性能?

A3: 优化慢查询日志性能的方法:

  • 设置合理的慢查询阈值
  • 只记录需要的慢查询信息
  • 使用高效的日志存储
  • 定期分析和清理慢查询日志

Q4: 如何安全地清理二进制日志?

A4: 安全清理二进制日志的方法:

  • 使用 PURGE BINARY LOGS 命令,而不是直接删除文件
  • 确保从库已经应用了要删除的二进制日志
  • 设置合理的 expire_logs_days 参数,自动清理过期日志
  • 清理前备份重要的二进制日志

Q5: 如何监控 MySQL 日志?

A5: MySQL 日志监控方法:

  • 使用 MySQL 监控工具(如 PMM、Zabbix)
  • 配置日志告警规则
  • 定期查看和分析日志
  • 使用集中式日志管理平台

Q6: 日志对 MySQL 性能的影响有多大?

A6: 日志对 MySQL 性能的影响取决于日志类型和配置:

  • 错误日志:影响较小
  • 查询日志:影响较大,生产环境建议关闭
  • 慢查询日志:影响中等,建议启用
  • 二进制日志:影响较大,主从复制必须启用
  • 事务日志:影响中等,InnoDB 核心组件

Q7: 如何备份 MySQL 日志?

A7: MySQL 日志备份方法:

  • 定期备份二进制日志到安全位置
  • 使用文件系统快照备份日志
  • 配置日志自动复制到远程服务器
  • 使用备份工具(如 mysqldump)备份日志相关信息

Q8: 如何恢复丢失的日志?

A8: 恢复丢失日志的方法:

  • 从备份中恢复日志文件
  • 使用二进制日志恢复数据
  • 启用中继日志自动恢复(主从复制)
  • 重建日志文件(谨慎操作)

Q9: 如何分析 MySQL 错误日志?

A9: 分析 MySQL 错误日志的方法:

  • 查找关键字 "ERROR"、"WARNING" 等
  • 关注最近的错误信息
  • 结合时间点分析错误原因
  • 参考 MySQL 官方文档的错误代码解释

Q10: 如何配置 MySQL 日志的远程存储?

A10: 配置 MySQL 日志远程存储的方法:

  • 使用 NFS 或 SMB 挂载远程存储
  • 配置日志文件路径到远程存储
  • 使用日志转发工具(如 rsyslog、Logstash)将日志发送到远程服务器
  • 配置 MySQL 日志直接写入远程存储