先别急着关标签!我知道“自动优化”四个字听起来就像中年养生鸡汤,但当你某天早上发现数据库慢得能泡一杯面,而老板又在群里疯狂艾特你时,你就会后悔没早点把这篇文章收藏。今天这锅我背了,手把手教你用 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
没有回复内容