MySQL 如何记录所有查询或慢查询日志?

MySQL 开启慢查询日志:slow_query_log=1 + long_query_time 设阈值;general_log=1 记录所有查询(生产慎用)。本文给出配置方法和分析工具。

最佳实践
MySQL 如何记录所有查询或慢查询日志?封面

慢查询日志: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
log_output = FILE
long_query_time = 1
log_queries_not_using_indexes = 1

确保日志目录存在并可由 mysqld 写入;合并配置后重启 MySQL 生效。long_query_time = 1 表示超过 1 秒的查询被记录;log_queries_not_using_indexes 把没走索引的查询也记录下来。

运行时动态开启(不重启)

SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;

SET GLOBAL long_query_time 影响后续新会话,现有连接池会话需重连或逐会话设置;日志目的地由 log_output 控制,FILE/TABLE/NONE 同时影响慢日志与 general log。log_queries_not_using_indexes 也可能记录很快的查询,需按阈值和负载评估。

记录所有查询(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

常见问题(FAQ)

Q:long_query_time 设多少合适?
A:取决于业务。Web 应用通常设 0.5~1 秒;数据分析场景可以放宽到 5~10 秒。先设宽松值观察分布再逐步收紧。

Q:慢查询日志会影响性能吗?
A:开销取决于命中比例、日志目的地、磁盘与并发;尤其记录不使用索引的查询时并非只写慢查询。应测量后设阈值和轮转,不能保证可忽略。

Q:慢查询日志里的 Query_time 和 Lock_time 分别是什么?
A:Query_time 是查询执行总时间,Lock_time 是日志定义的锁获取时间,不包含所有可能的行锁/事务等待;不能用它代替完整锁等待诊断。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台