Ubuntu MySQL日志分析技巧
快速定位日志文件路径
通过MySQL命令查看各类日志的存储位置,避免手动查找:
SHOW VARIABLES LIKE 'log_error';(默认路径通常为/var/log/mysql/error.log)SHOW VARIABLES LIKE 'slow_query_log_file';SHOW VARIABLES LIKE 'general_log_file';SHOW VARIABLES LIKE 'log_bin';(若开启,路径通常为/var/lib/mysql/mysql-bin.xxxxxx)实时查看日志内容
使用tail -f命令实时监控日志更新,快速捕捉异常:
sudo tail -f /var/log/mysql/error.logsudo tail -f /var/log/mysql/slow.logsudo tail -f /var/log/mysql/general.loggrep过滤关键词(如“ERROR”“slow”),缩小查看范围:sudo tail -f /var/log/mysql/error.log | grep "ERROR"mysqldumpslow(MySQL官方工具)
用于统计慢查询日志中的高频或耗时SQL,适合快速定位问题语句:
mysqldumpslow -s t -t 10 /var/log/mysql/slow.logmysqldumpslow -s c -t 10 /var/log/mysql/slow.logmysqldumpslow -g "SELECT" /var/log/mysql/slow.logpt-query-digest(Percona Toolkit工具)
更强大的分析工具,支持慢查询、通用查询、二进制日志等多种日志类型,生成详细报告:
pt-query-digest /var/log/mysql/slow.logtcpdump -s 65535 -x -n -q -tttt -i any -c 1000 port 3306 | pt-query-digest --type tcpdumpgrep/awk/sort/uniq组合(命令行利器)
无需额外工具,通过基础命令行工具实现快速统计:
awk '{print $1}' /var/log/mysql/error.log | sort | uniq -c | sort -nrawk '{print $4}' /var/log/mysql/slow.log | sort -nr | head -10grep "2025-10-16" /var/log/mysql/error.log | wc -l开启慢查询日志
确保慢查询日志已启用,记录执行时间超过阈值的SQL:
/etc/mysql/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf),在[mysqld]部分添加:slow_query_log = ON slow_query_log_file = /var/log/mysql/slow.log long_query_time = 1 # 阈值(秒),可根据业务调整 log_queries_not_using_indexes = ON # 记录未使用索引的查询(辅助优化) sudo systemctl restart mysqlSET GLOBAL slow_query_log = 'ON'; SET GLOBAL long_query_time = 1; 结合EXPLAIN分析执行计划
对慢查询使用EXPLAIN查看执行路径,识别索引或SQL结构问题:
EXPLAIN SELECT * FROM orders WHERE user_id = 123 AND status = 'paid';range、ref或index,避免ALL(全表扫描));Using filesort(文件排序)、Using temporary(临时表)需警惕,通常需优化SQL优化SQL与索引
根据分析结果调整SQL和索引:
ALTER TABLE orders ADD INDEX idx_user_status (user_id, status););SELECT *,只查询必要字段(减少数据传输量);WHERE子句(避免函数操作,如WHERE DATE(create_time) = '2025-10-16',可改为WHERE create_time >= '2025-10-16' AND create_time < '2025-10-17');日志轮转(防止日志过大)
使用logrotate工具自动管理日志文件,避免占用过多磁盘空间:
/etc/logrotate.d/mysql),添加或修改以下内容:/var/log/mysql/*.log { daily # 每天轮转 rotate 7 # 保留7天 compress # 压缩旧日志 missingok # 文件不存在不报错 notifempty # 空文件不轮转 create 640 mysql adm # 创建新日志的权限 sharedscripts # 所有日志轮转完成后执行脚本 postrotate systemctl restart mysql > /dev/null 2>&1 || true endscript } sudo logrotate -vf /etc/logrotate.d/mysql定期清理旧日志
sudo journalctl --vacuum-time=1wsudo journalctl --vacuum-size=500M/var/log/mysql/slow.log.1.gz),或通过logrotate自动清理