下面三种办法,选一种做完就行,不用都做。 拿不准就选办法一 —— 它最简单,覆盖大多数情况。
整机备份既慢又占地方,而且恢复的时候你还是得重装一遍系统。 真正需要留下来的通常只有三类东西:
| 要备份的 | 一般在哪 |
|---|---|
| 你的网站 / 程序文件 | /var/www、/opt、/home |
| 数据库 | MySQL / PostgreSQL,要导出,不能直接拷文件 |
| 配置文件 | /etc/nginx、/etc/systemd/system、各种 .env |
mysqldump 这类导出命令。在服务器上把要留的东西打成一个包:
tar czf ~/backup-$(date +%Y%m%d).tgz \
/var/www /etc/nginx /opt/myapp有 MySQL 的话,先导出再一起打包:
mysqldump -u root -p --all-databases > ~/db-$(date +%Y%m%d).sql
tar czf ~/backup-$(date +%Y%m%d).tgz \
/var/www /etc/nginx ~/db-$(date +%Y%m%d).sql然后在自己电脑上(不是在服务器上)执行,把它拉回来:
scp -P 端口号 root@你的IP:~/backup-*.tgz .
Windows 用户不想敲命令的话,用 WinSCP 或者 FileZilla, 填 IP、端口、用户名密码连上去,把文件拖回本地就行。
用 rclone 把备份自动传到你的网盘(Google Drive、OneDrive、 对象存储都支持)。设置一次,以后每天自动跑。
1. 装 rclone:
curl https://rclone.org/install.sh | sudo bash
2. 连你的网盘,按提示一路选(新手全按默认回车,到授权那步会给你一个网址, 在浏览器里打开登录一下):
rclone config
3. 建一个备份脚本 /root/backup.sh, 把里面的路径和网盘名字换成你自己的:
#!/bin/bash set -e D=$(date +%Y%m%d) mysqldump -u root -p'你的数据库密码' --all-databases > /tmp/db-$D.sql tar czf /tmp/backup-$D.tgz /var/www /etc/nginx /tmp/db-$D.sql rclone copy /tmp/backup-$D.tgz 网盘名字:vps-backup/ rm -f /tmp/backup-$D.tgz /tmp/db-$D.sql # 只留最近 14 天的 rclone delete --min-age 14d 网盘名字:vps-backup/
4. 给它执行权限,先手工跑一次确认能成:
chmod +x /root/backup.sh && /root/backup.sh
5. 跑通了再加到定时任务里。执行 crontab -e,在最后加一行 (每天凌晨三点跑):
0 3 * * * /root/backup.sh >> /var/log/backup.log 2>&1
在另一台不会到期的机器上定时把这台的数据拉过去。 好处是这台机器就算突然没了,备份也不在它身上。
在那台机器上执行:
rsync -avz -e "ssh -p 端口号" \
root@这台的IP:/var/www/ /backup/vps-www/同样加进 crontab -e 就能每天自动跑。 先配好 SSH 密钥登录,否则 cron 里跑会卡在输密码那步。
花十分钟验一遍,以后就能安心了:
.sql 文件看一眼,里面应该有 INSERT INTO 这样的内容, 而不是只有几行注释更彻底的做法是买一台最便宜的机器,把备份恢复上去跑一遍。 如果这台机器上跑的是你的正经生意,这十几块钱值得花。
上面这些自己弄不来,或者需要大容量、长期稳定、批量采购的, 直接联系,免费提供技术支持,价格也可以谈。