前回、定期バックアップするスクリプトを作成しました。バックアップはとりあえず残しておくだけでも良いのですが、保存したバックアップを使って元に戻す(リストア)ためのスクリプトも用意しておきましょう。
バックアップさえ残っていれば、一つひとつ手で戻すこともできますが、バックアップが必要になる状況では、焦ってしまうことも多く、思わぬ二次災害が発生してしまう可能性があります。いざという時に焦らず対処するためにも、リストアスクリプトを用意しておくと安心です。
今回は前回作成したスクリプトに合わせて、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
今回説明で利用したソースはこちらにあります。