rsync简易教程

rsync (remote sync) 是一款功能强大的文件同步和传输工具,广泛应用于 Linux/Unix 系统中。它以其高效的增量同步算法而闻名,该算法只传输源文件和目标文件中存在差异的部分,从而大大减少了网络带宽的消耗和数据传输时间。

这对于备份、镜像和服务器之间的数据迁移等场景至关重要。

rsync 的核心优势

  • 增量同步:只传输文件的差异部分,速度极快。
  • 保持属性:可以保持文件的权限、时间戳、所有者和组信息。
  • 安全传输:可以配合 SSH,使用加密通道进行安全的数据传输。
  • 功能丰富:支持排除、包含特定文件/目录,支持删除目标端多余文件等。

基本语法

rsync 的基本命令格式如下:

Bash

rsync [options] SRC... [DEST]
  • [options]: 选项,例如 -a, -v, -z 等。
  • SRC: 源目录或文件。
  • DEST: 目标目录或文件。

SRCDEST 可以是本地路径,也可以是远程路径。远程路径的格式为 [user@]host:path


最常用和最重要的选项组合 -avz

在绝大多数场景下,我们都会使用 -avz 这个组合,它非常实用且高效。

Bash

rsync -avz [SRC] [DEST]
  • -a, --archive:归档模式,表示以递归方式传输文件,并保持所有文件属性。它等同于 -rlptgoD 的组合。
    • -r:递归复制目录。
    • -l:复制符号链接本身,而不是链接所指向的文件。
    • -p:保持文件权限。
    • -t:保持文件修改时间。
    • -g:保持文件所属组。
    • -o:保持文件所有者(仅 root 用户有效)。
    • -D:保持设备文件和特殊文件。
  • -v, --verbose:详细模式,显示同步过程中的详细信息。建议在手动执行时开启,方便观察过程。
  • -z, --compress:在传输过程中压缩数据,可以有效减少网络带宽占用,但会增加一点 CPU 负担。

实用场景与命令示例

1. 本地目录同步

/path/to/source/ 目录下的所有内容同步到 /path/to/destination/

重要提示: 源路径 SRC末尾的 / 非常关键。

  • source/ (带斜杠):表示将 source 目录 的所有文件和子目录复制到目标目录。
  • source (不带斜杠):表示将 source 目录 本身 连同其内容一起复制到目标目录。

示例 A:复制源目录内的内容

Bash

# 操作前请务必确认路径,避免数据覆盖!
# 此命令会将 /home/user/data/ 目录下的 file1.txt, subdir/ 等内容
# 同步到 /mnt/backup/ 目录下
# 最终结果是 /mnt/backup/file1.txt, /mnt/backup/subdir/
rsync -avz /home/user/data/ /mnt/backup/

示例 B:复制源目录本身

Bash

# 操作前请务必确认路径,避免数据覆盖!
# 此命令会将 /home/user/data/ 目录本身同步到 /mnt/backup/
# 最终结果是 /mnt/backup/data/file1.txt, /mnt/backup/data/subdir/
rsync -avz /home/user/data /mnt/backup/

2. 通过 SSH 从本地同步到远程服务器

这是最常见的服务器运维场景之一,例如将本地开发好的网站文件推送到服务器。

Bash

# 务必确认目标路径和权限!
# 将本地 /var/www/my-project/ 目录下的所有文件
# 同步到远程服务器 192.168.1.100 的 /var/www/html/ 目录下
# 使用 root 用户身份登录远程服务器
rsync -avz /var/www/my-project/ [email protected]:/var/www/html/

如果你的远程服务器 SSH 端口不是默认的 22,可以使用 -e 选项指定端口:

Bash

# 假设 SSH 端口为 2222
rsync -avz -e "ssh -p 2222" /var/www/my-project/ [email protected]:/var/www/html/

3. 从远程服务器同步到本地

这个场景常用于备份服务器数据到本地。

Bash

# 务必确认本地备份路径!
# 将远程服务器 192.168.1.100 的 /var/log/ 目录
# 完整同步到本地的 /home/user/server_logs/ 目录下
rsync -avz [email protected]:/var/log /home/user/server_logs/

高级用法与常用选项

4. --delete:删除目标目录中多余的文件

默认情况下,rsync 只会进行增量添加和修改。如果你希望目标目录和源目录保持 完全一致(即源目录中已删除的文件,在目标目录中也一并删除),就需要使用 --delete 选项。

⚠️ 警告:--delete 是一个危险的选项! 使用前请务必再三确认你的源路径和目标路径是否正确,否则可能导致目标目录文件被意外删除。强烈建议先使用 --dry-run 选项进行测试。

Bash

# 将 /home/user/docs/ 的内容完整镜像到 /mnt/backup/docs/
# 如果 /mnt/backup/docs/ 中有而 /home/user/docs/ 中没有的文件,将会被删除
rsync -avz --delete /home/user/docs/ /mnt/backup/docs/

5. --dry-run:演习模式,不实际执行

