mysql 백업 및 rsync 스크립트 문제

mysql 백업 및 rsync 스크립트 문제

MySQL 데이터베이스를 백업한 다음 원격 위치에 동기화하는 bash 스크립트가 있습니다. 어젯밤에 이 프로세스가 완전히 실패하여 기본 backup-db 디렉토리가 33GB로 채워졌습니다! 4시간마다 cron 작업을 실행하는 스크립트가 있습니다. 폴더를 살펴보니 4시간마다 1분 간격으로 백업이 실행되고 있는 것 같습니다. 예를 들어 오전 4시에 한 번이 아니라 해당 시간의 매분마다. 오전 8시에도 마찬가지다.

문제는 백업이 완료되기 전에 rsync가 실행되고 종료되지 않고 루프에 빠진다는 것입니다. 백업이 실패한 경우 스크립트를 종료하거나 rsync를 실행하기 전에 백업이 성공했는지 확인하는 방법이 있습니까?

이제 rsync를 별도의 작은 스크립트로 제거했습니다(그러나 여러 서버에 복제해야 하기 때문에 모든 것을 한 곳에 보관하고 싶습니다.

#!/bin/bash

NOW=$(date +"%Y-%m")
BACKUPDIR="/home/deploy/backup-db/$NOW"
BKUPSSH="[email protected]"
BKUPSERVDIR="/home/user/backups/databases"

# Remove files older than 30 days
find $BACKUPDIR/ -mtime +31 -exec rm {} \;

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

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

# assuming that BACKUPDIR exists
if [ ! -d $BACKUPDIR ]; then
  mkdir -p $BACKUPDIR
else
 :
fi

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


# SET DATE AND TIME FOR THE FILE
NOW=$(date +"%Y-%m-%d_%H.%M"); # year-month-day_hour.minute format

# 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="$BACKUPDIR/$NOW-$db.sql.gz";
            echo "BACKING UP $db";
    $MYSQLDUMP --login-path=dbbkup --add-drop-database --opt --lock-all-tables --set-gtid-purged=OFF $db | $GZIP > $FILE
    fi
done

# change permissions on files
chmod -R 755 $BACKUPDIR

# rsync backup to the backup server and append the log file
rsync -azv $BACKUPDIR -e ssh $BKUPSSH:$BKUPSERVDIR >> /home/deploy/db_rsync.log 2>&1
RESULT="$?"

# check result or rsync
if [ "$RESULT" != "0" ]; then
echo -e "Rsync exit Code:" $RESULT "\nFailed to rsync databases" >> /home/deploy/db_rsync.log 2>&1
else
echo "succesfully rsynced databases" >> /home/deploy/db_rsync.log 2>&1
fi

답변1

cronjob 작업과 거기에서 발생할 수 있는 문제를 게시하십시오. 또한 제가 권장하는 방법은 백업을 실행하기 전에 해당 파일이 존재하는지 확인할 수 있는 어딘가에 파일을 터치하여 잠금 파일을 생성하는 것입니다. 귀하의 데이터베이스가 얼마나 큰지는 잘 모르겠지만 제 경우에는 가끔 데이터베이스가 너무 커서 백업 프로세스가 이미 실행 중인 다른 프로세스와 겹칠 수 있으므로 실행 중인 /tmp/backup.lock 파일과 같은 파일이 항상 있습니다. 스크립트 무엇이든 만지기 전에 if [ -e /tmp/backup.lock ]; 그리고...

귀하의 경우 cronjob에 버그가 있고 4시간마다 1분마다 실행하고 있다고 확신합니다.

관련 정보