排查步骤
监控日志增长情况
-- 查看InnoDB状态
SHOW ENGINE INNODB STATUS;-- 查看redo log配置和使用情况
SHOW VARIABLES LIKE 'innodb_log_file%';
SHOW VARIABLES LIKE 'innodb_log_buffer_size';-- 查看undo log信息
SHOW VARIABLES LIKE 'innodb_undo%';
检查长时间运行的事务
-- 查看当前运行的事务
SELECT * FROM information_schema.INNODB_TRX;-- 查看长时间运行的事务
SELECT * FROM information_schema.INNODB_TRX
WHERE TIME_TO_SEC(TIMEDIFF(NOW(), trx_started)) > 60;
检查锁等待情况
-- 查看锁等待
SELECT * FROM sys.innodb_lock_waits;
检查系统负载
-- 查看当前连接数
SHOW STATUS LIKE 'Threads_connected';-- 查看活跃连接数
SHOW STATUS LIKE 'Threads_running';
- SHOW ENGINE INNODB STATUS;
用途:查看InnoDB存储引擎的详细运行状态信息,包括事务、锁、缓冲池、日志等关键指标。 输出内容:
事务信息:活跃事务数量、锁等待情况
缓冲池状态:命中率、脏页比例
日志信息:redo log和undo log的写入状态
锁信息:行锁/表锁的持有和等待情况
线程信息:InnoDB内部线程状态- SHOW VARIABLES LIKE ‘innodb_log_file%’;
用途:查看redo log(重做日志)的文件配置。 关键参数:
innodb_log_file_size:单个redo log文件大小(默认48M)
innodb_log_files_in_group:redo log文件数量(默认2个)- SHOW VARIABLES LIKE ‘innodb_log_buffer_size’;
用途:查看redo log缓冲区大小配置。 说明:
该参数控制内存中redo log缓冲区的大小(默认16M)
缓冲区满时会自动刷新到磁盘日志文件
高写入场景可适当调大(如32M或64M)- SHOW VARIABLES LIKE ‘innodb_undo%’;
用途:查看undo log(回滚日志)的相关配置。 常见参数:innodb_undo_directory:undo log存储路径
innodb_undo_logs:回滚段数量(默认128)
innodb_undo_tablespaces:独立undo表空间数量
innodb_undo_retention:undo log保留时间(秒)
常见原因
- 长时间运行的事务:未提交的事务会阻止undo log的清理
- 大事务:一次性修改大量数据
- 高并发写操作:导致redo log快速增长
- 配置不当:日志文件大小或数量配置不合理
- 复制延迟:在复制环境中可能导致日志堆积
解决方案
优化事务处理
- 避免长时间运行的事务,尽快提交或回滚
- 将大事务拆分为小事务
- 设置事务超时时间
调整日志配置
-- 增加redo log文件大小和数量(需要重启)
SET GLOBAL innodb_log_file_size = 256M; -- 通常设置为1-2小时的写入量
SET GLOBAL innodb_log_files_in_group = 4; -- 通常2-4个-- 调整undo log设置
SET GLOBAL innodb_undo_tablespaces = 4; -- 多个undo表空间
SET GLOBAL innodb_max_undo_log_size = 1G; -- 控制undo log最大大小
定期维护
-- 定期清理历史事务
SET GLOBAL innodb_purge_threads = 4; -- 增加purge线程数-- 监控并手动触发purge
SHOW VARIABLES LIKE 'innodb_purge_batch_size';
硬件和系统优化
- 使用更快的存储设备(如SSD)存放日志文件
- 确保有足够的I/O带宽
- 考虑增加服务器内存
监控和预警
设置监控系统,关注以下指标:
- Undo log空间使用率
- Redo log生成速度
- 长时间运行事务数量
- 锁等待时间
紧急处理
如果日志已经占满磁盘空间:
- 临时增加磁盘空间
- 安全地重启MySQL以重建日志文件(确保数据已同步到磁盘)
- 对于undo log问题,可以尝试终止长时间运行的事务