2017-01-15

tobijibu

バックアップのリストアスクリプトを作成する

前回、定期バックアップするスクリプトを作成しました。バックアップはとりあえず残しておくだけでも良いのですが、保存したバックアップを使って元に戻す(リストア)ためのスクリプトも用意しておきましょう。

バックアップさえ残っていれば、一つひとつ手で戻すこともできますが、バックアップが必要になる状況では、焦ってしまうことも多く、思わぬ二次災害が発生してしまう可能性があります。いざという時に焦らず対処するためにも、リストアスクリプトを用意しておくと安心です。

今回は前回作成したスクリプトに合わせて、Redmineのバックアップをリストアするスクリプトを元に説明します。前回同様、Redmineは下記ディレクトリにある想定です。

/var/lib/redmine

ファイルチェック

バックアップはバックアップ用のディレクトリにバックアップ時間別に保存しました。リストアするとき、どのバックアップを使うか決めることになりますが、今回はその判別をスクリプトに渡すパラメータ(yyyymmdd_HHMM形式)で判断させます。

まずはパラメータの有無を判定します。パラメータが無ければスクリプトをそこでストップさせます。

if [ ! $1 ]; then
    # ディレクトリ名が渡されてないならメッセージ表示
    echo "Error: please set dirname(bkup date yyyymmdd_HHMM)"
    exit 1
fi

続いて、バックアップディレクトリ内にパラメータで渡された名前のファイルの有無を判定します。

DIRNAME=$1
BKUPPATH=/home/tobijibu/redmine_bkups
BKUPDIR=$BKUPPATH/$DIRNAME
if [ ! -e ${BKUPDIR}.tar.gz ]; then
    # 指定したファイルが無いならエラー
    echo "Error: not filename"
    exit 1
fi

ファイル解凍

バックアップファイルを解凍します。圧縮時はディレクトリのデータを解凍しました。解凍前のデータはディレクトリのはずなので、解凍後の結果がディレクトリでなければエラーにします。

tar xvzfp ${BKUPDIR}.tar.gz -C $BKUPPATH
if [ ! -d $BKUPDIR ]; then
    # 解凍したファイルがディレクトリでないならエラー
    echo "Error: not dirname"
    exit 1
fi

続いて解凍したディレクトリを所定の場所に移動します。その前に、ファイルの所有者をRedmineから利用できるように所有者を変更しておきます。

# Redmineのfilesの所有者を変更
chown -R apache:apache $BKUPDIR/files
# Redmineのディレクトリへコピー
cp -Ra $BKUPDIR/files /var/lib/redmine

これでファイルのリストアが完了しました。

mysqlリストア

前回と同じようにmysql接続情報を設定します。

MYSQLCLIENT_CNF=`mktemp`
echo "[client]" >> $MYSQLCLIENT_CNF
echo "user = (ユーザー名)" >> $MYSQLCLIENT_CNF
echo "password = (パスワード)" >> $MYSQLCLIENT_CNF

バックアップ内にあるmysql.dumpをmysqlにリストアします。

mysql --defaults-extra-file=$MYSQLCLIENT_CNF redmine < $BKUPDIR/mysql.dump

後処理

リストアで使ったファイルはもう使わないので削除してしまいます。

rm -rf $BKUPDIR
rm -rf $MYSQLCLIENT_CNF

今回もこのスクリプトにはmysqlのユーザーとパスワードが平文で記載されています。念のため他のユーザーが読み取れないように権限を設定しておきましょう。

$ chmod 700 restore_redmine.sh

これでバックアップをリストアするスクリプトができました。実際必要になった場合には以下の方法で実行すればリストアすることができます。

$ sh restore_redmine.sh 20170115_0100

今回説明で利用したソースはこちらにあります。