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
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 是日志定义的锁获取时间,不包含所有可能的行锁/事务等待;不能用它代替完整锁等待诊断。