专业级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 "$@"
工具功能说明
- 核心检查项
- 实时状态:进程列表/InnoDB状态/TOP指标
- 配置审计:缓冲池/连接数/Redo日志等关键参数
- 性能分析:自动生成火焰图 + 慢查询报告
- 优化建议:内存配置/连接数/日志系统
- 使用方法
# 基础检查(需要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
- 安全说明
- 建议创建专属监控账号:
CREATE USER 'diag_user'@'localhost' IDENTIFIED BY 'DiagPass123!';
GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'diag_user'@'localhost';
扩展建议
- 增加巡检项
# 检查表碎片率
$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
- 集成告警
# 在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
注意事项:
- 首次运行需安装依赖:apt-get install percona-toolkit flamegraph
- 火焰图生成需要调试符号,建议安装mysql-server-dbg包
- 生产环境运行前建议在测试环境验证
本文暂时没有评论,来添加一个吧(●'◡'●)