使用 tar.gz 和 rsync 创建备份

使用 tar.gz 和 rsync 创建备份

我正在尝试使用这个 bash 脚本来创建并将 tar.gz 文件发送到我的备份服务器,但由于某种原因它似乎没有复制它,对于我正在尝试做的事情有没有更好的解决方案?

我宁愿在通过网络发送之前对其进行压缩

#!/bin/bash
####################################
#
# Backup to NFS mount script.
#
####################################

# What to backup. 
backup_files="/home/amp/.ampdata/instances/Towny/"

# Where to backup to.
dest="/home/amp/Backups"

# Create archive filename.
day=$(date +%A)
time=$(date +%H-%M)
file=$(file)
archive_file="$file-$day-$time.tgz"

# Print start status message.
echo "Backing up $backup_files to $dest/$archive_file"
date
echo

# Backup the files using tar.
tar czf $dest/$archive_file $backup_files
rsync $archive_file [email protected]:~/backup
# Print end status message.
echo
echo "Backup finished"
date

答案1

脚本中任何地方你都可以引用$dest/$archive_file你想要创建和复制的文件,除了rsync应该将其复制到另一台主机的命令中。修复调用rsync并重试。

答案2

您需要向我们展示实际发生的事情,才能让您相信“它没有复制它”。

话虽如此,同时使用tarrsync是不寻常的。rsync通常会在文件树本身上使用,并且它只会复制需要复制的内容,同时考虑到已经存在的内容(仅发送差异)。

您不想这样做:您只想每次都发送这个 tar.gz 文件。所以我质疑使用 的意义rsync

你的脚本中的这一行是错误的:

file=$(file)

它正在执行命令file并将输出放入名为 file 的变量中。它本身将是 stderr 上的错误输出,而不是 stdout 上的任何内容,因此$file保持为空。为了取得进展,我假设此变量设置为字符串“file”。

一旦我们解析了变量的内容,您的脚本就会执行此操作:

tar czf /home/amp/Backups/file-Thursday-21-39 /home/amp/.ampdata/instances/Towny/
rsync file-Thursday-21-39 [email protected]:~/backup

因此,如上所述,您不需要同时使用tarrsync。您正在使用tar在本地存储档案,然后将其发送到远程主机。为什么要保留本地档案?您将如何防止它们填满您的本地存储?

您可以直接tar通过 SSH 连接执行以下操作:

# tar zcvf - /home/amp/.ampdata/instances/Towny/ | \
  ssh [email protected] 'cat > backup/file-Thursday-21-39.tar.gz'

其他一些评论:

  • 我认为“Dayname-HH-MM”不是一种很好的格式。考虑一些更明显、更易于排序的格式,例如 YYYY-MM-DD-HHMMSS.tar.gz。
  • 默认情况下,SSH 未压缩,但没关系,因为您的tar命令使用了 gzip 压缩。您可以考虑使用tar其他压缩格式,如 XZ、bzip2、zstd 等。
  • 完整的备份程序可以进行压缩、重复数据删除和可靠的备份。自己制作备份程序并不总是值得的。您可以考虑研究 borgbackup 或 restic 或类似程序。

相关内容