我有一个 bash 脚本来备份 MySQL 数据库,然后将它们同步到远程位置。昨晚,这个过程彻底失败了,并且将主 backup-db 目录填满了 33GB!我让脚本每 4 小时运行一次 cron 作业。当我查看该文件夹时,看起来备份每 4 小时每分钟运行一次。例如,不是凌晨 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 小时每分钟运行一次或类似的情况。