2017-01-14

tobijibu

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

今の現場ではRedmineを利用しており、定期的にバックアップしています。バックアップはRedmineに限ったことではないので、cronでのMySQLのダンプと、特定ディレクトリのバックアップ方法について解説していきたいと思います。

ここではRedmineをバックアップする想定でスクリプトを解説します。Redmineは下記ディレクトリにある想定です。

/var/lib/redmine

バックアップ用ディレクトリ名を生成

バックアップは基本的に過去に遡って複数のファイルを保持していきます。ですので、バックアップするデータを格納するディレクトリの名称にバックアップの開始時間を設定し、そしてその時間のディレクトリを作成します。そうすることで、「いつのバックアップしたファイルか」がファイル名から分かります。

# ファイル名を生成(YYYYMMDD_HHMM) 
DATE=`date '+%Y%m%d_%H%M'`

# バックアップ時刻の保存用一時ディレクトリ作成 
mkdir -p /home/tobijibu/redmine/$DATE

作成したディレクトリにdumpファイルや、バックアップ対象のファイルをコピーしていきます。

ファイルコピー

バックアップ対象のファイルをコピーします。コピー先は先ほど生成したバックアップ用ディレクトリにコピーします。

# Redmineのfilesディレクトリを保存用ディレクトリにコピー
cp -Ra /var/lib/redmine/files /home/tobijibu/redmine/$DATE

Redmineでは/var/lib/redmine/filesのみで良いようなので、このディレクトリだけコピーします。利用ソフトや、バックアップを取っておきたい対象に応じてコピーをしていきましょう。

mysqldump

まず、mysql接続情報を設定します。ここではtmpファイルを生成して、その中に追記する形で定義しています。

# mysqlアクセス情報格納一時ファイルを作成
MYSQLCLIENT_CNF=`mktemp`
echo "[client]" >> $MYSQLCLIENT_CNF
echo "user = (ユーザー名)" >> $MYSQLCLIENT_CNF
echo "password = (パスワード)" >> $MYSQLCLIENT_CNF

定義した内容を使ってmysqldumpを実行します。

# mysqlをdumpして保存用ディレクトリに生成
mysqldump --defaults-extra-file=$MYSQLCLIENT_CNF redmine > /home/tobijibu/redmine/$DATE/mysql.dump

mysqldump-u-pを使って実行することもできます。

mysqldump -u <ユーザー名> -p<パスワード> redmine > /home/tobijibu/redmine/$DATE/mysql.dump

今回は--defaults-extra-fileを利用しました。今回は1ユーザーでの実行を想定しているため、-uオプションと-pオプションを利用しても構いません。--defaults-extra-fileオプションを使うと、例えばユーザーIDとパスワードを外部化して、スクリプト実行ユーザーによってmysqlのログインユーザーを変えるといったことも可能になります。

仕上げ

データをバックアップ用ディレクトリにコピーできたので、バックアップ用ディレクトリを圧縮します。

# 保存用ディレクトリをtar.gz形式で圧縮
tar czfp ./${DATE}.tar.gz ./$DATE

一時的に利用したディレクトリと一時ファイルを削除します。

# 一時ファイル、保存用ディレクトリを削除
rm -rf ./$DATE
rm -rf $MYSQLCLIENT_CNF

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

$ chmod 700 bkup_redmine.sh

あとはバックアップタイミングに応じてcronを設定してやります。今回は1時、12時、15時、18時で設定しました。

0 1,12,15,18 * * * /home/tobijibu/bkup_redmine.sh

これで定期的にRedmineのバックアップをとっておく設定ができました。

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

参考サイト

Redmineのバックアップについて記載されています。
http://redmine.jp/faq/system_management/backup/