文档首页> 技术教程> 备份脚本一条龙:备份、压缩、异地、清理

备份脚本一条龙:备份、压缩、异地、清理

发布时间: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 头尾完整,最后挑个时间真的恢复一次。恢复测试用最近的备份文件,别拿几个月前的旧文件糊弄自己;测完销毁临时实例,不留测试库在机器上游荡。 单库场景这个脚本够用,多库套个循环遍历库名即可。脚本里留一行运行日志,开始结束时间和文件大小各记一笔,出问题有据可查。脚本会越写越长,但备、压、传、清、警这五步骨架不会变。