使用rsync通过SSH保存异地备份

适用环境:Linux 两端已安装 rsync,可通过 SSH 连接;示例为本机向备份服务器推送已完成的备份目录,不直接同步运行中数据库文件。

异地副本需要另一台真实可用、具有足够空间的主机。源服务器和备份服务器应分开管理备份写入权限,并保留多个时间点。rsync 负责复制,不会自动把不一致的数据变成可恢复备份。

准备一个固定且完整的备份批次

  • 先完成 tar 或数据库导出,确认没有写入中的 .partial 文件,生成校验文件。
  • 在备份端建立专用目录,例如 /srv/baole-backups/server-a/2026-10-31;示例日期应换成本次批次。
  • SSH 使用受信任的主机身份和有必要权限的账号;第一次连接时核对指纹,不盲目接受变化。
  • 不要把备份端的高权限密码或可删除全部历史版本的凭据长期放在公开脚本里。

先用预演确认方向与目录层级

rsync -a --dry-run --itemize-changes \
  -e 'ssh -p 22' \
  /var/backups/baole/run-2026-10-31/ \
  backup@203.0.113.40:/srv/baole-backups/server-a/2026-10-31/

替换地址、端口、账号及两端路径。源路径最后的 / 表示复制该目录里面的内容;漏掉它可能多出一层目录。输出中的新增文件应落在本次专用批次里。这个命令没有 --delete,不会按源端状态清理目标历史数据;不要为“看起来同步”就加入 --delete 或 --delete-excluded。

正式复制,再核验接收端文件

rsync -a --itemize-changes \
  -e 'ssh -p 22' \
  /var/backups/baole/run-2026-10-31/ \
  backup@203.0.113.40:/srv/baole-backups/server-a/2026-10-31/
printf 'rsync exit=%s\n' "$?"

退出码为 0 才记录这次传输正常完成。部分文件传输失败、源文件消失或连接中断,必须从完整输出找原因,不能把“有文件到达”当成完成。接收端若没有写入权限,应调整本次目录的授权方案,不用 chmod 777 解决。

ssh -p 22 backup@203.0.113.40 \
  'cd /srv/baole-backups/server-a/2026-10-31 && sha256sum -c SHA256SUMS'

SHA256SUMS 中应使用批次内的相对文件名,并由可信源端生成。远端全部显示 OK 后,再从远端取一个备份做试恢复。--archive 的文件属性保留程度还受目标文件系统、账号权限以及两端功能支持限制,不等于完整系统镜像。

重传、历史版本与误删除保护

情况 处理方法
传输中断 先确认源批次仍完整不变,再重跑同一方向的命令,最后重新校验。
备份端空间不足 查看历史批次和保留策略,核实至少有可恢复副本后再安排清理;不能直接清空目标。
源目录误删或被加密 暂停该同步任务,保护备份端历史版本,先在隔离目录恢复。不要让双向同步继续传播错误。

每次独立目录有助于人工区分时间点,但并不自动防篡改。需要抵御源机失陷时,应由备份端限制删除权限、采用拉取或独立保留机制,并验证管理边界。传输速率和备份时段也应适合所购产品的带宽使用规则,避免长期占满链路。