Debian

使用 tar.gz 和 rsync 創建備份

  • January 28, 2021

我正在嘗試使用此 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 killbots@192.168.2.54:~/backup
# Print end status message.
echo
echo "Backup finished"
date

在腳本中的任何地方,您都將其$dest/$archive_file稱為要創建和複製的文件,除了rsync應該將其複製到其他主機的命令中。修復呼叫並重rsync試。

您需要向我們展示實際發生的事情讓您相信“它不會複製它”。

話雖如此,兩者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 killbots@192.168.2.54:~/backup

因此,如前所述,您不需要同時使用tarrsync。您tar用於在本地儲存檔案,然後將其發送到遠端主機。為什麼要保留本地檔案?您將如何防止它們填滿您的本地儲存空間?

您可以直接tar通過 SSH 連接:

# tar zcvf - /home/amp/.ampdata/instances/Towny/ | \
 ssh killbots@192.168.2.54 '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 或類似的。

引用自:https://serverfault.com/questions/1051606