アカウント


 



Firebird日本ユーザー会はFirebird Foundation の公式スポンサーです
Firebird日本ユーザー会は
Firebird Foundation の
公式スポンサーです

■ Linux上でcronによる
  Firebirdのデータベースの世代バックアップ

※この記事は保坂さんの公開MLでの投稿を元に作成されました。


主にLinux上でFirebirdを運用する場合、バックアップファイルはサーバ間で持ち合う用にしています。方法としては、リモートのTargetサーバを指定し、このスクリプトを走らせるローカルのgbakでバックアップファイルを作成します。
下記は世代バックアップを行うシェルスクリプトの例です。


使い方

日単位で実行するようcronに登録すると、ローカルの $BAK_DIR に $BACKUP_DAYS に指定した世代(日付)分のバックアップを作成・保存します。
※echoをloggerコマンドに変更すると /var/log/messages に実行ログを記録出来るので更に良いかもしれません。



#!/bin/sh

#TARGET HOST. IP Addrss or localhost.
HOST="localhost"

#DIRECTORY OF BACKUP FILES.
BAK_DIR="/home/backup"

#TARGET DB FILE.
FDB_FILE="/firebird/firebird.fdb"

#BACKUP DB FILE NAME.
FBK_FILE="firebird.fbk"

#GBAK PATH.
GBAK="/opt/firebird/bin/gbak"

#SYSDBA USER.
ISC_USER="SYSDBA"

#SYSDBA PASSWORD.
ISC_PASSWD="masterkey"

#BACKUP FILE WRAPPING DAYS.
BACKUP_DAYS=3

#DATE
DATE_PATH=`which date`

#TODAY
TODAY=`$DATE_PATH -I`

#ROTATE DAY.
ROTATE_DAY=`$DATE_PATH -I -d ${BACKUP_DAYS}days+ago`

#BACKUP FILE NAME OF TODAY.
FBK_FILE_TODAY="${FBK_FILE}.[${HOST}].${TODAY}"

#ROTATE FILE NAME.
ROTATE_FILE="${FBK_FILE}.[${HOST}].${ROTATE_DAY}"

#COMMAND
COMMAND="$GBAK -B -user $ISC_USER -pass $ISC_PASSWD ${HOST}:$FDB_FILE ${BAK_DIR}/${FBK_FILE_TODAY}"

#SWEEP SPAN.
SWEEP_SPAN=`expr 30 - ${BACKUP_DAYS}`




if [ ! -d $BAK_DIR ]
then
    echo "INFO: mkdir ${BAK_DIR}."
    mkdir $BAK_DIR
fi

if [ ! -f ${BAK_DIR}/$FBK_FILE_TODAY ]
then
    echo "INFO: Starting gbak. -> $COMMAND."
    $COMMAND
    STATUS=$?
else
    echo "INFO: Backup is not excuted. Backup file -> ${BAK_DIR}/${FBK_FILE_TODAY} allready exists."
    exit 1
fi

if [ $STATUS -eq 0 ]
then
    echo "INFO: Backup is completed."
    if [ -f ${BAK_DIR}/${ROTATE_FILE} ]
    then
        echo "INFO: Removing old backup file. -> ${BAK_DIR}/${ROTATE_FILE}"
        rm -rf ${BAK_DIR}/${ROTATE_FILE}
    fi
else
    echo "ERROR: Backup is failed. please check -> $COMMAND."
    if [ -f ${BAK_DIR}/${FBK_FILE_TODAY} ]
    then
        echo "INFO: Removing failed backup file. -> ${BAK_DIR}/${FBK_FILE_TODAY}"
        rm -rf ${BAK_DIR}/$FBK_FILE_TODAY
    fi
fi

#SWEEP FUNCTION.
sweepFile () {

        CHECK_COUNTER=0

        while [ ${CHECK_COUNTER} -lt ${SWEEP_SPAN} ]
        do
                CURRENT_AMOUNT=`ls -l ${BAK_DIR}/${FBK_FILE}.[${HOST}].* | wc -l`
                VALUE=`expr ${BACKUP_DAYS} + ${CHECK_COUNTER}`
                SWEEP_DAY=`$DATE_PATH -I -d ${VALUE}days+ago`
                SWEEP_FILE="${FBK_FILE}.[${HOST}].${SWEEP_DAY}"
                if [ ${CURRENT_AMOUNT} -gt ${BACKUP_DAYS} ]
                then
                        echo "INFO: Checking old backup file. -> ${BAK_DIR}/${SWEEP_FILE}"
                        if [ -f ${BAK_DIR}/${SWEEP_FILE} ]
                        then
                echo "INFO: Old backup file is finded."
                                echo "INFO: Sweeping old backup file. -> ${BAK_DIR}/${SWEEP_FILE}"
                                rm -rf ${BAK_DIR}/${SWEEP_FILE}
                                SWEEP_STATUS=$?
                                if [ $SWEEP_STATUS -eq 0 ]
                                then
                                        echo "INFO: Sweep is completed."
                                else
                                        echo "ERROR: Sweep is failed. Pleas check ->  rm -rf ${BAK_DIR}/${SWEEP_FILE}."
                                        exit 1
                                fi
                        fi
                fi

                CHECK_COUNTER=`expr ${CHECK_COUNTER} + 1`
        done

}

#AMOUNT OF BACKUP FILE.
AMOUNT=`ls -l ${BAK_DIR}/${FBK_FILE}.[${HOST}].* | wc -l`

#CHECK OLD FILES THAT OVER $BACKUP_DAYS AGO.
if [ $AMOUNT -gt ${BACKUP_DAYS} ]
then
    echo "ERROR: The amount of backup files offensehe occured. Sweep is started."
    sweepFile
fi


2010年10月にFirebird2.5がリリースされました。SuperClassicエンジンの実装により、よりパワフルに、よりスケーラブルになりました。(2012/11/6)
powered by Sylph  version.1.0 rc4 / ©1998-2004.DipMeshSystems .