运维有两件事平时看不出价值、出事时能救命:备份监控。这篇讲最小可用的做法。

一、备份 3-2-1 原则

  • 3 份数据(1 份原始 + 2 份备份)
  • 2 种不同介质(如本地磁盘 + 云存储/异地)
  • 1 份异地(防机房/服务器整体故障)

哪怕只做到"定时备份 + 一份传到异地",也比不备份强一百倍。

二、文件备份 rsync

# 把 /var/www 同步到备份目录(增量)
rsync -avz /var/www/ /backup/www/

# 同步到远程服务器
rsync -avz /var/www/ user@backup-host:/backup/www/

-a 保留权限/时间戳,-z 压缩,--delete 让目标与源完全一致(慎用)。

三、数据库备份 mysqldump

# 单库
mysqldump -u root -p mydb > /backup/mydb_$(date +%F).sql

# 全部库
mysqldump -u root -p --all-databases > /backup/all_$(date +%F).sql

# 恢复
mysql -u root -p mydb < /backup/mydb_2026-08-15.sql

大库建议用 --single-transaction(InnoDB 不锁表)或物理备份工具,初级先用 mysqldump。

四、定时备份脚本

/opt/backup.sh

#!/usr/bin/env bash
set -e
DIR=/backup
DATE=$(date +%F)
mkdir -p "$DIR"

# 备份数据库
mysqldump -u root -p'密码' --all-databases | gzip > "$DIR/db_$DATE.sql.gz"

# 备份网站
tar czf "$DIR/www_$DATE.tar.gz" /var/www

# 只保留最近 7 份
find "$DIR" -name "*.gz" -mtime +7 -delete
chmod +x /opt/backup.sh
crontab -e
# 每天凌晨 3 点执行
0 3 * * * /opt/backup.sh >> /var/log/backup.log 2>&1

五、轻量监控脚本

不装重型监控,用 shell 脚本盯三件事:磁盘、内存、服务存活。

#!/usr/bin/env bash
# 磁盘使用率超 90% 告警
USAGE=$(df / | tail -1 | awk '{print $5}' | tr -d '%')
if [ "$USAGE" -gt 90 ]; then
  curl -s "https://你的webhook地址" -d '{"msg":"磁盘告警:使用率 '$USAGE'%"}'
fi

# 服务没在跑就告警
if ! systemctl is-active --quiet nginx; then
  curl -s "https://你的webhook地址" -d '{"msg":"nginx 挂了"}'
fi

放到 cron 每 5 分钟跑一次。

六、告警通道(飞书/钉钉/Server酱)

都是"往一个 webhook URL 发 POST 请求":

  • Server酱:微信推送,最简单,https://sctapi.ftqq.com/<SENDKEY>.send?title=xxx
  • 飞书/钉钉:群机器人 webhook,POST JSON
# Server酱 示例
curl -s "https://sctapi.ftqq.com/你的KEY.send" \
  --data-urlencode "title=磁盘告警" \
  --data-urlencode "desp=使用率 92%"

拿到 key 就能接到前面的监控脚本里。

小结

目标最小方案
备份文件rsync + 定时
备份数据库mysqldump + 定时 + 保留 N 份
监控磁盘/内存/服务存活 shell 脚本 + cron
告警Server酱 / 飞书 / 钉钉 webhook

备份要定期做 + 定期验证能恢复(备份不恢复等于没备份),监控要能真正触达你(别静默失败)。