WordPress の MySQL バックアップ

Masayan さんのところのデータベースがとんだのを期に高まる、MySQL バックアップ機運 🙂 ということで、シェル/cron をつかった MySQL バックアップ方法とか書いてみます。

phpMyAdmin とかその他プラグイン系でもバックアップはとれますが、データベースサイズが大きくなってくると http タイムアウトとの戦いになってきます。 また、バックアップ戻しも http アップロードから SQL 発行となりますので、ファイルのアップロード容量制限なども加わり難しい問題に直面しそうな雰囲気があります。

てなわけで、大抵のサーバは ssh の接続がサポートされていますので MySQL のバックアップ関連はこちらで操作するといいかもしれません。 まずは手動のシェル起動によるバックアップ、これがうまくいったら cron にこのシェルを登録してみます。

ここでは、XREA/CORESERVER でのやりかたです。 他のサーバでも大してかわらないでしょう。

まずシェルを配置するディレクトリをサーバ上につくります。 XREA/CORESERVER では Apache のドキュメントルートより上がつかえますのでここに FTP などでディレクトリを作成します。 public_html (ドキュメントルート)と同列にbackup-mysql としました。

 backup11

で、そのディレクトリの中に以下のシェルを backup.sh として格納します。 このシェルは kohaku さんが使われているものを、設定しやすいように修正したものです。

#!/bin/sh
 
# 設定(ここを自分に合わせる)
DATABASE=another
DBUSERNAME=another
PASSWORD=********
XREAUSERNAME=another
BACKUPDIR=backup-mysql
KEEPDAY=14
 
# 初期化(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 > $DUMPFILE
tar zcvf $TARFILE $DUMPFILE
 
# 処理判定
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

(2008/10/18 追記)

上記の mysqldump オプションであると、1テーブルに大量にデータがある場合に、mysql クライアントによってはうまくインポートできない場合があるようです。 また、テキストエディタで開いたときも、よこに長い行ができて操作しづらいため 以下にする指定して横の maxsize を指定すると良いようです。 ただしインポート速度は犠牲になります。

/usr/local/mysql/bin/mysqldump $DATABASE --host=$SERVER -u $USERNAME --password=$PASSWORD -e -O net_buffer_length=500 > $DUMPFILE

(2008/10/18 追記終わり)

DATABASE、USERNAME、PASSWORD を自分の MySQL アカウント・バックアップしたいデータベースに変更します。 バックアップファイル格納ディレクトリを backup-mysql 以外にしたときは BACKUPDIR も変更してください。

ファイルの改行コードは UNIX にしてください。 Linux をお使いの方はなにも考えないで FTP アップロードで OK です。

で、できたらこの backup.sh に FTP クライアントなどで実行権限をつけます。 700 にしましょう。

準備ができたら、サーバに ssh 接続しこのシェルを起動して実行確認します。 ssh 接続は Windows の方は以下を参考に・・・。

hiromasa.another :o) » Blog Archive » CORESERVER & XREA での SSH 接続

最近はレンタルサーバで SSH の接続を許可しているところも多くなりました。 SSH 経由で UNIX に接続できると、たとえば FTP では結構面倒な一括ファイル操作や、前のエントリで書いたような svn、また cron の設定とか、gcc を使った C ベースの CGI のコンパイルとかいろいろできるようになります。

Linux の方は、ホスト名登録後、端末から以下のコマンドをうつだけでつながります。

ssh -l [ユーザ名] [サーバ名]
 
ex. ssh -l another s8.coreserver.jp

という感じです。

backup10

で、つながったらカレントディレクトリを先ほどのシェル格納ディレクトリに移します。 コマンドは cd ですね。 🙂

cd backup-mysql

そこのコマンド全部入力しようとしたあなた! TAB キーをつかいましょう。  "cd ba" くらいまでコマンド入れて TAB おすとコマンド補完してくれます。 ファイル名などの入力ではこれをつかうと間違わずに済みます。 ご活用を。 🙂

カレントディレクトリがうつったら、一応 ls で backup.sh があることを確認です。

