备份脚本一条龙:备份、压缩、异地、清理
发布时间:2025-11-13 13:37       
更新时间:2025-11-14 06:15
一套备份脚本要管五件事:备出来、压下去、传出去、清干净、失败了喊人。下面这份脚本逐行拆开讲,照着改成自己的参数就能用。
## 一、脚本全文
```
#!/bin/bash
set -e
DB_USER="backup"
DB_PASS="强密码"
DB_NAME="blog"
DEST="/backup/mysql"
DATE=$(date +%F)
FILE="$DEST/${DB_NAME}_$DATE.sql.gz"
mysqldump -u$DB_USER -p$DB_PASS --single-transaction $DB_NAME | gzip > "$FILE"
rsync -az "$FILE" backup@10.0.0.20:/backup/mysql/
find "$DEST" -name "*.sql.gz" -mtime +7 -delete
```
文件名里用年月日不够稳,补上时分更保险,同一天跑两次也不会互相覆盖。
## 二、逐行说明
set -e 让任何一步失败立刻退出,脚本的退出状态会如实反映成败,告警靠它触发。mysqldump 加 --single-transaction 保证导出一致性且不锁表;管道接 gzip 边备边压,SQL 文本通常能压到原来的十分之一。rsync 走 SSH 加密传输,异地机建议只允许密钥登录、禁止密码。find 按修改时间清理七天前的本地备份,滚动保留,磁盘不会被慢慢吃满。异地目录和本地保持同样的命名结构,恢复时不用翻找;rsync 首次跑通后日常只传增量,带宽开销很小。
## 三、失败告警怎么加
把主体包进函数,失败时推一条消息:
```
backup || curl -s -X POST "https://你的通知地址" \
-d "备份失败 $(hostname) $(date +%F' '%H:%M)"
```
哪怕只是一个群通知,也强过无声失败。反过来,每周固定收一次备份成功的例行汇报也有价值——哪天该来的消息没来,说明脚本本身出问题了。通知渠道至少配两条,群消息之外加一条短信或电话,夜里的故障没人盯着群看。
## 四、权限与上线自测
脚本 chmod 700;数据库密码放在仅 root 可读的独立配置文件里,比明文写在命令行安全(命令行参数用 ps 就能看到)。上线前手动跑三遍:异地机上确认文件到位,gunzip 解开检查 SQL 头尾完整,最后挑个时间真的恢复一次。恢复测试用最近的备份文件,别拿几个月前的旧文件糊弄自己;测完销毁临时实例,不留测试库在机器上游荡。
单库场景这个脚本够用,多库套个循环遍历库名即可。脚本里留一行运行日志,开始结束时间和文件大小各记一笔,出问题有据可查。脚本会越写越长,但备、压、传、清、警这五步骨架不会变。