rsync는 디스크를 로컬로 채웁니다.

rsync는 디스크를 로컬로 채웁니다.

폴더를 로컬로 동기화한 다음 원격으로 동기화하고 싶습니다.

루프에 갇혀 로컬 서버를 가득 채우는 것 같습니다. 원본 폴더는 3.9GB인데 로컬 서버에는 17GB가 넘습니다.

내가 원하는 것은 폴더를 백업으로 로컬로 재동기화한 다음 원본 폴더를 다른 백업 서버로 재동기화하는 것입니다. 무엇이 잘못되었는지 알 수 없습니다. 도와주세요!

아래는 전체 스크립트입니다.

#!/bin/bash

# check that BACKUPDIR exists
BACKUPDIR="/home/deploy/backups"
if [ ! -d $BACKUPDIR ]; then
  mkdir -p $BACKUPDIR/{directories,databases,logs}
else
  :
fi
# set time variable
NOW=$(date +"%F_%H:%M") # year-month-day_hour:minute format

# set logs
LOCALLOG="$BACKUPDIR/logs/$NOW.webapps.log"
exec 3>&1 4>&2
trap 'exec 2>&4 1>&3' 0 1 2 3
exec 1>$LOCALLOG 2>&1
# Everything below will go to the file 'webapps.log'

# Remove files older than 7 days
find $BACKUPDIR/{directories,databases,logs} -mtime +8 -exec rm {} \;

# set directory variables
LOCALDIR="$BACKUPDIR/directories"
BKUP_SERV="[email protected]"
BKUP_DIR="/home/deploy/backups/$HOSTNAME/directories"
BKUP_LOG="/home/deploy/backups/$HOSTNAME/logs"
DJANGODIR="/usr/local/django"
WEBAPPSDIR="/webapps"

# set output variables
WEBAPPS_YES="SUCCESSFULL sync of webapps folder"
WEBAPPS_NO="FAILED to sync webapps folder"
RSYNC_YES="SUCCESSFULL rsync to log file"
RSYNC_NO="FAILED to rsync log file"

# check webapps or django folder to rsync
if [ ! -d "$WEBAPPSDIR" ]; then
  rsync -avh "$DJANGODIR" "$LOCALDIR"
else
  rsync -avh "$WEBAPPSDIR" "$LOCALDIR"
fi
RESULT1="$?"

# Outputs whether the rsync was successful or not
if [ "$RESULT1" != "0" ]; then
    echo -e "EXIT Code:" $RESULT1 "\n$WEBAPPS_NO"
else
    echo "$WEBAPPS_YES"
fi

# check webapps or django folder to rsync
if [ ! -d "$WEBAPPSDIR" ]; then
  rsync -azvPh "$DJANGODIR" -e ssh "$BKUP_SERV":"$BKUP_DIR"
else
  rsync -avzPh "$WEBAPPSDIR" -e ssh "$BKUP_SERV":"$BKUP_DIR"
fi
RESULT2="$?"

# Outputs whether the rsync was successful or not
if [ "$RESULT2" != "0" ]; then
    echo -e "EXIT Code:" $RESULT2 "\n$RSYNC_NO"
else
    echo "$RSYNC_YES"
fi

# Command to rsync 'webapps.log'
rsync -azvPh "$LOCALLOG" -e ssh "$BKUP_SERV":"$BKUP_LOG"
RESULT3="$?"

# Outputs whether the rsync was successful or not
if [ "$RESULT3" != "0" ]; then
    echo -e "EXIT Code:" $RESULT3 "\n$RSYNC_NO"
else
    echo "$RSYNC_YES"
fi

답변1

변수 $DJANGODIR$LOCALDIR가 유효한 디렉토리이고 $BKUP_SERV변수가 유효한 대상 호스트이면 명령이 합리적입니다.

--dry-run매개변수를 사용하여 어떤 일이 일어나는지 확인할 수 있습니다.

"$DJANGODIR"공백 및 기타 이상한 문자가 쉘에서 처리되는 것을 방지하려면 변수 등을 인용해야 합니다 .

-z로컬 백업에서는 이 플래그와 암시적 설정을 무시합니다 --partial.

원격 백업은 로컬 백업이 성공적으로 완료된 경우에만 시도됩니다. 이것이 정확하고 유용한지 고려해야 합니다. 개인적으로 나는 하나의 백업이 다른 백업에 종속되는 것을 원하지 않는다고 생각하지만 그것은 내 시스템이 아닙니다.

답변2

문제는 다음과 같습니다.

# Remove files older than 7 days
find $BACKUPDIR/{directories,databases,logs} -mtime +8 -exec rm {} \;

-rf뒤에 있는 것들은 사라졌습니다 rm. 이로 인해 스크립트가 중단되는 것 같습니다.

지금은 잘 작동합니다. 아래는 정식 버전입니다.

#!/bin/bash

# Set local directory variables
NOW=$(date +"%F_%H:%M") # year-month-day_hour:minute format
BACKUPDIR="/home/deploy/backups"
LOGDIR="$BACKUPDIR/logs"
DBDIR="$BACKUPDIR/databases"
LOGFILE="$LOGDIR/$NOW.db_bkup.log"

# check that BACKUPDIR exists
if [ ! -d $BACKUPDIR ]; then
  mkdir -p $BACKUPDIR/{databases,logs}
else
  :
fi

# Set remote directory variables
BKUPSSH="[email protected]"
BKUPSERVDIR="/home/deploy/backups/$HOSTNAME/databases"

exec 3>&1 4>&2
trap 'exec 2>&4 1>&3' 0 1 2 3
exec 1>$LOGFILE 2>&1
# Everything below will go to the file 'db_bkup.log'

# DO NOT BACKUP these databases
IGNOREDB="
information_schema
performance_schema
mysql
test"

#* MySQL binaries *#
MYSQLDUMP=$(which mysqldump)
GZIP=$(which gzip)

# Remove files older than 7 days
find $DBDIR -mtime +8 -exec rm -rf {} \;

# get all database listing
DBS="$(mysql --login-path=dbbkup -Bse 'show databases')"

# start to dump database one by one
for db in $DBS
do
        DUMP="yes";
        if [ "$IGNOREDB" != "" ]; then
                for i in $IGNOREDB # Store all value of $IGNOREDB ON i
                do
                        if [ "$db" == "$i" ]; then # If result of $DBS(db) is equal to $IGNOREDB(i) then
                                DUMP="NO";         # SET value of DUMP to "no"
                                #echo "$i database is being ignored!";
                        fi
                done
        fi

        if [ "$DUMP" == "yes" ]; then # If value of DUMP is "yes" then backup database
                FILE="$DBDIR/$NOW-$db.sql.gz";
                echo "BACKING UP $db";
        $MYSQLDUMP --login-path=dbbkup --add-drop-database --single-transaction --triggers --routines --events --set-gtid-purged=OFF --verbose $db | $GZIP > $FILE
        fi
done

# change permissions on files
chmod -R 755 $BACKUPDIR

# rsync backup to 'Larry' the backup server and append the log file
rsync -azvh $DBDIR/ -e ssh $BKUPSSH:$BKUPSERVDIR
RESULT="$?"

# check result of rsync db's
if [ "$RESULT" != "0" ]; then
    echo -e "rsync exit Code:" $RESULT "\nFAILED to rsync databases"
else
    echo "SUCCESSFULL rsync of databases"
fi

관련 정보