MySQLのバックアップスクリプト

Movable Typeを5にアップグレードしたので、そのデータベースもPostgreSQLからMySQLに移行するハメになった。
ので、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
##################################################


Settings セクションにmysqldumpを実行するユーザとパスワードを設定して、火曜0時~日曜0時に取る分(上記スクリプトそのまんま。mysqldump_daily.sh。)と月曜0時に取る分(「daily」を「weekly」 に変更したもの。mysqldump_weekly.sh)を作ります。
これらの.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

以上。