날짜별 증분 파일 백업

날짜별 증분 파일 백업

날짜별 부분 백업을 지원하는 백업 도구가 있나요? 즉, 내 노트북에 있는 것과 같은 일부 작은 드라이브가 외부 2TB 드라이브에 있는 모든 파일의 전체 복사본을 저장할 수 없다는 뜻입니다. 나는 주로 내가 작업하는 파일인 최신 파일을 내 노트북에 보관하고 싶습니다. 하지만 동시에 제한된 저장 공간으로 다른 드라이브를 동기화할 수 있기를 원합니다. 따라서 각 소형 드라이브에는 특정 날짜(예: 3개월 전) 이후에 생성되거나 수정된 ​​파일이 포함되어야 합니다. 각각 디스크 크기가 다른 두 대의 노트북이 있다고 가정해 보겠습니다. 드라이브가 더 작은 노트북에서는 지난 달의 파일만 표시되기를 원할 수도 있습니다. 노트북에 있는 모든 파일과 3개월이 지난 기타 보관 파일은 대용량 외부 드라이브에 백업해야 합니다. 따라서 외부 드라이브는 두 개의 작은 드라이브를 미러링하고 동기화를 유지해야 합니다. 사용해 보았는데 unison날짜별 백업을 지원하지 않는 것 같습니다. 일부 셸 스크립트를 사용하면 작동할 수도 있지만 rsync새 솔루션을 구현하기 전에 솔루션이 있는지 확인하고 싶습니다.

답변1

이를 위해 전용 프로그램을 사용하지는 않지만 cron, bash, tar(증분 덤프) 및/또는 rsync. 제 생각에는 두 가지 최상의 솔루션이 있으며 상황에 따라 둘 중 하나 또는 둘 다를 사용합니다. 나는 첫 번째 것이 당신에게 더 적합하다고 생각하지만 여기서는 두 가지 모두에 대해 설명하겠습니다.

델타 타르 아카이브

솔루션의 핵심은 다음과 같은 스크립트입니다.

#!/bin/bash

# You will need to set the variables $EXCLUDE, $DATA and $BACKUPS
# as environment variables, in ~/.bashrc or somewhere.

OPTS="--create --no-check-device --bzip2 --verbose -X $EXCLUDE"
for d in `ls $DATA`; do
    SNAPSHOT=$BACKUPS/$d.snar
    if [ $1 == full ]; then
        echo "Archiving $d (full)..."
        rm -rvf $SNAPSHOT
        ARCHIVE=$DATA/$d.`date --iso-8601`.full.tar.bz2
        tar $OPTS --file=$ARCHIVE --listed-incremental=$SNAPSHOT $DATA/$d
    fi
    if [ $1 == increment ]; then
        echo "Archiving data/$d (increment)..."
        ARCHIVE=$DATA/$d.`date --iso-8601`.tar.bz2
        tar $OPTS --file=$ARCHIVE --listed-incremental=$SNAPSHOT $DATA/$d
    fi
done

이는 하위 디렉터리가 있고 $DATA각 하위 디렉터리가 별도의 아카이브에 백업된다고 가정합니다. 설정이 다른 경우 스크립트를 사용자 정의하세요.

crontab에서 다음과 같이 백업을 예약할 수 있습니다.

# m  h  dom mon dow   command
  44 1  1   */2 *     ~/bin/backup_data full > ~/backups/data/logs/`date --iso-8601`.full.log 2>&1
  44 5  *   *   *     ~/bin/backup_data increment > ~/backups/data/logs/`date --iso-8601`.log 2>&1

보시다시피, 이 경우에는 두 달마다 전체 백업이 생성되고, 해당 전체 덤프부터 시작하는 증분 백업이 매일 생성됩니다. 파일을 잃거나 타임스탬프를 변경하는 경우 tar의 증분 아카이브에 문제가 발생합니다. 따라서 가끔씩 전체 덤프를 생성하는 것이 좋습니다.

머신 간 동기화 및 오래된 파일 삭제에 관해서는 해당 작업이 실제로 직교하므로 백업 자체와 별도로 유지해야 합니다. 물론 해당 --delete옵션 없이 동기화를 위해 rsync를 사용하면 대형 외부 드라이브의 데이터가 손실되지 않습니다. 따라서 귀하의 명령은 다음과 같습니다.

rsync -av /backups/data /mnt/external

노트북에 외장 드라이브가 설치되어 있는 경우. 그렇지 않으면 다음과 같이 네트워크를 통해 이 작업을 수행해야 합니다.

rsync -av /backups/data user@external:/backups/data

노트북에서 90일이 지난 아카이브를 지우려면 다음을 수행하세요.

find /path/to/files -type f -mtime +90 -delete

이번에도 이 내용을 crontab에 넣으세요.

rsync를 사용한 증분 백업

증분 백업에는 rsync만 사용할 수 있습니다. 저는 특히 타임스탬프가 있는 스냅샷과 명령일 뿐인 하드 링크를 사용하는 것을 좋아합니다. 다음은 제가 일반적으로 사용하는 것과 유사한 예입니다.

rsync --verbose --progress --stats --human-readable --archive --link-dest=/backups/data/`date --iso-8601 -d "one day ago"` /data/ /backups/data/`date --iso-8601`/

--link-dest기본적으로 변경되지 않은 파일에 대해 전날의 스냅샷(스냅샷에서 제공)에 대한 하드 링크를 생성합니다. 비정상적으로 실행 중인 경우 다음과 같이 최신 스냅샷을 가리키는 심볼릭 링크를 사용하고 백업 후 심볼릭 링크를 업데이트할 수 있습니다.

rsync --verbose --progress --stats --human-readable --archive --link-dest=/backups/data/last /data/ /backups/data/`date --iso-8601`/ && rm -rvf /backups/data/last && ln -vs /backups/data/`date --iso-8601`/ /backups/data/last

가장 중요한 것은 외장 드라이브와의 동기화를 구성하고 오래된 스냅샷을 삭제해야 한다는 것입니다. 일반적으로 이것은 위에서 설명한 첫 번째 솔루션과 동일한 접근 방식입니다. 그러나 머신 간에 스냅샷을 재동기화할 때는 -H하드 링크를 보존하는 옵션을 사용해야 합니다 .

일반화하다

사용한 솔루션에 비해 tar두 번째 솔루션이 관리가 더 간단하고 모든 파일을 항상 사용할 수 있다고 생각합니다. 반면에 아카이브를 사용하면 압축의 이점이 있고 더 적은 수의 inode를 사용하며 서버가 아닌 시스템에서 다른 이점이 있습니다.

다시 말하지만, 가능하다면 이 모든 작업을 crontab에서 수행하여 기억할 필요가 없도록 하세요. 노트북을 항상 열어 두지 않는다면 하루에 몇 번씩 자주 사용하는 시간을 선택하여 최소한 몇 개의 크론 작업을 시작하세요. 더 나은 방법은 다음과 같은 것을 사용하는 것입니다.나크론.

하루에 여러 번 증분하려는 경우 백업 스크립트를 수동으로 실행하고 파일 이름/디렉터리의 날짜를 구체화할 수도 있습니다. 분명히 이러한 솔루션을 사용 사례에 적합하게 만들기 위해 실험해야 합니다.

고쳐 쓰다:내가 사용한 샘플 스크립트가 포함된 저장소:https://github.com/langner/backup.sh/blob/master/backup.sh

관련 정보