日志管理

最后更新: 2026-01-22 作者: MySQL Team
页面目录

第十章:日志管理


10.1 MySQL 日志类型

日志类型 说明 作用
错误日志 Error Log 记录启动/运行/停止时的错误
查询日志 General Log 记录所有 SQL 操作
慢查询日志 Slow Query Log 记录执行时间长的查询
二进制日志 Binary Log 记录数据变更,用于复制和恢复
中继日志 Relay Log 主从复制中间文件
重做日志 Redo Log InnoDB 事务日志
回滚日志 Undo Log InnoDB 多版本控制

10.2 错误日志

配置与查看

-- 查看错误日志位置
SHOW VARIABLES LIKE 'log_error';

-- 查看错误日志内容
SHOW VARIABLES LIKE 'log_error';

-- 配置(my.cnf)
[mysqld]
log_error = /var/log/mysql/error.log
log_error_verbosity = 2  -- 1=只有错误, 2=错误+警告, 3=错误+警告+信息

错误日志内容

2024-01-15T10:30:00.123456Z 0 [System] [MY-010116] /usr/sbin/mysqld (mysqld 8.0.36) starting
2024-01-15T10:30:00.456789Z 0 [System] [MY-013602] Channel configuration
2024-01-15T10:30:01.123456Z 1 [System] [MY-013576] InnoDB: Buffer pool(s) load completed
2024-01-15T11:00:00.000000Z 2 [ERROR] [MY-012263] InnoDB: Table ... is marked as crashed

10.3 慢查询日志

配置

-- 启用慢查询日志
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
SET GLOBAL long_query_time = 2;  -- 秒

-- 记录不使用索引的查询
SET GLOBAL log_queries_not_using_indexes = 'ON';

-- my.cnf 配置
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
log_queries_not_using_indexes = 1
log_throttle_queries_not_using_indexes = 10  -- 每分钟最多记录10条

分析工具

# mysqldumpslow
mysqldumpslow -s t /var/log/mysql/slow.log                          # 按时间排序
mysqldumpslow -s c /var/log/mysql/slow.log                         # 按次数排序
mysqldumpslow -s t -t 10 /var/log/mysql/slow.log                   # 显示前10条
mysqldumpslow -g 'username' /var/log/mysql/slow.log                 # 过滤关键词

# pt-query-digest
pt-query-digest /var/log/mysql/slow.log

10.4 二进制日志(Binary Log)

作用

  • 数据复制(主从同步)
  • 数据恢复(Point-in-time Recovery)
  • 审计

配置

-- 查看状态
SHOW VARIABLES LIKE 'log_bin';
SHOW VARIABLES LIKE 'binlog_format';

-- 临时启用
SET GLOBAL log_bin = 'ON';
SET GLOBAL binlog_format = 'ROW';

-- my.cnf 配置
[mysqld]
server-id = 1
log_bin = /var/lib/mysql/mysql-bin
binlog_format = ROW
expire_logs_days = 7
max_binlog_size = 100M
sync_binlog = 1

二进制日志格式

格式 说明 优点 缺点
STATEMENT 记录 SQL 语句 日志量小 函数/存储过程结果不一致
ROW 记录行变更 准确 日志量大
MIXED 混合模式 自动选择 -
-- 设置格式
SET GLOBAL binlog_format = 'STATEMENT';
SET GLOBAL binlog_format = 'ROW';
SET GLOBAL binlog_format = 'MIXED';

查看二进制日志

-- 查看所有二进制日志文件
SHOW MASTER LOGS;
SHOW BINARY LOGS;

-- 查看当前二进制日志状态
SHOW MASTER STATUS;

-- 查看二进制日志内容
SHOW BINLOG EVENTS IN 'mysql-bin.000001' FROM 123 LIMIT 20;

-- 使用 mysqlbinlog 工具
mysqlbinlog /var/lib/mysql/mysql-bin.000001
mysqlbinlog --start-datetime='2024-01-15 10:00:00' /var/lib/mysql/mysql-bin.000001
mysqlbinlog --stop-position=1000 /var/lib/mysql/mysql-bin.000001

使用二进制日志恢复

# 基于时间点恢复
mysqlbinlog --stop-datetime='2024-01-15 10:30:00' /var/lib/mysql/mysql-bin.000001 | mysql -u root -p

# 基于位置恢复
mysqlbinlog --start-position=100 --stop-position=500 /var/lib/mysql/mysql-bin.000001 | mysql -u root -p

# 恢复整个日志
mysqlbinlog /var/lib/mysql/mysql-bin.000001 /var/lib/mysql/mysql-bin.000002 | mysql -u root -p

10.5 InnoDB 日志

Redo Log

-- 查看 redo log 配置
SHOW VARIABLES LIKE 'innodb_log%';

-- 关键参数
-- innodb_log_file_size: 日志文件大小(建议 1-4G)
-- innodb_log_buffer_size: 日志缓冲区(默认 16M)
-- innodb_flush_log_at_trx_commit: 刷新策略

-- 刷新策略说明
-- 1: 每次事务提交都刷新到磁盘(默认,最安全)
-- 0: 每秒刷新,性能高但可能丢失1秒数据
-- 2: 刷新到操作系统缓存

-- my.cnf 配置
[mysqld]
innodb_log_file_size = 1G
innodb_log_buffer_size = 64M
innodb_flush_log_at_trx_commit = 1

Undo Log

-- 查看 undo tablespace
SHOW VARIABLES LIKE 'innodb_undo%';

-- 配置独立 undo 表空间
[mysqld]
innodb_undo_tablespaces = 4
innodb_undo_directory = /var/lib/mysql/undo/

10.6 本章小结

✅ 错误日志:记录数据库启动和运行错误
✅ 慢查询日志:识别需要优化的查询
✅ 二进制日志:数据复制和恢复的核心
✅ Redo Log:保证事务持久性
✅ Undo Log:支持 MVCC 和事务回滚