アクセラと+αな生活
アクセラとα350と共に過ごす気まぐれ日記です。
Firefox ブラウザ無料ダウンロード
2017年06月
≪05月  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30    07月≫
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
VineLinux のデータバックアップする。(その2)で追加したバーチャルハードディスクも使用できるような状態になりました。

お次は追加したディスクへのバックアップを行うシェルの作成です。


当たり前の話ですが、バックアップ中にバックアップ対象のデータ更新が行われた場合、バックアップデータに不整合が発生します。
うちの Vine ちゃんの環境では、PostgreSQL というデータベースが稼動しており、データベースを稼動したままデータファイルをバックアップすると、不整合が発生する可能性があります。
バックアップはそんなに時間が掛からないので、その間にデータベースの更新は行われないだろう。。。なんて楽観的な仕様は NG ですねww
(リストアした時にデータ不整合が。。。なんて笑い話にもなりませんからね)

ということで、今回は業務を停止させる、オフラインバックアップ(業務を停止し、更新が行われない状態(オフライン状態)でのバックアップ)にします。

【バックアップの仕様】
今回作成する、バックアップシェルの仕様をまとめておきます。
 ○業務を停止するオフラインバックアップとする
 ○サンプルで掲載しているシェルの業務は PostgreSQL のみとする
  (実際に組み込んでいるシェルはややこしいので、他の業務停止は割愛してます)
 ○バックアップシェルの中で業務の停止、バックアップ後の業務起動を行う
 ○バックアップ開始時にバックアップ領域をマウント(接続)し、バックアップ完了後はバックアップ領域をアンマウント(切り離し)する
 ○バックアップ領域のマウントに失敗した場合、バックアップを停止する
  (すでにマウント済みの場合でも前回のバックアップが正常に終了していない可能性があるため、エラーとして扱う)
 ○バックアップの自動実行を考慮し、ログ出力(/var/log/配下へログ出力)を行う
 ○ログは日本語にしてみる
  英語の方がスマートですけど、やはり、分かりやすい方がいいのでw
 ○バックアップするディレクトリは「/var」、「/home」とする

まあ、こんな感じの仕様です。

で、作成したシェルはこんな感じww

#! /bin/sh
####################################
# バックアップシェル
#
# ※実行結果は「$backup_log_file」へログ出力
#
####################################

backup_log_dir=/var/log/
backup_log_name=backup.log
backup_log_file=$backup_log_dir$backup_log_name
backup_area=/mnt/backup
backup_device=/dev/hdd1


# ログ出力開始
echo '['`date +'%Y/%m/%d %T %Z'`']' `hostname` '【バックアップジョブ】を開始します' >> $backup_log_file

# バックアップ領域のマウント
mount $backup_device $backup_area
return_code=$?
if [ "$return_code" == "0" ];then
  echo '['`date +'%Y/%m/%d %T %Z'`']' `hostname` 'バックアップ領域をマウントしました(Return Code:'$return_code')' >> $backup_log_file
else
  echo '['`date +'%Y/%m/%d %T %Z'`']' `hostname` 'バックアップ領域のマウントに失敗しました(Return Code:'$return_code')' >> $backup_log_file
  echo '※バックアップジョブを中止しました' >> $backup_log_file
  exit $return_code
fi

# 業務停止(PostgreSQL)
/etc/rc.d/init.d/postgresql stop
echo '['`date +'%Y/%m/%d %T %Z'`']' `hostname` 'PostgreSQLを停止しました' >> $backup_log_file

# バックアップ実行
backup_dir=/var/
echo '['`date +'%Y/%m/%d %T %Z'`']' `hostname` $backup_dir'のバックアップを開始します' >> $backup_log_file
rsync -a --delete $backup_dir $backup_area$backup_dir >> $backup_log_file
return_code=$?
if [ "$return_code" == "0" ];then
  echo '['`date +'%Y/%m/%d %T %Z'`']' `hostname` $backup_dir'のバックアップが完了しました(Return Code:'$return_code')' >> $backup_log_file
