MySQL 8.0 自动备份脚本:每天凌晨 1 点把数据库打包加密,3 天后自动删除,还能邮件通知! - 技术宅银魂 - 科技改变生活 - 万事屋 | 生活·动漫·娱乐综合社区-银魂同好聚集地

MySQL 8.0 自动备份脚本:每天凌晨 1 点把数据库打包加密,3 天后自动删除,还能邮件通知!

凌晨一点,我正刷着短视频,突然收到监控告警:“数据库磁盘剩余 2%”。心里咯噔一下,立刻滚去写备份脚本。折腾了一晚上,踩了无数坑,终于把这套“MySQL 8.0 自动备份脚本”整理出来,亲测 Debian 10.6 + Ubuntu 22.04 通杀。

如果你也在用 MySQL 8.0MariaDB 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

请登录后发表评论

    没有回复内容

万事屋新帖