数据备份是运维的生命线。硬盘会坏、人会误删、黑客会加密——只有备份能救你。今天介绍 Linux 下最经典的文件同步工具 Rsync,以及用它搭建自动备份方案。

一、Rsync 是什么

Rsync 是 Linux 下的远程文件同步工具,核心优势:

  • 增量同步:只传变化的部分,不重复传整个文件
  • 支持本地和远程:同一台机器或跨服务器都行
  • 保留属性:权限、时间戳、软链接都能保留
  • 压缩传输:省带宽

二、基本用法

# 本地同步(目录到目录)
rsync -av /source/ /backup/

# 远程同步(通过 SSH)
rsync -avz /local/data/ user@192.168.1.100:/remote/backup/

# 从远程拉到本地
rsync -avz user@192.168.1.100:/remote/data/ /local/backup/

常用参数:

-a   # 归档模式(保留权限、时间等)
-v   # 显示详情
-z   # 压缩传输
-P   # 显示进度 + 支持断点续传
--delete  # 删除目标端多余文件(保持完全一致)
--exclude # 排除文件
-n   # 干跑模式(测试,不实际执行)

三、实战场景

场景1:网站文件每日备份

#!/bin/bash
# /opt/scripts/backup-web.sh
DATE=$(date +%Y%m%d)
BACKUP_DIR="/backup/web/$DATE"

mkdir -p $BACKUP_DIR
rsync -avz --delete \
    --exclude='cache/' \
    --exclude='*.log' \
    /var/www/html/ \
    $BACKUP_DIR/

# 保留最近 7 天
find /backup/web/ -maxdepth 1 -type d -mtime +7 -exec rm -rf {} \;

场景2:MySQL 数据库备份 + 同步

#!/bin/bash
# 先导出 SQL
mysqldump -uroot -p'password' --all-databases > /tmp/db_backup.sql

# 同步到备份服务器
rsync -avz /tmp/db_backup.sql backup@192.168.1.200:/backup/db/

# 清理
rm /tmp/db_backup.sql

场景3:两台 Web 服务器文件同步

# Server A 作为源,定时同步到 Server B
rsync -avz --delete \
    -e "ssh -p 22" \
    /var/www/html/ \
    root@server-b:/var/www/html/

四、配合 crontab 实现自动备份

# 每天凌晨 2 点备份
0 2 * * * /opt/scripts/backup-web.sh >> /var/log/backup.log 2>&1

# 每小时同步一次数据库
0 * * * * /opt/scripts/backup-db.sh

五、Rsync 服务模式

除了走 SSH,Rsync 还可以以守护进程方式运行:

服务端 /etc/rsyncd.conf

[backup]
path = /data/backup
comment = Backup Directory
read only = no
auth users = backupuser
secrets file = /etc/rsyncd.secrets

客户端同步:

rsync -av /local/data/ backupuser@server::backup/

六、避坑指南

  1. 路径末尾斜杠有区别

    • /source/ → 同步目录内容
    • /source → 同步目录本身
  2. --delete 谨慎使用
    会删除目标端多余文件,建议先用 -n 干跑确认
  3. 大文件用 -P
    支持断点续传,传一半断了下次继续
  4. SSH 端口不是 22
    -e "ssh -p 2222" 指定
  5. 备份要有异地
    本机备份防不了硬盘损坏,至少要同步到另一台机器

总结

Rsync 是运维工具箱里最趁手的备份工具——简单、可靠、高效。花半小时配好自动备份,能省下未来无数个通宵恢复数据的夜晚。数据无价,备份趁早。