私のデータの増分バックアップを実行するためにrsyncを使用していますが、何らかの理由で3〜4回の適切な増分バックアップの後にrsyncがフルバックアップを実行します。 。シナリオは、cronが毎日増分rsyncを実行し、スクリプトを添付して特定のバックアップを削除し、次のままにすることです。
- 7日のバックアップ
- 週あたり約4回のバックアップ
- 12ヶ月のバックアップ
- 5年ごとにバックアップ
これは私が使用するスクリプトです。
#!/bin/bash
TODAY=$(date +%Y-%m-%d)
DATADIR=/mnt/remote_ananda
BACKUPDIR=/media/backup/data
SCRIPTDIR=/media/scripts
LASTDAYPATH=${BACKUPDIR}/$(ls ${BACKUPDIR} | tail -n 1)
TODAYPATH=${BACKUPDIR}/${TODAY}
if [[ ! -e ${TODAYPATH} ]]; then
mkdir -p ${TODAYPATH}
fi
rsync -a --link-dest ${LASTDAYPATH} ${DATADIR} ${TODAYPATH} $@
${SCRIPTDIR}/deleteOldBackups.sh
その後、deleteOldBackups.shは次のようになります。
#!/bin/bash
BACKUPDIR=/media/backup/data
function listYearlyBackups() {
for i in 0 1 2 3 4 5
do ls ${BACKUPDIR} | egrep "$(date +%Y -d "${i} year ago")-[0-9]{2}-[0-9]{2}" | sort -u | head -n 1
done
}
function listMonthlyBackups() {
for i in 0 1 2 3 4 5 6 7 8 9 10 11 12
do ls ${BACKUPDIR} | egrep "$(date +%Y-%m -d "${i} month ago")-[0-9]{2}" | sort -u | head -n 1
done
}
function listWeeklyBackups() {
for i in 0 1 2 3 4
do ls ${BACKUPDIR} | grep "$(date +%Y-%m-%d -d "last monday -${i} weeks")"
done
}
function listDailyBackups() {
for i in 0 1 2 3 4 5 6
do ls ${BACKUPDIR} | grep "$(date +%Y-%m-%d -d "-${i} day")"
done
}
function getAllBackups() {
listYearlyBackups
listMonthlyBackups
listWeeklyBackups
listDailyBackups
}
function listUniqueBackups() {
getAllBackups | sort -u
}
function listBackupsToDelete() {
ls ${BACKUPDIR} | grep -v -e "$(echo -n $(listUniqueBackups) |sed "s/ /\\\|/g")"
}
cd ${BACKUPDIR}
listBackupsToDelete | while read file_to_delete; do
rm -rf ${file_to_delete}
done
3〜4回の増分バックアップの後、rsyncは古いバックアップを接続せずに新しいフルバックアップを作成するのに間違っていますか?ありがとう
答え1
スクリプトを次に置き換えることを検討してください。スナップ写真、これがまさにあなたが望むものです。
追加のトラブルシューティングを実行しないと、スクリプトが失敗した理由を正確に把握することは困難ですが、ここにいくつかのアイデアがあります。あなたの問題を引き起こす可能性がある3つの問題が見つかりました。
間違った$LASTDAYPATH
$BACKUPDIR
何らかの理由で紛失したファイル/ディレクトリが作成された場合、これが発生する可能性があります。ファイルに値を記録して、期待どおりに設定されていることを$LASTDAYPATH
確認してください。これが問題の場合は、次の設定時に適切なglobを使用して問題を解決できます$LASTDAYPATH
。
LASTDAYPATH=${BACKUPDIR}/$(ls -d "${BACKUPDIR}"/2???-??-?? | tail -n 1)
バックアップされたファイルまたはメタデータが変更されています。
--link-dest
ファイルは、サイズ、ランタイム、所有者、グループ、および権限が一致する場合にのみリンクされます。したがって、ファイルのデータが変更されていない場合でも、何らかの理由でタイムスタンプが変更されたファイルの完全なコピーを作成する必要があります。この問題をデバッグするのに役立つように、2つのバックアップを比較して、inode番号の異なるファイルを確認してください。 inode が一致するとファイルがリンクされ、一致しない場合はその特定のファイルがコピーされます。$DIR1
合計を比較するには、次のコマンドを使用します$DIR2
。
diff <(cd $DIR1 && find -type f -printf "%i %p\n" | sort -k 2) <(cd $DIR2 && find -type f -printf "%i %p\n" | sort -k 2)
前日のバックアップは完了していません。
何らかの理由でrsyncが失敗すると、空または部分的なバックアップが作成されますが、ディレクトリが--link-dest
存在するため、引き続き使用します。たとえば、ディレクトリ名でrsyncをpartial.${TODAY}
実行し、$TODAY
rsyncコマンドがエラーなしで完了した場合にのみ名前を変更することをお勧めします。LASTDAYPATH
上記の変更と組み合わせてください。