服务器全自动备份与恢复方案教程
为什么你的服务器需要一个全自动备份方案
服务器数据丢失可能来自误删、勒索病毒、硬盘故障甚至机房断电。
手动备份容易遗忘,而全自动备份可以在无人干预下每天把重要数据安全复制到远程位置。
本文带你在 Linux 服务器上用最常见的工具(cron + rsync)搭建一套可落地的备份恢复方案,全部操作通过命令行完成,零基础也能跟着做。
准备工作:你需要知道这三件事
在动手之前,请确认你的服务器满足以下条件:
- 一台 Linux 服务器(本文以 Ubuntu 20.04 为例,CentOS 差异很小)
- SSH 登录权限(能执行 sudo 命令)
- 一个远程备份目标:可以是另一台服务器(通过 SSH 访问)、挂载的 NAS 目录,或者云存储(如 S3、阿里云 OSS)。本文以远程 SSH 服务器为例,因为最简单且通用。
另外,请确保服务器上已安装 rsync。
如果没有,用以下命令安装:
sudo apt update && sudo apt install rsync -y # Debian/Ubuntu
sudo yum install rsync -y # CentOS/RHEL
动手搭备份:写脚本 + 配置定时任务
第一步:编写备份脚本
创建一个脚本文件,例如 /usr/local/bin/backup.sh:
sudo nano /usr/local/bin/backup.sh
粘贴以下内容(记得替换其中的路径和用户信息):
#!/bin/bash
# 服务器全自动备份脚本 - 每天凌晨执行
# 要备份的本地目录(根据需要修改)
SOURCE_DIR="/var/www/html /etc/nginx /etc/mysql"
# 远程备份服务器信息
REMOTE_USER="backupuser"
REMOTE_HOST="192.168.1.100"
REMOTE_DIR="/backups/$(hostname)/"
# 日志文件
LOG_FILE="/var/log/backup.log"
# 开始备份
echo "[$(date +'%Y-%m-%d %H:%M:%S')] 开始备份..." >> $LOG_FILE
# 使用 rsync 增量备份,保留目录结构,压缩传输
for dir in $SOURCE_DIR; do
rsync -avz --delete -e ssh $dir ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR} 2>&1 >> $LOG_FILE
if [ $? -eq 0 ]; then
echo "[$(date)] 成功备份: $dir" >> $LOG_FILE
else
echo "[$(date)] 备份失败: $dir" >> $LOG_FILE
fi
done
echo "[$(date)] 备份完成。" >> $LOG_FILE
保存后赋予执行权限:
sudo chmod +x /usr/local/bin/backup.sh
关键说明:rsync 的 --delete 参数会删除远程目标中已不存在的文件,保持两端严格一致。
如果不需要自动清理,可以去掉该参数。
首次运行需要手动建立 SSH 免密登录(见下文避坑部分)。
第二步:设置定时任务
用 crontab 让脚本每天凌晨 2:00 自动运行:
sudo crontab -e
在文件末尾添加一行:
0 2 * * * /usr/local/bin/backup.sh
保存退出即可。
如果想每 6 小时备份一次,可以改为 0 */6 * * *。
第三步:恢复数据方法
当需要恢复时,只需反向执行 rsync 即可。
例如恢复 /var/www/html:
rsync -avz -e ssh backupuser@192.168.1.100:/backups/你的主机名/var/www/html/ /var/www/html/
如果恢复整个目录,记得加上 --delete 确保目标与备份一致,但务必先在测试环境操作。
避坑指南:新手最容易翻车的三个地方
1. SSH 免密登录没配置好
脚本中 rsync -e ssh 需要无密码登录远程服务器。
先在本机生成密钥:
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N ""
然后复制公钥到远程备份服务器:
ssh-copy-id backupuser@192.168.1.100
首次连接需要输入密码,之后就不需要了。
如果 ssh-copy-id 命令不可用,可以手动将 ~/.ssh/id_rsa.pub 内容追加到远程服务器的 ~/.ssh/authorized_keys 文件中。
2. 磁盘空间不足
远程备份目录很快会被占满。
建议在远程服务器上设置配额,或者用 --max-size 限制单个文件大小。
也可以搭配 tmpreaper 定期清理旧备份(如需保留多个版本,请改用 rsnapshot 方案)。
3. 权限问题导致备份不全
脚本默认用 root 执行 crontab,因此一般有权限读取所有目录。
但如果你用普通用户运行备份,记得用 sudo 或给脚本加上 setuid。
否则某些系统文件(如 /etc/shadow)会报“权限不足”错误。
验证方案:确保备份真的能恢复
检查日志
每次备份都会记录到 /var/log/backup.log,你可以用 tail -f 实时查看:
tail -f /var/log/backup.log
模拟一次恢复测试
在测试机或临时目录中尝试恢复一个文件:
mkdir /tmp/restore_test
rsync -avz -e ssh backupuser@192.168.1.100:/backups/你的主机名/var/www/html/index.html /tmp/restore_test/
如果能正常下载,说明备份可用。建议每月至少做一次完整恢复演练,只备份不测试等于没有备份。
如果你按照本文完成了配置,现在你的服务器已经在每天凌晨自动把数据传到远程了。
哪怕哪天服务器硬盘坏了,你也能在几分钟内恢复业务。
刚开始用可以先手动执行一次脚本,确认没有报错再打开定时任务。
这套方案免费、轻量、可控,适合所有 Linux 服务器。