Debian/Ubuntu 每天凌晨3点自动优化 MySQL/MariaDB 所有数据库

Debian/Ubuntu 每天凌晨3点自动优化 MySQL/MariaDB 所有数据库

先别急着关标签!我知道“自动优化”四个字听起来就像中年养生鸡汤,但当你某天早上发现数据库慢得能泡一杯面,而老板又在群里疯狂艾特你时,你就会后悔没早点把这篇文章收藏。今天这锅我背了,手把手教你用 Debian/Ubuntu 的 cron 定时器,每天凌晨3点给 MySQL/MariaDB 做全身 SPA。

一、为啥非要凌晨3点?

因为凌晨3点产品经理在睡觉,没人刷新页面,数据库可以放心“开刀”。如果你敢白天跑 OPTIMIZE TABLE,用户分分钟教你重新做人。

二、先检查你是不是“裸奔”

# 查看数据库大小,超过50 GB的土豪请自觉调高脚本超时时间
mysql -uroot -p -e "SELECT table_schema, ROUND(SUM(data_length+index_length)/1024/1024,2) AS 'MB' FROM information_schema.tables GROUP BY table_schema;"

如果看到某库飙到三位数,别慌,脚本里已经给你加了 --skip-extended-insert,省得内存爆炸。

三、一键脚本(人话版)

新建文件,名字别整花里胡哨,就叫:

sudo nano /opt/mysql_daily_opt.sh

把下面这段粘进去,注意把 YOUR_ROOT_PASS 换成你的真实密码,别学我当年把密码明文丢仓库,结果 GitHub 报警邮件比双十一短信还多。

#!/bin/bash
# mysql_daily_opt.sh
# 作用:每天凌晨3点自动优化所有库所有表
# 作者:万事屋的阿银

USER="root"
PASS="YOUR_ROOT_PASS"
LOG="/var/log/mysql_opt.log"

# 时间戳
echo "[$(date '+%F %T')] 开始批量 OPTIMIZE" >> $LOG

# 循环所有库
for DB in $(mysql -u$USER -p$PASS -e "SHOW DATABASES;" -B -N | grep -E -v 'information_schema|performance_schema|mysql|sys'); do
    # 循环所有表
    for TBL in $(mysql -u$USER -p$PASS -D $DB -e "SHOW TABLES;" -B -N); do
        echo "[$(date '+%F %T')] 正在处理 $DB.$TBL" >> $LOG
        mysql -u$USER -p$PASS -D $DB -e "OPTIMIZE TABLE \`$TBL\`;" >> $LOG 2>&1
    done
done

echo "[$(date '+%F %T')] 全部搞定,睡觉!" >> $LOG

保存后给执行权限:

sudo chmod +x /opt/mysql_daily_opt.sh

四、扔进 cron,让它3点自己爬起来干活

sudo crontab -e

最后一行加:

0 3 * * * /opt/mysql_daily_opt.sh >/dev/null 2>&1

保存退出,cron 不会给你任何提示,就像前任一样安静。

五、第二天验收成果

tail -f /var/log/mysql_opt.log

看到 “全部搞定,睡觉!” 就说明没翻车。如果报错 “Table does not support optimize, doing recreate + analyze”,别紧张,那是 InnoDB 的正常操作,不是脚本在骂你。

六、可选彩蛋:把优化结果发到企业微信/钉钉

想装X?curl 调用群机器人,把日志最后10行发过去,让老板以为你通宵值班,其实你在睡觉。具体 hook 地址自己找公司网管要,别问我,我怕被你们运维打。

七、常见翻车现场 FAQ

  • Q:会不会锁表?
    A:InnoDB 从 5.6 开始 OPTIMIZE 是在线 DDL,但大表还是会 IO 飙升,建议先在测试库跑一遍。
  • Q:密码明文太危险?
    A:可以用 mysql_config_editor 整一个 .mylogin.cnf,但教程太长,评论区要是超过100条我就补。
  • Q:想跳过某些库?
    A:把 grep -v 后面再追加 |grep -v '你不想动的库名',简单粗暴。

八、总结

脚本虽小,却能让你少掉三根头发。别等数据库卡成 PPT 才想起优化,凌晨3点的 cron 才是真爱。把这篇文章转发到群里,下次出事至少你能甩锅:“我脚本跑了,不信看日志!”

—— 万事屋
转载请保留出处:https://www.rei3.com

请登录后发表评论

    没有回复内容

万事屋新帖