CORESERVER や XREA で MySQL を自動でバックアップしてメールで送る

2011/06/27

ここ 2 年ほど、毎日自動で MySQL をバックアップしています。今日はそれについて。
キッカケは今から 2 年半ほど前、「データベース使用中? – MMRT daily life」という記事を見て、データベースがお亡くなりになる怖さを感じました。バックアップをこまめに取ればいい話ではあるのですが、手動では中々面倒で…。自動化できたらなーとズボラな事を思っていたら、「hiromasa.another :o)» Blog Archive » WordPress の MySQL バックアップ」という記事が。

hiromasa さんの記事では、シェルによるバックアップ方法が紹介されていました。

シェルによるバックアップの特徴

  • WP のデータベースのバックアップだけなら、簡単さは wp-dbmanager などの WP プラグインを利用する方法に負ける
  • 記事数が多くデータベースが大きい場合にも、シェルによるバックアップなら問題なくバックアップ&データベースを戻せる
  • WP 以外の用途の MySQL でも OK
  • タイムアウトしてしまって phpMyAdmin からでは上手くバックアップできない場合にも、シェルからなら大丈夫
  • 自動化するには、シェルスクリプトを cron で動かす必要がある

融通のきく方法なので、知っておいて損はないかと思います。

メールで送れたら良いな

元々 hiromasa さんのところに載っていたシェルスクリプトでは、サーバ上に MySQL のバックアップファイルを作り、指定の日数分を超えると削除されるようになっています。これに少しだけ手を加えて、メールでバックアップファイルを送れるようにしてみました。メールで送る場合には perl とあわせて使っていく方法などもありますが、私はシェルだけで終わるようにしてます。

#!/bin/sh

# 設定(ここを自分に合わせる)
DATABASE=●●●
DBUSERNAME=●●●
PASSWORD=●●●
XREAUSERNAME=●●●
BACKUPDIR=backup-mysql
KEEPDAY=14
MAILADDRESS=●●●

# 初期化(XREA/CORESERVER用)
PREFIX=mysql
SERVER=localhost
NOWDATE=`date +%Y%m%d`
DESTDIR=/virtual/$XREAUSERNAME/$BACKUPDIR
DUMPFILE=$PREFIX.$NOWDATE.dump
TARFILE=$PREFIX.$NOWDATE.tar.gz
OLDDATE=`date "-d$KEEPDAY days ago" +%Y%m%d`

# MySQLダンプ/圧縮
cd $DESTDIR
/usr/local/mysql/bin/mysqldump $DATABASE --host=$SERVER -u $DBUSERNAME --password=$PASSWORD -e -O net_buffer_length=500 > $DUMPFILE
tar zcvf $TARFILE $DUMPFILE

#メール送信
/usr/bin/uuencode $TARFILE $TARFILE | /usr/bin/mail -s "mysql backup $NOWDATE" $MAILADDRESS

# 処理判定
if [ $? != 0 -o ! -e $TARFILE ]; then
    echo "backup faild -- ($DUMPFILE)"
    exit 1
fi

# 圧縮前ファイル削除
rm -f $DUMPFILE

# n日ローテートを削除
rmfile=$DESTDIR/$PREFIX.$OLDDATE.tar.gz
if [ -e $rmfile ]; then
    rm -f $rmfile
fi

「#メール送信」と書いてある部分とその下の一行が私のほうで追加した部分です。この部分の内容は、以下のようになっています。

$ uuencode 元のファイル 添付ファイル名 | mail -s "メール件名" メールアドレス

これでサーバに MySQL のバックアップファイルが作られ、指定したメールアドレスに「mysql backup 日付」という件名でそのバックアップファイルが添付されたメールがくるようになります。このメールは私は gmail に送って、ラベルを付けて受信トレイはスキップさせるようにしています。

※Thunderbird で見ると添付ファイル部分がうまくデコードされないようですが、gmail だと上手いことしてくれます。

もっときっちりと、MIME を使ったメールを…と思う場合は perl と組み合わせたりするのが良いかと思います。

使い方

まずはファイルを設置

  1. 上記スクリプトの設定箇所を自分の環境にあわせて書き換え、backup.sh という名前で保存。ファイルの改行コードは LF(UNIX)。
  2. FTP でサーバに接続して、public_html と同じ階層に「backup-mysql」というディレクトリを作成。このディレクトリに backup.sh を入れてパーミッションを 700 に設定。

動作をテスト

まずは、SSH クライアントからコマンドをうってテストしてみます。

  1. XREA / CORESERVER の管理画面>「ホスト情報登録」ページへ行き、「SSH 登録」ボタンを押してホストを登録しておく。
  2. SSH クライアント(teraterm + SSH や、Poderosa や、putty など)で、自分のサーバ(s1.coreserver.jp 等)に接続。
  3. 下記のように SSH クライアントに入力します。

    cd backup-mysql

    cd で backup-mysql ディレクトリに移動。

    ls -laF

    ls -laF でファイル一覧を表示。打ち込むと、backup-mysql ディレクトリ内のファイルがズラズラっと表示されます。その中に backup.sh があるか確認。

    ./backup.sh

    backup.sh を実行。

    ls -laF

    ls -laF でファイル一覧を表示。ズラズラっと表示されたファイルたちの中に、mysql.○○○.tar.gz とあれば OK です。

  4. FTP で先ほど作られた mysql.○○○.tar.gz をダウンロードして、解凍ソフトで開いて中の .dump ファイルの内容を確認。

CRON を設定

自動で backup.sh を実行させるように、cron に設定します。

  1. XREA / CORESERVER の管理画面>「CRON ジョブ」ページへ行く。
  2. 「/virtual/ユーザー名/」と書いてある部分の右側、細長い入力欄に「backup-mysql/backup.sh」と記入。時間は分、時、にそれぞれ任意のものを入れて、あとは * としておけば、1 日 1 回、その時間に backup.sh が実行される。

あとは、メールが指定した時間にくるか確認して完了です :)

復活の呪文は?

バックアップしてあった .dump ファイルからデータベースのリストアを行います。間違っても現在利用中のデータベースに対しては行わないでくださいね。

  1. データを戻すためのデータベースを空の状態で作成しておく。
  2. mysql -u [ユーザ名] -p --default-character-set=utf8 [データベース名] < [バックアップ.dumpファイル] 

    hiromasa.another :o)» Blog Archive » WordPress の MySQL バックアップ』より引用

    上記のコマンドを SSH クライアントからサーバへ接続して入力。パスワードを聞かれるので MySQL のパスワードを入力。

おまけ:WP プラグイン wp-dbmanager で空ファイルが送られてくる場合

XREA / CORESERVER は php がセーフモードで動いているため、wp-dbmanager という WP プラグインを利用した場合に問題があります。メールでバックアップファイルが送られてくるように設定しても、バックアップファイルが空状態になるのです。

これを回避するには、wp-cron.php を cgi として動かしてあげる必要があります。

<files wp-cron.php>
AddHandler application/x-httpd-phpcgi .php
</files>

WP のインストールディレクトリ(wp-cron.php のある場所)にある .htaccess に上記の内容を追記すれば OK です。XREA / CORESERVER のセーフモードに関しては、以前書いた「XREA で WordPress ファイルアップロード機能を利用する | Numb.」をよろしければどうぞ。

ちなみに、この記事は WordPants に寄稿しようかと思っていた内容だったりします。短くまとめて書く能力が足りず断念!そのうち書けたらいいなぁ。