VPSで遊ぶ -その12 :darとmysqldumpをつかってサーバーの月次フルバックアップと日次差分バックアップを取る(中編:ローカル鯖側への転送スクリプトの巻)

みなさんこんにちは、本日は中編:ローカル鯖側への転送スクリプトの巻です。(前編:VPS鯖側はこちら)
転ばぬ先の杖。転んだ場合は次から転ばないようにすぐに対策しませう。(但し動作実験は丁寧に。)

ローカル鯖(手元側)スクリプト

ローカル(手元)側のバックアップスクリプトはこんな感じ。

スクリプト5:rootユーザーのcrontab -e

45 06 * * * /root/bin/backup_sasv01.sh >/backup/remote/sasv01.log 2>&1
#55 06 * * * /root/bin/backup_sasv02.sh >/backup/remote/sasv02.log 2>&1

実際はこのローカル(手元側)の自鯖自体のバックアップスクリプトも、前回エントリーのスクリプト1の様に走らせていますが説明では省略します。

VPS鯖の月次&日次のバックアップファイル達が3時-4時台に作成完了し、手元の自鯖自体のバックアップが完了した後の頃合いを見計らった早朝6時台頃に

/root/bin/backup_sasv01.sh 
/root/bin/backup_sasv02.sh

…といった/root/bin/backup_VPS側サーバー名.shを順次起動しています。

VPS鯖が増えバックアップ対象が増えた初回だけ、

  • mkdir -p /backup/remote/sasv01/dailybk;
  • mkdir -p /backup/remote/sasv01/dar_file;
  • chmod -R 600 /backup/remote/sasv01

の様にバックアップファイル設置用ディレクトリを手動で作成しています。

また、/backup/のパーミッション等も気をつけてください。(別鯖の情報が詰まった重要ファイルなのでchmod 600 /backupでroot以外不用意に見れないようにしておく)


ディレクトリ構成の図

/backup/local/以下が手元の自鯖のバックアップ保存領域
/backup/remote/VPS側サーバ名1/,/backup/remote/VPS側サーバ名2/ 以下がVPS鯖側の保存領域



スクリプト6:/root/bin/backup_VPS側サーバー名1.sh
古いファイルを削除してrsyncで転送してるだけです。(認証鍵のみでのssh接続等は既に出来る様になっている前提です。)
古いファイルを削除するか、それとも削除しないか。保存日数を何日にするか等は環境によって変わってくると思います。
私の場合ここから更に通常は繋いでいない外付けHDDに毎月1度接続してrsync(delete無し)させて取り外し、別の場所に保管しています。

(&最重要ファイルは物理的に離れた別の場所にも転送&別鯖にも暗号化して保管しています。
地震雷火事水害窃盗での破損紛失を考え重要度にもよりますが最高5重位の修復ルートにしています。)

#!/bin/sh
NOW=`date +%Y%m%d`
BASE_DIR="/backup/remote/sasv01/dailybk" #VPS側サーバ名のディレクトリに必ず書き換える
LOCALDAR_DIR="/backup/remote/sasv01/dar_file" #VPS側サーバ名のディレクトリに必ず書き換える
PORT="10222" #VPSサーバー側ポート番号、必ず書き換える。(標準22)
SVUSR="backupusr@74.xx.x.xxx" #VPSにssh接続するユーザー名@接続先 (sshユーザー名@IPアドレス)公開鍵認証でノーパスワード接続可能なバックアップファイル転送専用ユーザーを作成しておく。このユーザーの操作出来る範囲を限定したい場合はopenssh側設定で要調整(解説省略)
LOCAL_DIR="$BASE_DIR/$NOW" #ローカル(手元)側の日付毎ディレクトリ

#VPSサーバー側のバックアップ保存用ディレクトリが存在しない場合は、あえて自動で作らないで処理終了
if [ ! -e "$BASE_DIR" ]; then
  echo "$BASE_DIR not exists ,exit"
  exit 1
fi
if [ ! -e "$LOCALDAR_DIR" ]; then
  echo "$LOCALDAR_DIR not exists ,exit"
  exit 1
fi


#本日の日付yyyymmddのディレクトリが存在しない場合は生成、存在する場合はバッチ処理終了
if [ ! -e "$LOCAL_DIR" ]; then
  mkdir $LOCAL_DIR
else
  echo 'dir exists'
  exit 1
fi
cd $BASE_DIR

#96日以上昔にtouchされたdailybk配下の20*で始まるディレクトリは自動削除
#(VPS側では31日保管、手元側では95日保管)
#手元側ディスク容量を考え最低32日以上で各自要調整

find $BASE_DIR -mtime +96 -type d -name "20*"|xargs rm -rf


#96日以上昔にtouchされた*.darファイルは自動削除
find $LOCALDAR_DIR -mtime +96 -type f -name "*.dar"|xargs rm -f

#リモート(VPSサーバー側)からrsyncでmysqlのダンプファイルとdarのアーカイブファイルを受信
nice -n 19 rsync -auvz -e "ssh -p $PORT" $SVUSR:/backup/local/dailybk/ $LOCAL_DIR
nice -n 19 rsync -auvz -e "ssh -p $PORT" $SVUSR:/backup/local/dar_file/ $LOCALDAR_DIR
  1. 手元にある96日以上昔にtouchされたファイルは削除し、rsync(deleteオプション無し)でVPSサーバ側のみにあるファイルを転送しています。
  2. mysqlのダンプファイルはVPS側には最新1日分しかバックアップを吐いていないですが、ローカル側では96日保管としています。(96=3ヶ月とちょっと:数日分はマージン)
  3. 厳密には安全のために前回のスクリプト3を改造しVPS側に7日分、手元側に96日分保管の様にするほうが、手元側鯖落ちによるファイル転送漏れでのmysqldumpバックアップ歯抜けが防止できるので良いかと思います。
  4. 私の場合VPSのディスク容量が少ない&トランザクション無しの静的に近いCMSコンテンツしかない(但し鯖によってはDBの数は多いので容量は食う)&最悪でも月次+日次差分darの中に含まれている/var/lib/mysql/DB名/* からデータを戻せるためmysqldumpについてはこのようになっています。
  5. 前日エントリーのスクリプト3のコメントに従いVPS側にも3日分mysqlのダンプを保存するようにした場合には、毎日生成される /backup/remote/VPS鯖名/dailybk/yymmdd/ 以下に3日分のmysql_dailybk_mysqldump_yyyymmdd.tar.gz が保存されるようになります。VPS側・ローカル側の空き容量が十分にある場合には、コピーの多いこちらのほうがより安全です。



後編(バックアップ&転送動作確認&バックアップからの復元確認編)に続く。

今日は忙しいのでここまで。