最近ではVPSの料金が安くなってきてwebサーバをVPSで立ちあげる方も多くなってきていると思います。

料金が安くなってもしっかりしておきたいのがバックアップ、VPSは自宅サーバと違いデータの分散化という意味でデータ保持の点でも有用ですが、VPS自体がおかしくなってもしっかりすぐに復旧できるようにバックアップ体制をとっておきたいものです。

何かがあったときにダメージは少なく!これがバックアップの基本でしょう。

VPSでWebサーバを立ち上げている時のバックアップの方針です。
1.保存したいディレクトリとMySQLのデータを自動的に固めてバックアップフォルダに保存。
2.一定期間ごとに他のサービスにその固めたデータを自動的に移す。

※自動化に関してはcronを使ってスクリプトを動かすようにします。
※動作はrootになるかsudoで実施してください。

それでは、1の固めてバックアップから方法を書いておきます。

1-1.バックアップフォルダの作成

適当にバックアップフォルダと、シェルスクリプトを置いておくフォルダを作成します。
mkdir /var/backup #バックアップフォルダ
mkdie /var/shell   #シェルスクリプトフォルダ
chmod 777 /var/backup
chmod 777 /var/shell
chmodで権限を変更します。

1-2.mysqldumpコマンド 専用ユーザー作成とmysqldump準備

mysqlのバックアップを取るためにバックアップ専用のmysqlユーザーを作ります。ここでは”bk_man”を作成します。そのユーザーにdump可能なように権限を与えます。

1.mysql接続
mysql –u admin名 –p db名

2.dump権限ユーザー追加
> grant select ,show view ,lock tables on db名.* to bk_man@localhost ;
(データベースが複数ある場合は全てのデータベースに実行)
> flush privileges; (設定反映)
> quit;

3.動作確認の為、dumpを実行
mysqldump –u bk_man DB名 > /var/backup/dump.sql

dump.sqlのデータがしっかりありそうならOKです!

1-3.MySQLのバックアップ
下記のようなシェルスクリプトを用意します。

#!/bin/bash

##環境変数####################################
#バックアップ先
D_DIR=”/var/backup/”

#DB 名
DB_NAME=(“wp_test”
“wp_2”
“wp_3”
“mydate”)

#DB ユーザー
DB_USER=”bkman”

#削除対象の日付 7日前
RMDAY=7

##処理#######################################

#DB loop
for DBNAME in “${DB_NAME[@]}”;
do

#削除対象の日付作成
RM_DATE=`date +”%Y%m%d” –date “${RMDAY} days ago”`

#今日の日付作成
TODAY=`date +’%Y%m%d’`

#dumpファイル名
D_FILE=${DBNAME}”-“${TODAY}”.sql”

##削除処理
#
for file in `find ${D_DIR}* -type f -name “${DBNAME}-*.sql.gz”` ;
do    #ファイルの日付取得
    F_DATE=`echo $file | sed -e “s/.*${DBNAME}-\([0-9]\{8\}\)\.sql\.gz$/\1/g”`
    #日付比較      F_DATE  <= RM_DATE
    if [   ` expr $F_DATE + 0` -le  ` expr $RM_DATE + 0 `  ] ; then

        #ファイル削除
        rm -f $file    fi

done;

##mysql dump 圧縮
#
mysqldump -u ${DB_USER}  $DBNAME > ${D_DIR}${D_FILE}
chmod 666 ${D_DIR}${D_FILE}
gzip ${D_DIR}${D_FILE}
done;

スクリプトはbashです。

基本的にDBの配列の分だけ、mysqldumpをしているだけです。

上記シェルスクリプトを作成した/var/shellに保存。

実行してみて動作確認しましょう。

1-4.ファイルデータ(フォルダ)のバックアップ
mysqlのバックアップより簡単です。
tarを利用して固めます。

#!/bin/bash

##環境変数####################################
#バックアップ元のrootディレクトリS_ROOT_DIR=”/home/username/public_html/”

#バックアップ元ディレクトリ
S_DIR=(“mydomain”
“mydomain2”
“mydomain3”)

#バックアップ先
D_DIR=”/var/backup/”

#削除対象の日付 7日前
RMDAY=7

##処理#######################################
#DB loop
for SDIR in “${S_DIR[@]}”;
do

#削除対象の日付作成
RM_DATE=`date +”%Y%m%d” –date “${RMDAY} days ago”`

#今日の日付作成
TODAY=`date +’%Y%m%d’`

#バックアップファイル名
D_FILE=${SDIR}”-“${TODAY}”.tar.gz”

##処理#######################################
#DB loop
for SDIR in “${S_DIR[@]}”;
do

#削除対象の日付作成
RM_DATE=`date +”%Y%m%d” –date “${RMDAY} days ago”`

#今日の日付作成
TODAY=`date +’%Y%m%d’`

#バックアップファイル名
D_FILE=${SDIR}”-“${TODAY}”.tar.gz”

##削除処理
#
for file in `find ${D_DIR}* -type f -name “${SDIR}-*.tar.gz”` ;
do

    #ファイルの日付取得
    F_DATE=`echo $file | sed -e “s/.*${SDIR}-\([0-9]\{8\}\)\.tar\.gz$/\1/g”`

    #日付比較      F_DATE  <= RM_DATE
    if [   ` expr $F_DATE + 0` -le  ` expr $RM_DATE + 0 `  ] ; then

        #ファイル削除
        rm -f $file

    fi

done;

##tar圧縮
#
tar -C ${S_ROOT_DIR} -czPf ${D_DIR}${D_FILE}   ${SDIR}
chmod 666 ${D_DIR}${D_FILE}

done;          

こちらも1回動作確認します。
データがしっかり設定したところに固めて保存されればOKです。

ここまでで、データを固めてバックアップフォルダに保存するシェルスクリプトが2つ完成しました。あとはこれをcronで自動的に実行するように指定します。

1-4.cronでの自動実行設定

crontab –e

0 5 * * * /var/shell/backup_mysql.sh  #AM5:00 実行
15 5 * * * /var/shell/backup_tar.sh  #AM5:15 実行

このような形で先ほど作成したshファイルを指定します。

以上で毎日朝5時ごろに自動バックアップが行われます。上記のスクリプトでは7日前のバックアップファイルは自動で削除されていきます。

次に、そのデータを他の部分に移動させる設定も作ります。

2.一定期間ごとに他のサービスにその固めたデータを自動的に移す。

移動先になりますが、自宅サーバがある場合や他のサービスを契約していてそちらをバックアップとして使いたいなら、sshなどでrsyncを使えばいいと思います。
rsyncのシェルを使ってそれもcronに書いておきます。

ここではDropboxにデータを保存しておく方法を説明します。
これを機会にDropboxを使ってみてもいいでしょう。

DropBoxはフリーで2GBの領域がありますが、紹介制度を使うと少し要領がアップします。
こちらからサインインしてください
(私もサインインしたあなたも両方、容量がちょっと増えます)

DropboxへのVPSからのデータのアップロードですが、
Dropbox Uploaderというシェルスクリプトを利用すると簡単に出来ます。
http://www.andreafabrizi.it/?dropbox_uploader
こちらのシェルスクリプトを使って自分のdropboxにアップロードするシェルスクリプトを書いて、
再びcronで自動実行するようにすればOKです。

だいたい一週間に1回ぐらいアップロードさせればOKかなと思います。
重要度によってバックアップ間隔は変えてください。

以上、簡単ですがバックアップ方法でした。