MySQL通用查询日志和慢查询日志是数据库运维中非常实用的两种日志。通用查询日志会记录客户端连接以及执行的所有SQL语句,慢查询日志只记录执行时间超过long_query_time的语句以及未使用索引的查询。通过它们可以快速排查异常访问与性能问题。

如何开启两种日志
可以通过MySQL配置文件或运行时命令开启。通用查询日志适合临时调试,慢查询日志建议长期开启并控制阈值。
-- 开启通用查询日志 SET GLOBAL general_log = 'ON'; SET GLOBAL general_log_file = '/var/log/mysql/general.log'; -- 开启慢查询日志 SET GLOBAL slow_query_log = 'ON'; SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log'; SET GLOBAL long_query_time = 1; SET GLOBAL log_queries_not_using_indexes = 'ON';
日志内容格式说明
通用查询日志为纯文本,包含时间、线程ID、命令类型与具体语句。慢查询日志除SQL外,还包含查询时间、锁时间、发送行数等信息。
| 日志类型 | 主要字段 | 用途 |
|---|---|---|
| 通用查询日志 | 时间,线程ID,命令,语句 | 审计与调试 |
| 慢查询日志 | 查询耗时,锁耗时,行数,SQL | 性能分析 |
慢查询日志样例
# Time: 2023-09-01T10:00:00 # User@Host: app[app] @ localhost [] # Query_time: 2.510000 Lock_time: 0.001000 Rows_sent: 1 Rows_examined: 500000 SELECT * FROM orders WHERE user_id = 10;
简单分析方法
对于慢查询日志,可以使用MySQL自带的mysqldumpslow工具汇总耗时最高的语句。
# 查看耗时最长的10条慢查询 mysqldumpslow -s t -t 10 /var/log/mysql/slow.log # 按访问次数排序 mysqldumpslow -s c -t 10 /var/log/mysql/slow.log
通用查询日志可用grep过滤特定表或语句,快速定位异常请求来源。
# 查找对users表的所有操作 grep "users" /var/log/mysql/general.log
使用代码读取慢日志
也可以用脚本解析慢日志,提取执行时间大于阈值的SQL做统计。
import re
def parse_slow_log(path):
# 正则匹配慢日志中的Query_time与SQL
pattern = re.compile(r"Query_time: (d+.d+).*?n(.*?);", re.S)
with open(path) as f:
data = f.read()
for mt in pattern.finditer(data):
if float(mt.group(1)) > 1.0:
print("耗时:", mt.group(1), "SQL:", mt.group(2).strip())
parse_slow_log("/var/log/mysql/slow.log")
注意事项
- 通用查询日志量大,生产环境不宜长期开启。
- 慢查询日志需合理设置long_query_time,避免记录过多普通查询。
- 日志文件应注意权限与轮转,防止磁盘被写满。
通过对通用查询日志和慢查询日志的简单分析,我们能够更清楚地了解数据库的运行状态,及时发现并优化问题SQL。