リモートサーバの特定ディレクトリと MySQL データベースをバックアップする

呼称: 簡単なバックアップスクリプト
目的: MySQL を使用する Web アプリの特定ディレクトリとデータをバックアップする
特徴: 常にフルバックアップ!!!
用例: Trac サイトを構築してバックアップする
備考: エラーになったら自分で対応してください(- -#

先日 Trac サイトを構築しました。運用環境を本格的に整備してスタートしていれば良いのですが、できるところからコツコツと、スモールスタートな感じなのでちょっとしたバックアップスクリプトを作成してみました。Trac は構築したばかりなのでデータ量が小さく、ユーザ数も少ないのでフルバックアップ処理でも暫くは大丈夫かなと考えています。データ量が増大すると、このやり方では負荷がかかるかもしれないのでご注意ください。手動で実行するも良し、cron で毎週/毎月実行するも良し、さらに拡張するも良しなお手軽スクリプトです。

グローバル変数の TARGET_HOST, TARGET_BKUP_DIR, USER, DB_SERVER, DB_USER, DB_PASSWD, DB_DATABASE, LOCAL_BKUP_DIR を環境に応じて設定してください。TARGET_XXX/DB_XXX がリモートサーバ/DB サーバの設定情報になります。MySQL のデータベースには、リモートから接続可能なユーザ権限を設定する必要があります。実行すると LOCAL_BKUP_DIR に tar.bz2 ファイルが作成されます。

#!/bin/sh

###########################################################
# GLOBAL (default value)
###########################################################

###########################################################
# @@@@@ Change value in your environment @@@@@
###########################################################
# ----- From Here
TARGET_HOST="your_target_host"
TARGET_BKUP_DIR="your_target_directory"
USER="login_user"
DB_SERVER="$TARGET_HOST"
DB_USER="mysql_user"
DB_PASSWD="mysql_passwd"
DB_DATABASE="mysql_database_name"
LOCAL_BKUP_DIR="/var/tmp/bkup"
# ----- Up To Here

### Don't have to change as follows variables
PROG_NAME=$(basename $0)
DATE=$(date +%Y%m%d%H%M%S)
TMP_DIR=$(mktemp -d)
TMP_BKUP_FILE="bkup.tar.bz2"
BKUP_PREFIX="backup_"
MYSQLDUMP="mysqldump $DB_DATABASE -u $DB_USER -p$DB_PASSWD -h $DB_SERVER --opt > $TMP_DIR/mysql.dump"

DEBUG_MODE="on"
LOG_FILE="/tmp/bkup.log"

###########################################################
# Main
###########################################################
main() {
    rm -f ${LOG_FILE}
    log "* start ${PROG_NAME} on ${DATE}"
    
    log "** copy from target server to local"
    ssh "$USER"@"$TARGET_HOST" "tar jcvf $TMP_BKUP_FILE $TARGET_BKUP_DIR"
    scp "$USER"@"$TARGET_HOST":$TMP_BKUP_FILE $TMP_DIR
    ssh "$USER"@"$TARGET_HOST" "rm -f $TMP_BKUP_FILE"
    
    log "** dump from mysql database"
    log $(eval "$MYSQLDUMP")

    log "** make backup archive"
    tar -C $TMP_DIR -jcvf "$LOCAL_BKUP_DIR/$BKUP_PREFIX$DATE.tar.bz2" .
    rm -rf $TMP_DIR
    
    log "* end ${PROG_NAME} on ${DATE}"
    return 0
}

###########################################################
# Output to logfile
###########################################################
log() {

    if [ ${DEBUG_MODE} = "off" ]; then
        echo -e "$*" >> ${LOG_FILE}
    else
        echo -e "$*" | tee -a ${LOG_FILE}
    fi
}

###########################################################
# Run Main
###########################################################
main "$@" || exit $?