내 데이터의 증분 백업을 수행하기 위해 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
스크립트를 다음으로 바꾸는 것을 고려하십시오.스냅 사진, 이것이 바로 당신이 원하는 것입니다.
추가 문제 해결을 수행하지 않으면 스크립트가 실패한 이유를 정확히 파악하기 어렵지만 여기에 몇 가지 아이디어가 있습니다. 귀하의 문제를 일으킬 수 있는 세 가지 문제를 발견했습니다.
잘못된$LASTDAYPATH
$BACKUPDIR
어떤 이유로 인해 길 잃은 파일/디렉토리가 작성된 경우 이런 일이 발생할 수 있습니다. 파일에 값을 기록하여 예상한 대로 설정되었는지 $LASTDAYPATH
확인하세요 . 이것이 문제인 경우 다음을 설정할 때 적절한 glob을 사용하여 문제를 해결할 수 있습니다 $LASTDAYPATH
.
LASTDAYPATH=${BACKUPDIR}/$(ls -d "${BACKUPDIR}"/2???-??-?? | tail -n 1)
백업된 파일 또는 메타데이터가 변경 중입니다.
--link-dest
파일은 크기, 런타임, 소유자, 그룹 및 권한이 일치하는 경우에만 연결됩니다. 따라서 파일의 데이터가 변경되지 않은 경우에도 어떤 이유로 타임스탬프가 변경된 파일의 전체 복사본을 만들어야 합니다. 이 문제를 디버깅하는 데 도움이 되도록 두 백업을 비교하여 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
위의 변경사항 과 결합하세요 .