凌晨一点,我正刷着短视频,突然收到监控告警:“数据库磁盘剩余 2%”。心里咯噔一下,立刻滚去写备份脚本。折腾了一晚上,踩了无数坑,终于把这套“MySQL 8.0 自动备份脚本”整理出来,亲测 Debian 10.6 + Ubuntu 22.04 通杀。
如果你也在用 MySQL 8.0 或 MariaDB 10.6 以上版本,想每天 自动备份数据库 到内网备份服务器,并且zip 加密压缩、3 天自动清理、邮件通知,请直接抄作业。
一、场景吐槽
- 主库:Debian 10.6,IP 192.168.1.101,MySQL 8.0
- 备份机:Ubuntu 22.04,IP 192.168.1.100,SSH 端口12345
- 需求:每天 1:00 备份 aaa、bbb、ccc 三个库,zip 密码分别是 aaaa、bbbb、cccc
- 保留策略:本地 & 备份机各留 3 天
- 通知:邮件给 lalala@rei3.com
二、一次性准备(主库 192.168.1.101 执行)
# 1. 装工具
sudo apt update && sudo apt install -y zip bsd-mailx sshpass cron
# 2. 建目录
sudo mkdir -p /home/backup/mysql8
sudo chown -R $USER:$USER /home/bakcup
# 3. 配置外发 SMTP(bsd-mailx)
sudo tee -a /etc/mail.rc <<'EOF'
set from="sender@mgrei.com"
set smtp="smtp.mgrei.com:587"
set smtp-use-starttls
set smtp-auth=login
set smtp-auth-user="sender@mgrei.com"
set smtp-auth-password="YOUR_SMTP_PASS"
EOF
# 4. 解决 mysqldump 1130 报错
mysql -uroot -p -e "
CREATE USER IF NOT EXISTS 'root'@'127.0.0.1' IDENTIFIED BY 'your_mysql_root_pass';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' WITH GRANT OPTION;
FLUSH PRIVILEGES;"
三、备份脚本(直接复制就能跑)
#!/bin/bash
# mysql_backup.sh
set -e
LOCAL_DIR="/home/backup/mysql8"
BACKUP_HOST="192.168.1.100"
BACKUP_PORT="12345"
BACKUP_USER="ubuntu"
BACKUP_PASS="YOUR_BACKUP_SSH_PASS"
BACKUP_DIR="/home/backup/mysql8-bak"
declare -A DB_PASS=([aaa]="aaaa" [bbb]="bbbb" [ccc]="cccc")
MYSQL_USER="root"
MYSQL_PASS="your_mysql_root_pass"
MAIL_TO="lalala@rei3.com"
RETAIN=3
DATE=$(date +%Y%m%d_%H%M%S)
cleanup() {
find "$1" -type f -name "*.zip" -mtime +$RETAIN -delete
}
for DB in "${!DB_PASS[@]}"; do
SQL="${DB}_${DATE}.sql"
ZIP="${DB}_${DATE}.zip"
mysqldump -h127.0.0.1 -u"$MYSQL_USER" -p"$MYSQL_PASS" \
--single-transaction --routines --triggers "$DB" > "$LOCAL_DIR/$SQL"
zip -P "${DB_PASS[$DB]}" "$LOCAL_DIR/$ZIP" "$LOCAL_DIR/$SQL"
rm -f "$LOCAL_DIR/$SQL"
# 上传到备份机(端口 12345,密码登录)
sshpass -p "$BACKUP_PASS" scp -P "$BACKUP_PORT" "$LOCAL_DIR/$ZIP" \
"$BACKUP_USER@$BACKUP_HOST:$BACKUP_DIR/"
done
cleanup "$LOCAL_DIR"
sshpass -p "$BACKUP_PASS" ssh -p "$BACKUP_PORT" "$BACKUP_USER@$BACKUP_HOST" \
"find $BACKUP_DIR -type f -name '*.zip' -mtime +$RETAIN -delete"
echo "MySQL 自动备份完成 $(date +%F)" | mail -s "MySQL 备份" "$MAIL_TO"
保存后赋权:
chmod +x /home/backup/mysql8/mysql_backup.sh
四、定时任务(每天 1:00)
(crontab -l 2>/dev/null; echo "0 1 * * * /home/backup/mysql8/mysql_backup.sh >> /home/backup/mysql8/backup.log 2>&1") | crontab -
五、验证
# 手动跑一次
bash /home/backup/mysql8/mysql_backup.sh
# 查看日志
tail -f /home/backup/mysql8/backup.log
六、踩坑总结
- 1130 报错:root 没权限连 127.0.0.1,按上文授权即可。
- 端口 12345:scp/ssh 都要加
-P 12345
。 - 禁止密钥:用
sshpass -p
传密码,简单暴力。
好了,脚本已上线,今晚可以安心睡觉。如果哪天凌晨 1 点又收到告警,记得先喝杯咖啡再检查日志。
万事屋原创 · 转载请注明出处
https://www.rei3.com
没有回复内容