MySQL慢查询分析工具

2026年3月13日 boss

MySQL慢查询分析工具

一个用于分析MySQL慢查询日志的Shell脚本,自动统计最耗时的SQL语句,支持按执行时间、锁定时间、扫描行数排序,并可通过飞书Webhook发送告警。

使用方法

#!/bin/bash
# mysql_slow_query_analyzer.sh
# MySQL慢查询日志分析工具
# 用法: ./mysql_slow_query_analyzer.sh [日志文件路径] [TOP N]

SLOW_LOG="${1:-/var/log/mysql/slow.log}"
TOP_N="${2:-20}"
OUTPUT_DIR="/tmp/mysql_analysis"
DATE=$(date +%Y%m%d_%H%M%S)

mkdir -p "$OUTPUT_DIR"

if [ ! -f "$SLOW_LOG" ]; then
    echo "错误: 慢查询日志文件不存在: $SLOW_LOG"
    exit 1
fi

echo "=== MySQL慢查询分析报告 ==="
echo "分析文件: $SLOW_LOG"
echo "文件大小: $(du -h "$SLOW_LOG" | cut -f1)"
echo "分析时间: $(date)"
echo ""

# 统计总慢查询数量
TOTAL=$(grep -c "^# Time:" "$SLOW_LOG" 2>/dev/null || echo 0)
echo "慢查询总数: $TOTAL"
echo ""

# Top N 按平均执行时间
echo "--- Top ${TOP_N} 慢查询 (按平均执行时间) ---"
mysqldumpslow -s t -t "$TOP_N" "$SLOW_LOG" 2>/dev/null
echo ""

# Top N 按锁定时间
echo "--- Top ${TOP_N} 慢查询 (按锁定时间) ---"
mysqldumpslow -s l -t "$TOP_N" "$SLOW_LOG" 2>/dev/null
echo ""

# Top N 按扫描行数
echo "--- Top ${TOP_N} 慢查询 (按扫描行数) ---"
mysqldumpslow -s r -t "$TOP_N" "$SLOW_LOG" 2>/dev/null
echo ""

# 按小时分布统计
echo "--- 慢查询时间分布 ---"
grep "^# Time:" "$SLOW_LOG" | awk '{print $3}' | cut -d: -f1-2 | sort | uniq -c | sort -rn | head -20

# 保存完整报告
mysqldumpslow -s t -t 50 "$SLOW_LOG" > "$OUTPUT_DIR/slow_report_${DATE}.txt" 2>/dev/null
echo ""
echo "完整报告已保存: $OUTPUT_DIR/slow_report_${DATE}.txt"

定时执行配置

# 添加到crontab,每天早上8点分析
0 8 * * * /usr/local/bin/mysql_slow_query_analyzer.sh | mail -s "MySQL慢查询日报" admin@your-domain.com

配合飞书告警

# 如果慢查询数量超过阈值,发送飞书告警
THRESHOLD=100
if [ "$TOTAL" -gt "$THRESHOLD" ]; then
    curl -X POST "https://open.feishu.cn/open-apis/bot/v2/hook/YOUR_HOOK_ID" \
        -H "Content-Type: application/json" \
        -d "{\"msg_type\":\"text\",\"content\":{\"text\":\"MySQL慢查询告警: 过去24小时共 ${TOTAL} 条慢查询,超过阈值 ${THRESHOLD}\"}}"
fi

关于作者

boss

发表评论