another@s8:~> cd backup-mysql/
another@s8:~/backup-mysql> ls -laF
total 5
drwxr-xr-x  2 another hpusers  80 2008-10-11 16:03 ./
drwx---r-x  9 another hpusers 608 2008-10-11 15:30 ../
-rwx------  1 another hpusers 801 2008-10-11 15:16 backup.sh*
another@s8:~/backup-mysql> 

こんな感じなら OK です。 ではシェルを実行。 ./backup.sh と入力します。 ドットスラッシュってうって TAB おせば補完してくれるでしょう。 なにか動いたようであれば ls でファイル確認です。

another@s8:~/backup-mysql> ls -laF
total 1986
drwxr-xr-x  2 another hpusers     120 2008-10-11 16:04 ./
drwx---r-x  9 another hpusers     608 2008-10-11 15:30 ../
-rwx------  1 another hpusers     801 2008-10-11 15:16 backup.sh*
-rw-r--r--  1 another hpusers 2023812 2008-10-11 16:04 mysql.20081011.tar.gz
another@s8:~/backup-mysql> 

こんなふうに .tar.gz で圧縮されたファイルができていればまずは成功。 圧縮ファイルを FTP でダウンロードして中身に .dump ファイルがありますので、テキストエディタでひらいて SQL の内容を確認してください。

うまくいったらこのシェルを cron 登録します。 cron は 3分の実行時間制限があるようなので、もし上の手動起動で 3 分をこえるようであれば残念ながら自動実行はできません。 まー、いくらなんでも 3分ってことはないとおもうので、ほとんどの場合大丈夫でしょう。 シェルの方は 14 日前の古い .tar.gz を削除するようになっています。

さてバックアップをとったら、バックアップ戻しを知っておく必要があります。

MySQL の場合はエクスポートがただの SQL なので、ここでとった .dump ファイルを phpMyAdmin にたべさせても復元できますが、前述のとおりアップロード時間などの制限がありますので、こちらもシェルでやったほうがいいでしょう。

ここから先は、戻しのときだけ。 以下のコマンドでいけるハズです。

インポートデータベース先とか間違うと大変なことになりますので、細心の注意で緊急事態までやらぬよう・・・。 戻し先のデータベースは事前に空で作成しておきます。ローカルで MySQL 動かしている方は、サーバから取得した .dump で実験するといいと思います。

引数には .tar.gz の圧縮ファイルではなく中身にはいっている .dump をわたします。

mysql -u [ユーザ名] -p --default-character-set=utf8 [データベース名] < [バックアップ.dumpファイル]
 
ex. mysql -u another -p --default-character-set=utf8 another < mysql.20081011.dump

パスワードきーてくるので、MySQL のパスワードいれればOKです。

XREA/CORESERVER の場合は、Web サーバと MySQL が同一(localhost) なので、サーバのハードディスク自体がクラッシュするとこのバックアップもろとも飛んでしまうという弱点があります。 まぁこっそり RAID くらいしている気もするのでそうそうないと思いますが、ファイル化されても安心せずに定期的に FTP 取得してください。

本来なら GMail なんかに送信できるといいのですが、添付ファイルつきのメール送信でうまい方法を思いつかなかったので今回はとりあえず・・・。 PHP キックすればいいかな、、とか。

AutoMySQLBackup など高機能なシェルもありますので、こちらを使うのもよいかもしれません。 ただ mail コマンドをつかっているようで、GMail にはうまくとばすことができませんでした。

てなわけで、転ばぬ先のバックアップの巻でありました。

fetchmail + maildrop + IMAP でメールをサーバ振り分けする

うちには PC がたくさんあり、メールをあっちこっちから POPで受信すると大変なことになるため、一回サーバでうけてそのメールボックスを IMAP で LAN 内に公開する形にしています。 こうしておくと、メールクライアントも自由に選べますし、PC を再インストールするときなんかもバックアップとらなくて済むので便利です。

