Rsync が増分バックアップを正しく接続できません。

Rsync が増分バックアップを正しく接続できません。

私のデータの増分バックアップを実行するために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}実行し、$TODAYrsyncコマンドがエラーなしで完了した場合にのみ名前を変更することをお勧めします。LASTDAYPATH上記の変更と組み合わせてください。

おすすめ記事