这是 rsync 一个极其有用的安全功能。使用 -n--dry-run 选项,rsync 会模拟整个同步过程,并列出它 计划 要做的所有文件操作(复制、更新、删除),但不会真正执行任何操作。

在使用 --delete 或执行重要的同步任务前,先用 --dry-run 跑一遍是绝佳的安全习惯。

Bash

# 模拟执行一次带删除的同步,看看会发生什么
rsync -avzn --delete /home/user/docs/ /mnt/backup/docs/

6. --exclude--include:排除或包含文件/目录

当你只想同步特定文件或排除某些临时文件、日志文件时,这两个选项非常有用。

  • --exclude=PATTERN:排除匹配 PATTERN 模式的文件或目录。
  • --include=PATTERN:包含匹配 PATTERN 模式的文件或目录(通常与 --exclude 结合使用)。

示例 A:排除单个目录和所有 .log 文件

Bash

# 同步 /var/www/my-project/,但排除 node_modules 目录和所有的 .log 文件
rsync -avz --exclude 'node_modules/' --exclude '*.log' /var/www/my-project/ user@remote:/deploy/

示例 B:使用 --exclude-from 从文件中读取排除列表

如果排除规则很多,可以把它们写在一个文件里,每行一个规则。

exclude-list.txt 文件内容:

node_modules/
.git/
*.log
tmp/

然后执行命令:

Bash

rsync -avz --exclude-from='exclude-list.txt' /var/www/my-project/ user@remote:/deploy/

7. --progress:显示传输进度

当传输大文件时,这个选项非常人性化,它会显示每个文件的传输进度条。

Bash

# 传输大文件时显示进度
rsync -avz --progress large-video-file.mp4 user@remote:/media/

如果你希望看到总的进度,可以使用 --info=progress2

Bash

# 显示总的传输进度,而不是单个文件的
rsync -avz --info=progress2 /path/to/source/ user@remote:/path/to/dest/

总结

  1. 始终明确源路径末尾的 /:它决定了是复制目录内容还是目录本身。
  2. 默认使用 -avz:这个组合能满足 90% 以上的需求。
  3. 使用 --delete 前,必用 --dry-run 测试:这是防止数据丢失的黄金法则。
  4. 利用 --exclude:在同步项目代码或备份时,排除版本控制目录 (.git, .svn)、依赖目录 (node_modules) 和临时文件,可以大大提高效率和整洁性。
  5. 配合 cron 定时任务:将 rsync 命令写入脚本,并添加到 crontab 中,可以轻松实现自动化、无人值守的定时备份。

如何使用SSH传输文件或文件夹?

Linux scp 命令用于 Linux 之间复制文件和目录。
scp 是 secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。
scp 是加密的,rcp 是不加密的,scp 是 rcp 的加强版。

从服务器上下载文件

# 把192.168.1.100上的/var/www/test.txt 的文件下载到  /var/www/local_dir(本地目录)
scp [email protected]:/var/www/test.txt /var/www/local_dir

# 例子,将远程服务器 /home 目录下的 www1.tar.gz 下载到本地 /www 目录中
scp [email protected]:/home/www1.tar.gz /www

上传本地文件到服务器

# 把本机/var/www/目录下的test.php文件上传到192.168.1.100这台服务器上的/var/www
scp /var/www/test.php  [email protected]:/var/www/

# 例子,将本地 /www 目录下的 www1.tar.gz 上传到 192.168.1.100 远程服务器 /home 目录
scp /www/www1.tar.gz [email protected]:/www/

从服务器下载整个目录

# 目录传输,参数 -r
scp -r [email protected]:/var/www/test  /var/www/ 

上传目录到服务器,注意目标服务器要开启写入权限

# 目录传输,参数 -r
scp  -r local_dir username@servername:remote_dir

来源参考:

https://www.runoob.com/linux/linux-comm-scp.html
https://segmentfault.com/a/1190000020977134

如何清理mysql-bin文件?

binlog文件生成:

在每条二进制日志写入到日志文件后,会判断该文件是否超过 max_binlog_size(默认1G),如果超过则生成一个新的 binlog。

默认情况下mysql会一直保留mysql-bin文件,这样到一定时候,磁盘可能会被撑满,这时候是否可以删除这些文件呢,是否可以安全删除,是个问题,不建议使用rm命令删除,这样有可能会不安全,正确的方法是通过mysql的命令去删除。

binlog文件清理:

登入mysql执行

# 登入mysql
root@server:~# mysql -u user -p password
# 执行
mysql> reset master;

这个命令会清空mysql-bin文件。

修改配置文件:

另外如果你的mysql服务器不需要做主从复制的话,建议通过修改my.cnf文件,来设置不生成这些文件,只要删除my.cnf中的下面一行就可以了。

log-bin = mysql-bin

如果你需要复制,最好控制一下这些日志文件保留的天数,可以通过下面的配置设定日志文件保留的天数:

expire_logs_days = 3

表示保留3天的日志,这样老日志会自动被清理掉

来源参考:

https://blog.csdn.net/zhengfeng2100/article/details/52858946
https://www.nginx.cn/5274.html