ところで、我らが Mozilla の Thundirbird さんですが IMAP でつなぐとどーにもこーにもパフォーマンスがでない。 特にぼくのメールボックスは 2002 年くらいからのメールがそのままのこっているためメール数が多く、正直 Thundirbird ではつかえないくらい遅くなってしまいます。 (3.0 で速くなるかな~)

というわけで、メインで使っている Linux さんのほうは別のメールクライアントってことで、本格的に Sylpheed を使い始めました。

Sylpheed – lightweight and user-friendly e-mail client

Sylpheedはシンプル、軽量かつ高機能で使いやすい電子メールクライアント(メールソフト、メーラ、MUA)です。

SylpheedはLinux、BSD、Mac OS X等主にUnix系のシステム、そしてWindowsなど多数の環境でで動作します(Windows版についての詳細はWikiを参照してください)。

IMAP でも優れた性能を発揮してくれて、特にフォルダ間のメールの移動などはおそらく Thundirbird の体感倍くらいの速度がでるのではないかと思います。

network02

和製なので、文字化け等の心配もなく、作者さんも使い込んでつくっている印象があり、ユーザインターフェースも分かりやすく実用的です。

さて、このようにメールクライアントがあちこちにある場合 IMAP をひとつおくと便利で、ずっと使っていたのですが長年ひとつ問題をかかえていたのでありました。 それはメールのフォルダ振り分けなのですが、これは実は各クライアントでやらせていました。

振り分けはいっかい設定するだけでいいといえばいいのですが、メーリングリストとか増やしてしまうと全台追加しなければいけなく、そんなことぼくがまめにやるわけもなく、あるクライアントでうけると非常に面倒なことになるということが起きつつありました。

また、iPod touch がバージョンアップで IMAP みれるようになりましたが、振り分けができない(たぶん)ので、ここいらで思い切ってサーバサイドで振り分けをしてみることにしてみました。  touch でメールみるの結構便利です。 ちょっと工夫すればオフ読みできるし。 🙂

今のネットワーク構成はこんなかんじです。 描いているうちにおもしろくなって他のこともかいてしまいまった。 そうそう、RD とかもつながってるんだ。書き忘れた。(笑)

network01

真ん中のサーバとなっている CentOS くん(Linux) が fetchmail というソフトでいろんなところのメールサーバに一定周期でつなぎにいって、POP でとってきています。 それをいままでは postfix にわたしてメールボックスに格納していたのですが、これをやめ、メール振り分けするために maildrop というソフトに渡すことにしました。

.fetchmailrc の内容はこんなかんじです。

[hiromasa@repository ~]$ cat .fetchmailrc 
set logfile "/home/hiromasa/log/fetchmail.log"
set postmaster hiromasa
set no bouncemail
 
defaults
     protocol pop3
     flush
     no mimedecode
     #smtphost localhost
     mda "/usr/bin/maildrop"
     #keep
 
poll pop.mail.yahoo.co.jp
     protocol pop3
     user maple4estry
     password *********

mda に /usr/bin/maildrop を指定しているところがみえます。

でもって、maildrop の設定ファイル、 .mailfilterです。

[hiromasa@repository ~]$ cat .mailfilter 
MAILDIR="$HOME/Maildir"
DEFAULT="$HOME/Maildir/"
 
logfile "$HOME/log/maildrop.log"
 
if (/^Subject: .*Cron/)
{
        to "$MAILDIR/.Cron/"
}
 
