MySQL 如何记录所有查询或慢查询日志?
MySQL 开启慢查询日志:slow_query_log=1 + long_query_time 设阈值;general_log=1 记录所有查询(生产慎用)。本文给出配置方法和分析工具。
慢查询日志:slow_query_log=1 + long_query_time=1(秒)记录超过阈值的查询。全量查询日志:general_log=1(性能开销大,仅短期排查用)。
开启慢查询日志
编辑 my.cnf(/etc/mysql/my.cnf 或 /etc/my.cnf):
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow-query.log
long_query_time = 1
log_queries_not_using_indexes = 1
重启 MySQL 生效。long_query_time = 1 表示超过 1 秒的查询被记录;log_queries_not_using_indexes 把没走索引的查询也记录下来。
运行时动态开启(不重启)
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;
记录所有查询(general log)
[mysqld]
general_log = 1
general_log_file = /var/log/mysql/mysql.log
警告:高并发下 general log 会严重拖慢性能并快速占满磁盘,只用于短期调试,排查完立即关闭。
分析慢查询日志
# mysqldumpslow 按次数/时间汇总
mysqldumpslow -s t -t 10 /var/log/mysql/slow-query.log
# 或用 pt-query-digest(Percona Toolkit,更强大)
pt-query-digest /var/log/mysql/slow-query.log
观测云对照
观测云提供 MySQL 集成,可采集慢查询日志和性能指标(QPS、连接数、InnoDB 状态等),在仪表盘中统一查看慢查询趋势,并配置慢查询数量告警,无需登录每台数据库服务器。
常见问题(FAQ)
Q:long_query_time 设多少合适?
A:取决于业务。Web 应用通常设 0.5~1 秒;数据分析场景可以放宽到 5~10 秒。先设宽松值观察分布再逐步收紧。
Q:慢查询日志会影响性能吗?
A:影响很小(只在查询超阈值时写一条记录),生产环境可以长期开启;general log 则影响显著。
Q:慢查询日志里的 Query_time 和 Lock_time 分别是什么?
A:Query_time 是查询执行总时间,Lock_time 是等待表锁的时间。Lock_time 占比高说明有锁竞争问题。