現在、CPIさんの仮想専用サーバで開発しているが、

な、な、なんと!

50GBのバックアップサーバを無料で借りることができる。

共用バックアップストレージ|専用サーバー|レンタルサーバーなら【CPI】


というわけで、

データベースのバックアップサーバとして利用することにした。


とりあえずリモートにログイン

CPIのサーバではrootというアカウントはいないので、

細かいことは気にせず初期管理者のホーム直下でバックアップする。


ログイン後、

#最初にexpectをインストールしておく
sudo apt-get install expect

$ mkdir backup
cd backup
emacs dbbackup.sh

これでバックアップ用のシェルスクリプトを作成する。


dbbackup.shには下記のコードを書いた。

#!/bin/sh

#バックアップは3日
period=3

#バックアップ用のディレクトリ
bkdir='/home/**********/backup'

#ファイル名を定義                                                               
filename=`date +%y%m%d`

#MySQLのパスワード
PASSWORD="*****************"

# mysqldump実行                
PROC_DUMP=`MYSQL_PWD=${PASSWORD} mysqldump --opt --all-databases --events -\
-default-character-set=binary -u root | gzip > $bkdir/$filename.sql.gz`

echo ${PROC_DUMP}

# 古いバックアップファイルの削除に関する処理をここに書く

ACCOUNT = "******"
HOST = "****************"
PW = "***********"

#バックアップサーバに圧縮したデータベースファイルを転送
expect -c "                                                                     
spawn scp -P ***** ${filename}.sql.gz ${ACCOUNT}@${HOST}:/backup     
expect \"${ACCOUNT}@${HOST}'s password:\n\"                          
send -- \"${PW}\n\"                                                          
expect {\"100%\" { exit 0 }}                                                                       
"

※expect {\"100%\" { exit 0 }}がないと、cron実行時にscpコマンドが想定通りに実行されない


こんな感じ。

mysqldumpを一回変数に入れた後にechoで呼び出しは、

比較的新しいバージョンのMySQLではこうしておかないとwarningエラーになるらしい。


圧縮したデータベースファイルを転送する際、

expectを利用して平文のパスワードと一緒にscpで転送しているのは、

本当は認証鍵で送りたかったけど、

バックアップサーバの方が認証鍵に対応していないらしいからしぶしぶ。


ここまで出来たら、

sudo chmod +x dbbackup.sh

をして、cronに毎日早朝3時頃にこのスクリプトを実行する様に設定したら終了。


最後にバックアップサーバにログインして、

mkdir backup

バックアップ用のディレクトリを作成しておく。


とりあえず、

./dbbackup.shを実行してバックアップサーバに圧縮されたデータベースファイルがあることを確認しておく。