#!/bin/bash
# MySQL优化脚本
# 在这里填写您的MySQL root密码(从宝塔面板获取)
MYSQL_PASSWORD="填写您的MySQL root密码"
LOG_DIR="/www/wwwlogs/mysql_optimize"
mkdir -p $LOG_DIR
LOG_FILE="$LOG_DIR/fix_$(date +%Y%m%d).log"
echo "=== MySQL优化开始: $(date) ===" > $LOG_FILE
# 测试连接
if mysql -uroot -p"$MYSQL_PASSWORD" -e "SELECT 1;" > /dev/null 2>&1; then
echo "✅ MySQL连接成功" >> $LOG_FILE
else
echo "❌ MySQL连接失败,请检查密码是否正确" >> $LOG_FILE
echo "当前使用的密码: ${MYSQL_PASSWORD:0:3}******" >> $LOG_FILE
exit 1
fi
# 开始真正的优化
echo "开始优化数据库表..." >> $LOG_FILE
# 获取所有非系统数据库
DATABASES=$(mysql -uroot -p"$MYSQL_PASSWORD" -Nse "SHOW DATABASES" | grep -Ev "(mysql|information_schema|performance_schema|sys|test)")
if [ -z "$DATABASES" ]; then
echo "没有找到可优化的数据库" >> $LOG_FILE
exit 0
fi
OPT_COUNT=0
for DB in $DATABASES; do
echo "处理数据库: $DB" >> $LOG_FILE
# 只优化有碎片的表(大于1MB碎片)
TABLES=$(mysql -uroot -p"$MYSQL_PASSWORD" -Nse "
SELECT TABLE_NAME
FROM information_schema.TABLES
WHERE TABLE_SCHEMA='$DB'
AND DATA_FREE > 1048576
LIMIT 5" 2>/dev/null)
for TABLE in $TABLES; do
echo " 优化表: $TABLE" >> $LOG_FILE
mysql -uroot -p"$MYSQL_PASSWORD" -e "OPTIMIZE TABLE \`$DB\`.\`$TABLE\`" >> $LOG_FILE 2>&1
((OPT_COUNT++))
sleep 0.5
done
done
echo "=== 优化完成: $(date) ===" >> $LOG_FILE
echo "共优化表: $OPT_COUNT 个" >> $LOG_FILE
# 清理7天前的日志
find $LOG_DIR -name "*.log" -mtime +7 -delete 2>/dev/null
echo ""
echo "优化完成!耗时: ${SECONDS}秒"
echo "优化的数据库: $(echo $DATABASES | tr '\n' ' ')"
echo "优化表数量: $OPT_COUNT 个"
echo "详细日志: $LOG_FILE"
4. 设置宝塔计划任务
脚本路径:/root/mysql_fix.sh(或您选择的脚本)
执行时间:建议每周日凌晨3点(访问量最低时)
频率:每周一次即可,不需要每天
方案2:完整的一键安装脚本
# 完整的一键安装命令(包含权限设置)
bash -c '
echo "正在安装MySQL优化脚本..."
# 1. 创建脚本文件
cat > /root/mysql_daily_optimize.sh << "EOF"
#!/bin/bash
# MySQL每日优化脚本
# 真正优化业务数据库
LOG_DIR="/www/wwwlogs/mysql_optimize"
mkdir -p $LOG_DIR
LOG_FILE="$LOG_DIR/optimize_$(date +%Y%m%d).log"
echo "=== 开始优化: $(date) ===" > $LOG_FILE
# 使用宝塔MySQL密码
BT_PASS=$(cat /www/server/panel/default.pl 2>/dev/null)
# 获取业务数据库
DBS=$(mysql -uroot -p$BT_PASS -Nse "SHOW DATABASES" 2>/dev/null | grep -Ev "(mysql|information_schema|performance_schema|sys|test)")
OPT_COUNT=0
for DB in $DBS; do
echo "优化数据库: $DB" >> $LOG_FILE
# 只优化有碎片的表
TABLES=$(mysql -uroot -p$BT_PASS -Nse "
SELECT TABLE_NAME
FROM information_schema.TABLES
WHERE TABLE_SCHEMA=\"$DB\"
AND DATA_FREE > 1048576
LIMIT 5" 2>/dev/null)
for TABLE in $TABLES; do
echo " 优化表: $TABLE" >> $LOG_FILE
mysql -uroot -p$BT_PASS -e "OPTIMIZE TABLE \`$DB\`.\`$TABLE\`" >> $LOG_FILE 2>&1
((OPT_COUNT++))
done
done
echo "=== 优化完成: $(date) ===" >> $LOG_FILE
echo "共优化表: $OPT_COUNT 个" >> $LOG_FILE
# 清理旧日志
find $LOG_DIR -name "*.log" -mtime +7 -delete
EOF
# 2. 设置正确权限
chmod 755 /root/mysql_daily_optimize.sh # ✅ 重要:755权限
# 3. 创建日志目录
mkdir -p /www/wwwlogs/mysql_optimize
chmod 755 /www/wwwlogs/mysql_optimize
echo "✅ 安装完成!"
echo "脚本位置: /root/mysql_daily_optimize.sh"
echo "脚本权限: $(ls -l /root/mysql_daily_optimize.sh | awk "{print \$1}")"
echo ""
echo "请在宝塔计划任务中添加:"
echo "执行周期: 每天 03:00"
echo "脚本内容: /root/mysql_daily_optimize.sh"
'
版权声明:原创作品,未经允许不得转载,否则将追究法律责任。
本站资源有的自互联网收集整理,如果侵犯了您的合法权益,请联系本站我们会及时删除。
本站资源仅供研究、学习交流之用,若使用商业用途,请购买正版授权,否则产生的一切后果将由下载用户自行承担。
本文链接:源头网https://www.58588885.com/34433.html
许可协议:《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权
本站资源有的自互联网收集整理,如果侵犯了您的合法权益,请联系本站我们会及时删除。
本站资源仅供研究、学习交流之用,若使用商业用途,请购买正版授权,否则产生的一切后果将由下载用户自行承担。
本文链接:源头网https://www.58588885.com/34433.html
许可协议:《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权

