第十章:日志管理
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 和事务回滚