从实列中学习linux shell12 通过Shell脚本来优化MySQL数据库性能,特别是慢SQL跟踪和索引优化

在Shell脚本中优化MySQL数据库性能,特别是慢SQL跟踪和索引优化

可以通过以下步骤实现。以下是一个结构化的解决方案,包含示例代码和详细说明:


1. 启用慢查询日志

目标:动态启用慢查询日志并配置参数,收集慢SQL数据。

bash 复制代码
#!/bin/bash

# 配置慢查询参数
MYSQL_USER="root"
MYSQL_PASS="your_password"
SLOW_LOG_PATH="/var/log/mysql/mysql-slow.log"
LONG_QUERY_TIME=1  # 记录超过1秒的查询

# 动态启用慢查询日志(无需重启)
mysql -u$MYSQL_USER -p$MYSQL_PASS -e "
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = $LONG_QUERY_TIME;
SET GLOBAL slow_query_log_file = '$SLOW_LOG_PATH';
"

# 可选:修改配置文件持久化设置(需重启MySQL)
sudo sed -i '/^#slow_query_log/ c\slow_query_log = ON' /etc/mysql/my.cnf
sudo sed -i "/^#long_query_time/ c\long_query_time = $LONG_QUERY_TIME" /etc/mysql/my.cnf
sudo systemctl restart mysql

echo "慢查询日志已启用,日志路径:$SLOW_LOG_PATH"

2. 分析慢查询日志

目标:使用工具分析日志并生成报告。

bash 复制代码
# 安装Percona Toolkit(如未安装)
if ! command -v pt-query-digest &> /dev/null; then
    echo "安装Percona Toolkit..."
    sudo apt-get install percona-toolkit
fi

# 生成慢查询分析报告
REPORT_FILE="slow_query_report.txt"
pt-query-digest $SLOW_LOG_PATH > $REPORT_FILE

echo "慢查询分析报告已生成:$REPORT_FILE"

3. 索引优化分析

目标:检查缺失或冗余索引,生成优化建议。

bash 复制代码
# 生成索引优化建议
INDEX_REPORT="index_optimization_report.txt"

# 检查未使用的索引
mysql -u$MYSQL_USER -p$MYSQL_PASS -e "
SELECT object_schema, object_name, index_name
FROM sys.schema_unused_indexes;
" >> $INDEX_REPORT

# 检查冗余索引
mysql -u$MYSQL_USER -p$MYSQL_PASS -e "
SELECT table_schema, table_name, index_name, redundant_index_name
FROM sys.schema_redundant_indexes;
" >> $INDEX_REPORT

echo "索引优化建议已生成:$INDEX_REPORT"

4. 定期维护任务

目标:自动执行表分析和统计信息更新。

bash 复制代码
# 分析所有表以更新统计信息
DATABASES=$(mysql -u$MYSQL_USER -p$MYSQL_PASS -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema|sys)")

for DB in $DATABASES; do
    TABLES=$(mysql -u$MYSQL_USER -p$MYSQL_PASS -e "SHOW TABLES FROM $DB;" | tail -n +2)
    for TABLE in $TABLES; do
        mysql -u$MYSQL_USER -p$MYSQL_PASS -e "ANALYZE TABLE $DB.$TABLE;"
    done
done

echo "表统计信息已更新"

5. 自动化脚本整合

完整脚本示例:将上述步骤整合为定时任务。

bash 复制代码
#!/bin/bash

# 配置参数
MYSQL_USER="root"
MYSQL_PASS="your_password"
SLOW_LOG_PATH="/var/log/mysql/mysql-slow.log"
LONG_QUERY_TIME=1
REPORT_DIR="/opt/mysql_reports"

mkdir -p $REPORT_DIR

# 启用慢查询日志
mysql -u$MYSQL_USER -p$MYSQL_PASS -e "
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = $LONG_QUERY_TIME;
SET GLOBAL slow_query_log_file = '$SLOW_LOG_PATH';
"

# 等待收集数据(例如1小时)
sleep 3600

# 关闭慢查询日志(可选)
mysql -u$MYSQL_USER -p$MYSQL_PASS -e "SET GLOBAL slow_query_log = 'OFF';"

# 生成慢查询报告
pt-query-digest $SLOW_LOG_PATH > $REPORT_DIR/slow_query_$(date +%F).txt

# 生成索引优化报告
mysql -u$MYSQL_USER -p$MYSQL_PASS -e "
SELECT object_schema, object_name, index_name
FROM sys.schema_unused_indexes;
" > $REPORT_DIR/index_unused_$(date +%F).txt

mysql -u$MYSQL_USER -p$MYSQL_PASS -e "
SELECT table_schema, table_name, index_name, redundant_index_name
FROM sys.schema_redundant_indexes;
" > $REPORT_DIR/index_redundant_$(date +%F).txt

# 发送邮件通知(可选)
echo "性能报告已生成" | mail -A "$REPORT_DIR/*_$(date +%F).txt" admin@example.com

关键说明

  1. 慢查询日志

    • 动态启用日志无需重启,但需确保log_output=FILE
    • 使用pt-query-digest可生成更详细的报告(比mysqldumpslow更强大)。
  2. 索引优化

    • 通过sys.schema_unused_indexesschema_redundant_indexes快速定位问题。
    • 生成报告后,手动审核建议再执行ALTER TABLE操作。
  3. 定期维护

    • 使用ANALYZE TABLE更新统计信息,帮助优化器选择更优的执行计划。
    • 可将脚本加入cron定时任务,例如每天凌晨执行。

注意事项

  • 权限 :确保MySQL用户有权限访问sys库和修改全局变量。
  • 日志管理:定期清理慢查询日志,避免磁盘空间不足。
  • 生产环境:谨慎在高峰时段启用日志,避免I/O压力。

通过上述脚本,可自动化实现MySQL性能监控与优化,显著提升数据库效率。

相关推荐
卑微的小李几秒前
Qt在Linux下编译发布 -- linuxdeployqt的使用
linux·c++·qt
小猪写代码13 分钟前
Ubuntu 的磁盘管理
linux·ubuntu
zhz521435 分钟前
从PostgreSQL到人大金仓(KingBase)数据库迁移实战:Spring Boot项目完整迁移指南
数据库·spring boot·postgresql
万行1 小时前
点评项目(Redis中间件)&第一部分Redis基础
java·数据库·redis·缓存·中间件
SelectDB1 小时前
Apache Doris 登顶 RTABench —— 实时分析领域的性能王者
数据库·数据分析·开源
用户6279947182621 小时前
南大通用GBase 8a加载常见错误原因
数据库
咸甜适中1 小时前
rust语言(1.88.0)sqlite数据库rusqlite库(0.37.0)学习笔记
数据库·rust·sqlite·rusqlite
Jasonakeke1 小时前
【重学 MySQL】九十二、 MySQL8 密码强度评估与配置指南
android·数据库·mysql
heath ceTide2 小时前
第二章从事件驱动到信号
数据库·系统架构
StarRocks_labs2 小时前
欧洲数字化养殖平台 Herdwatch 借力 Iceberg + StarRocks 提升分析能力
数据库·starrocks·iceberg·湖仓一体架构·herdwatch