if (/^Subject: \[wp-testers/)
{
        to "$MAILDIR/.wp-testers/"
}
 
if (/^Subject: \[PHP/)
{
        to "$MAILDIR/.PHP-users/"
}

こんなかんじに、メールヘッダを判定させて各メールボックスのディレクトリに振り分けていけばいいようです。

メールの振り分けって目で見えていないとどうも怖くって、いままで二の足を踏んでいましたが、設定を「条件にあたらなければデフォルト」とする方式すればいいので間違ってもメールが闇にきえることはなさそうです。

あと、 maildrop が失敗したときは fetchmail が POP から消さずにうまいこと keep してくれました。 最初のうちはログをみながら運用するといいかもしれません。

てなわけで、うちにいっぱいPCがある方はやってみるといいかもしれません。 サーバおくのはお手軽感覚はありませんが、、玄箱とか NAS を debian 化してこれらのソフトをいれると、スイッチぽんでいけるので便利かもしれません。 🙂

Firefox の拡張をつくってみる

なんか最近「~つくってみる」ってのが多い気もしますが、今回は Firefox の拡張をつくってみました。 せっかく手持ちでつかっているアプリは、自分でいろいろいじれたほうが面白いですよね。

先日ふと、WordPress っぽいサイトをみたときにソースをみて WordPress 製かどうかを確認する自分の行動に気がついたので、それを そのまんま extension として実装してみました。

たいしたことないです。 HTML の head をみて wp-content とかジェネレータとか WP っぽいシグネチャもっていたらステータスバーのアイコンをぴこん、させるだけです。 名前は、 Pikon!WP です。(笑)

pikonwp01 

さて、Firefox の拡張は .xpi というファイル形式で、要はプログラムを適切な形につめた、 .zip ファイルです。 (拡張子 .zip にして展開したらプログラム出てきます)

でもって、この形式ちょっとディレクトリ構成とかマニフェストファイルとかが特殊で間違えそうな感じだったので、ひな形を Eclipse の Firefox 拡張プロジェクトを生成してくれるプラグインでつくってもらいました。

Spket IDE – JavaScript Editor

Spket IDE is powerful toolkit for JavaScript and XML development.

The powerful editor for JavaScript, XUL/XBL and Yahoo! Widget development. The JavaScript editor provides features like code completion, syntax highlighting and content outline that helps developers productively create efficient JavaScript code.

SpketIDE のプラグインを Eclipse にいれると Firefox Extention Project が追加されます。

pikonwp02

これでつくると以下のように .xpi 用のひな形をつくってくれます。

pikonwp03

このプロジェクトディレクトリのパスをポイントファイルに書き込んで、Firefox のエクステンションディレクトリにいれてあげると Firefox が認識してくれます。(Firefox 外のディレクトリにリンクする形で拡張がかける機能がある)

いくつかの Firefox 、about:config 設定を修正追加するとホットデプロイできるようになります。 ソース書き換え後、Firefox で CTRL + N するだけで読み直してくれるようです。

設定やこの他のつくりかたは、こちらが分かりやすかったです。

Firefox 3ではじめる拡張機能開発:第1回 最小構成でインストール|gihyo.jp … 技術評論社

先日とうとうFirefox 3がリリースされましたが, 皆さんはすでにインストールしましたでしょうか。本連載では,簡単な拡張機能を題材としてFirefox 3で拡張機能を開発するための基本的な手順を解説します。

あとは、公式のドキュメントを。

メインページ – MDC

Firefox 3 がリリースされ、ダウンロード可能になりました。開発者向けの詳細情報は、開発者のための Firefox 3 を参照してください。

SpketIDE は、build.xml もつくってくれるので、run and debug が終わって配布形式の .xpi にしたいときは Eclipse から ant するだけで dist/ ディレクトの下に .xpi を生成してくれます。

一点注意するのが、chrome.manifest で開発中は

content   pikonwp    content/
locale    pikonwp    en-US    locale/en-US/

とふつうのパスにしておき、builde.xml 時は jar ファイルの中身を指定します。

content   pikonwp    jar:chrome/pikonwp.jar!/content/
locale    pikonwp    en-US jar:chrome/pikonwp.jar!/locale/en-US/

こういうふうに jar: つけるといいようです。

てなわけで、 参考になるかどうか分かりませんが、Pikon!WP のプロジェクトファイルごとおいてみます。

まぁ、使う人はいないとおもいますが dist の下の pikonwp.xpi を Firefox のアドイン画面にドロップすればインストールできます。 他のファイルは使うだけなら不要です。

pikonwp.tar.gz

他の CMS の判定とか、WP サイトみつけたら勝手にその URL 記録とかおもしろいなーとかも思いました。

もしかしたら、CMS 判定は既にあるかもですね。 ぼくの JavaScript 技術では無理なので、だれかお願いします(笑)