ので、MySQL用のバックアップスクリプトも書いたよ。もちろん、世代管理機能付き♪
ちなみに、PostgreSQL用のバックアップスクリプトはこちら。
mysqldump_daily.sh
#/bin/sh
##################################################
# MySQL database backup script
#
# Dump to DB_NAME.YYMMDD.dump
# Delete expired dump file
# Output log file.
##################################################
##################################################
# Settings
USER="username"
PASS="password"
# space separated value: databases and backup directories (full path)
DB_NAMES="movabletype"
BAK_DIRS="/backup/mysql/daily"
WK_DIR="/etc/backup"
# log file path
LOG="/backup/mysql/mysqldump_daily.log"
BAK_NUM=15
##################################################
##################################################
# Main routine
TODAY=`date +%Y%m%d`
echo "@@@ Start Database Backup [ `date +%Y/%m/%d` ] @@@" | tee -a $LOG
# backup each "DB_NAMES"
for DB_NAME in $DB_NAMES
do
CNT_DIR=1
CP_SRC=""
CP_DST=""
# backup to each "BAK_DIRS"
for BAK_DIR in $BAK_DIRS
do
if [ $CNT_DIR -eq 1 ]; then
# create dump command
COM="mysqldump -u$USER -p$PASS $DB_NAME"
if [ $DB_NAME = "ALL" ]; then
COM="mysqldum -u$USER -p$PASS --all-databases"
fi
# execute dump command
echo "[" `date +%Y/%m/%d_%H:%M:%S` "] $COM [start]" | tee -a $LOG
DUMP_FILE_PATH=$WK_DIR/$DB_NAME.$TODAY.dump
$COM > $DUMP_FILE_PATH | tee -a $LOG
mv $DUMP_FILE_PATH $BAK_DIR
echo "[" `date +%Y/%m/%d_%H:%M:%S` "] $COM [done]" | tee -a $LOG
CP_SRC=$DUMP_FILE_PATH
else
# copy dump file to other BAK_DIRS
CP_DST=$BAK_DIR/$DB_NAME.$TODAY.dump
echo "[" `date +%Y/%m/%d_%H:%M:%S` "] Copy dump file to $BAK_DIR [start]" | tee -a $LOG
cp $CP_SRC $CP_DST | tee -a $LOG
echo "[" `date +%Y/%m/%d_%H:%M:%S` "] Copy dump file to $BAK_DIR [done]" | tee -a $LOG
fi
# delete old backup files
LS=`ls -r $BAK_DIR/$DB_NAME.*.dump`
CNT=1
for FILE in $LS
do
if [ $CNT -gt $BAK_NUM ]; then
rm -f $FILE | tee -a $LOG
echo "[" `date +%Y/%m/%d_%H:%M:%S` "] Delete expired dump file [$FILE]" | tee -a $LOG
fi
CNT=`expr $CNT + 1`
done
CNT_DIR=`expr $CNT_DIR + 1`
done
done
echo "@@@ Finish @@@" | tee -a $LOG
##################################################
これらの.shファイルを/etc/backupなどのフォルダに突っ込んで、そこをWK_DIRにします(まぁ、どこでもいいんですが)。
DB_NAMESパラメータにバックアップ対象のデータベース名をスペース区切りで入力します。
BAK_DIRSパラメータにDB_NAMESに指定したデータベースに対応するバックアップ先ディレクトリをスペース区切りで入力して、そのディレクトリを作成します。
BAK_NUMパラメータで指定した日数分が保持されます。
LOGはログファイルの保存先を指定します(cronに登録しちゃうのでメールが来るからいいや、という話もあるがw)。
ここまでのバックアップ処理を crontab -e で登録。
10 0 * * 1 /etc/backup/mysqldump_weekly.sh
10 0 * * 2-6 /etc/backup/mysqldump_daily.sh
10 0 * * 2-6 /etc/backup/mysqldump_daily.sh
以上。