ここ 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 と組み合わせたりするのが良いかと思います。
使い方
まずはファイルを設置
- 上記スクリプトの設定箇所を自分の環境にあわせて書き換え、backup.sh という名前で保存。ファイルの改行コードは LF(UNIX)。
- FTP でサーバに接続して、public_html と同じ階層に「backup-mysql」というディレクトリを作成。このディレクトリに backup.sh を入れてパーミッションを 700 に設定。
動作をテスト
まずは、SSH クライアントからコマンドをうってテストしてみます。
- XREA / CORESERVER の管理画面>「ホスト情報登録」ページへ行き、「SSH 登録」ボタンを押してホストを登録しておく。
- SSH クライアント(teraterm + SSH や、Poderosa や、putty など)で、自分のサーバ(s1.coreserver.jp 等)に接続。
-
下記のように 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 です。
- FTP で先ほど作られた mysql.○○○.tar.gz をダウンロードして、解凍ソフトで開いて中の .dump ファイルの内容を確認。
CRON を設定
自動で backup.sh を実行させるように、cron に設定します。
- XREA / CORESERVER の管理画面>「CRON ジョブ」ページへ行く。
- 「/virtual/ユーザー名/」と書いてある部分の右側、細長い入力欄に「backup-mysql/backup.sh」と記入。時間は分、時、にそれぞれ任意のものを入れて、あとは * としておけば、1 日 1 回、その時間に backup.sh が実行される。
あとは、メールが指定した時間にくるか確認して完了です :)
復活の呪文は?
バックアップしてあった .dump ファイルからデータベースのリストアを行います。間違っても現在利用中のデータベースに対しては行わないでくださいね。
- データを戻すためのデータベースを空の状態で作成しておく。
-
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 に寄稿しようかと思っていた内容だったりします。短くまとめて書く能力が足りず断念!そのうち書けたらいいなぁ。