else
  echo '['`date +'%Y/%m/%d %T %Z'`']' `hostname` $backup_dir'のバックアップに失敗しました(Return Code:'$return_code')' >> $backup_log_file
  echo '※バックアップ処理は続行します' >> $backup_log_file
fi

backup_dir=/home/
echo '['`date +'%Y/%m/%d %T %Z'`']' `hostname` $backup_dir'のバックアップを開始します' >> $backup_log_file
rsync -a --delete $backup_dir $backup_area$backup_dir >> $backup_log_file
return_code=$?

if [ "$return_code" == "0" ];then
  echo '['`date +'%Y/%m/%d %T %Z'`']' `hostname` $backup_dir'のバックアップが完了しました(Return Code:'$return_code')' >> $backup_log_file
else
  echo '['`date +'%Y/%m/%d %T %Z'`']' `hostname` $backup_dir'のバックアップに失敗しました(Return Code:'$return_code')' >> $backup_log_file
  echo '※バックアップ処理は続行します' >> $backup_log_file
fi

# 業務開始(PostgreSQL)
/etc/rc.d/init.d/postgresql start
echo '['`date +'%Y/%m/%d %T %Z'`']' `hostname` 'PostgreSQLを開始しました' >> $backup_log_file

# バックアップ領域のアンマウント
umount $backup_area
return_code=$?
if [ "$return_code" == "0" ];then
  echo '['`date +'%Y/%m/%d %T %Z'`']' `hostname` 'バックアップ領域をアンマウントしました(Return Code:'$return_code')' >> $backup_log_file
else
  echo '['`date +'%Y/%m/%d %T %Z'`']' `hostname` 'バックアップ領域のアンマウントに失敗しました(Return Code:'$return_code')' >> $backup_log_file
  echo '※処理は続行しますが、バックアップジョブ処理完了後、バックアップ領域をアンマウントして下さい' >> $backup_log_file
fi

# ログ出力(完了)
echo '['`date +'%Y/%m/%d %T %Z'`']' `hostname` '【バックアップジョブ】が完了しました' >> $backup_log_file

exit 0


で、ログはこんな感じで出力されます。

[yyyy/mm/dd hh:mm:ss JST] hostname 【バックアップジョブ】を開始します
[yyyy/mm/dd hh:mm:ss JST] hostname バックアップ領域をマウントしました(Return Code:0)
[yyyy/mm/dd hh:mm:ss JST] hostname PostgreSQLを停止しました
[yyyy/mm/dd hh:mm:ss JST] hostname /var/のバックアップを開始します
[yyyy/mm/dd hh:mm:ss JST] hostname /var/のバックアップが完了しました(Return Code:0)
[yyyy/mm/dd hh:mm:ss JST] hostname /home/のバックアップを開始します
[yyyy/mm/dd hh:mm:ss JST] hostname /home/のバックアップが完了しました(Return Code:0)
[yyyy/mm/dd hh:mm:ss JST] hostname PostgreSQLを開始しました
[yyyy/mm/dd hh:mm:ss JST] hostname バックアップ領域をアンマウントしました(Return Code:0)
[yyyy/mm/dd hh:mm:ss JST] hostname 【バックアップジョブ】が完了しました


バックアップ領域がマウント済みの場合、エラー停止する仕様ですが、マウント済みのリターンコードは「32」になるので、「32」の場合は処理を続行させるように「if」分岐を修正すれば、マウント済みでもエラー停止しないようになります。

バックアップ時間が長くて気になるようでしたら、バックアップ(rsync)を並列(例えば、バックグラウンドで実行させるなど)で動かすようにすれば、バックアップ時間を短縮できます。
ただし、並列実行すると、ログが分かりにくくなるので、工夫する必要があります。
また、並列実行による CPU 負荷、ディスク I/O も考慮した上で並列実行を行って下さい。


あとは自動実行。。。
時間指定の実行であれば、「cron」で実行させるように設定すれば OK です。
cron での自動実行、ログの自動ハウスキーピングは
VineLinux4.2で AVG Anti-Virus 8.5 をセットアップしてみる(その2)を参考に設定して下さい。

コメント
この記事へのコメント
URL :
コメント :
パスワード :
管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
Template designed by アクセラと+αな生活

Powered by .
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。