编程技术分享平台

网站首页 > 技术教程 正文

专业级MySQL诊断脚本 mysql_diag.sh

xnh888 2025-03-14 22:00:56 技术教程 48 ℃ 0 评论

专业级MySQL诊断脚本 mysql_diag.sh,包含实时状态捕获配置审计性能分析三大核心模块:

#!/bin/bash
# MySQL性能快速诊断工具 v1.2
# 作者:YourName
# 最后更新:2024-03-15

# 配置区域(根据环境修改)
MYSQL_USER="diag_user"
MYSQL_PASS="DiagPass123!"
LOG_DIR="/tmp/mysql_diag_$(date +%Y%m%d_%H%M%S)"
MYSQL_CMD="mysql -u$MYSQL_USER -p$MYSQL_PASS"
PERF_DURATION=30  # 性能采样时长(秒)

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# 初始化环境
init_env() {
    mkdir -p $LOG_DIR/{status,config,performance,advice}
    echo "[+] 诊断报告目录: $LOG_DIR"
}

# 检查依赖工具
check_dependencies() {
    local missing=()
    which mysql >/dev/null || missing+=("mysql-client")
    which perl >/dev/null || missing+=("perl")
    which pt-query-digest >/dev/null || missing+=("percona-toolkit")
    
    if [ ${#missing[@]} -gt 0 ]; then
        echo -e "${RED}[!] 缺少依赖工具: ${missing[*]}${NC}"
        exit 1
    fi
}

# 基础状态捕获
capture_basic_status() {
    echo -e "${YELLOW}[*] 采集基础状态...${NC}"
    
    # 进程列表
    $MYSQL_CMD -e "SHOW FULL PROCESSLIST" > $LOG_DIR/status/processlist.txt
    
    # InnoDB状态
    $MYSQL_CMD -e "SHOW ENGINE INNODB STATUS\G" > $LOG_DIR/status/innodb_status.txt
    
    # 全局变量
    $MYSQL_CMD -e "SHOW GLOBAL VARIABLES" > $LOG_DIR/config/global_variables.txt
    
    # 系统指标
    top -b -n 1 > $LOG_DIR/performance/top.txt
    iostat -dx 1 5 > $LOG_DIR/performance/iostat.txt &
    pidstat -d 1 5 > $LOG_DIR/performance/pidstat.txt &
}

# 高级性能分析
capture_advanced_metrics() {
    echo -e "${YELLOW}[*] 执行深度性能分析...${NC}"
    
    # 慢查询日志分析
    if grep -q "slow_query_log.*= ON" $LOG_DIR/config/global_variables.txt; then
        pt-query-digest $(grep "slow_query_log_file" $LOG_DIR/config/global_variables.txt | cut -f2) \
            > $LOG_DIR/performance/slow_query_analysis.txt
    else
        echo -e "${RED}[!] 慢查询日志未开启${NC}"
    fi
    
    # Perf火焰图采集
    if which perf >/dev/null; then
        perf record -F 99 -p $(pgrep -x mysqld) -g -- sleep $PERF_DURATION
        perf script | stackcollapse-perf.pl | flamegraph.pl > $LOG_DIR/performance/flamegraph.svg
    else
        echo -e "${RED}[!] perf工具未安装,跳过火焰图生成${NC}"
    fi
}

# 配置审计
audit_config() {
    echo -e "${YELLOW}[*] 执行配置审计...${NC}"
    
    # 关键参数检查
    local params=("innodb_buffer_pool_size" "max_connections" "innodb_flush_log_at_trx_commit")
    for param in "${params[@]}"; do
        grep "^$param" $LOG_DIR/config/global_variables.txt >> $LOG_DIR/advice/config_advice.txt
    done
    
    # Redo日志配置建议
    local innodb_log_file_size=$(grep "innodb_log_file_size" $LOG_DIR/config/global_variables.txt | awk '{print $2}')
    local innodb_log_files_in_group=$(grep "innodb_log_files_in_group" $LOG_DIR/config/global_variables.txt | awk '{print $2}')
    local redo_total=$(($innodb_log_file_size * $innodb_log_files_in_group))
    [ $redo_total -lt 4096 ] && echo "Redo日志总大小($redo_total MB)可能偏小,建议至少4GB" >> $LOG_DIR/advice/config_advice.txt
}

# 生成建议报告
generate_advice() {
    echo -e "${YELLOW}[*] 生成优化建议...${NC}"
    
    # 内存建议
    local buffer_pool=$(grep "innodb_buffer_pool_size" $LOG_DIR/config/global_variables.txt | awk '{print $2}')
    local total_mem=$(free -m | awk '/Mem:/{print $2}')
    local recommended=$(($total_mem * 70 / 100))
    [ $buffer_pool -lt $recommended ] && \
        echo "InnoDB缓冲池当前配置为${buffer_pool}MB,建议设置为物理内存的70%(约${recommended}MB)" >> $LOG_DIR/advice/memory_advice.txt
    
    # 连接数检查
    local max_conn=$(grep "max_connections" $LOG_DIR/config/global_variables.txt | awk '{print $2}')
    local used_conn=$(grep "Threads_connected" $LOG_DIR/status/innodb_status.txt | awk '{print $2}')
    [ $used_conn -gt $(($max_conn * 80 / 100)) ] && \
        echo "当前连接数使用率超过80%,请检查连接泄漏或考虑增加max_connections" >> $LOG_DIR/advice/connection_advice.txt
}

# 主函数
main() {
    init_env
    check_dependencies
    capture_basic_status
    capture_advanced_metrics
    audit_config
    generate_advice
    
    echo -e "${GREEN}[√] 诊断完成!结果保存在:${NC}"
    tree $LOG_DIR
}

# 执行入口
main "$@"

工具功能说明

  1. 核心检查项
  • 实时状态:进程列表/InnoDB状态/TOP指标
  • 配置审计:缓冲池/连接数/Redo日志等关键参数
  • 性能分析:自动生成火焰图 + 慢查询报告
  • 优化建议:内存配置/连接数/日志系统
  1. 使用方法
# 基础检查(需要MySQL账号权限)
./mysql_diag.sh

# 生成火焰图(需root权限)
sudo perf record -g -p $(pgrep -x mysqld) -- sleep 30

# 输出示例
/tmp/mysql_diag_20240315_1134
├── advice
│   ├── config_advice.txt   # 配置调优建议
│   └── memory_advice.txt   # 内存优化建议
├── config
│   └── global_variables.txt # 全部全局变量
└── performance
    ├── flamegraph.svg      # 交互式火焰图
    └── slow_query_analysis.txt  # 慢查询TOP10
  1. 安全说明
  • 建议创建专属监控账号:
CREATE USER 'diag_user'@'localhost' IDENTIFIED BY 'DiagPass123!';
GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'diag_user'@'localhost';

扩展建议

  1. 增加巡检项
# 检查表碎片率
$MYSQL_CMD -e "SELECT TABLE_SCHEMA,TABLE_NAME,
    DATA_LENGTH/1024/1024 AS data_mb,
    INDEX_LENGTH/1024/1024 AS index_mb, 
    DATA_FREE/1024/1024 AS free_mb 
    FROM information_schema.TABLES 
    WHERE DATA_FREE > 100*1024*1024;" > $LOG_DIR/status/fragmentation.txt
  1. 集成告警
# 在generate_advice()中添加
local slow_count=$(grep -c "# Query" $LOG_DIR/performance/slow_query_analysis.txt)
[ $slow_count -gt 50 ] && echo "警告:发现${slow_count}条慢查询!" >> $LOG_DIR/advice/alert.txt

注意事项

  1. 首次运行需安装依赖:apt-get install percona-toolkit flamegraph
  2. 火焰图生成需要调试符号,建议安装mysql-server-dbg包
  3. 生产环境运行前建议在测试环境验证

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表