バックエンドを MySQL にしてみる(前編)

MySQL をバックエンドのデータベースとして使用するが翻訳されたようなので、このインストラクションにしたがって、MySQL を試してみた(が、まだちゃんと動いていないので、以下の情報を参考に試してみても動かないと思う……)。

  • MySQL のインストール

まず、 MySQL と DBD::MySQL をインストールする必要がある。MySQL は、MySQL4.0 Downloads からダウンロードできる。オフィシャルなインストーラが公開されているので、これを使うのが楽そうだ。ディスクイメージをマウントすると、2 つのパッケージがあらわれるが、「mysql-standard-4.0.21-apple-darwin7.5.0-powerpc.pkg」というのが本体のインストーラで、「MySQLStartupItem.pkg」が /Library/StartupItems に起動用のスクリプトをインストールして、起動時に自動的に動くようにするもののようだ。とりあえず両方をインストール。StartuiItems をインストールしたら、再起動してもよいのだけど、面倒なので

sudo /Library/StartupItems/MySQL/MySQL start

で動かしてみた。コンソールに「Starting MySQL database server」という表示があらわれ、無事起動したようだ。
また、/usr/local/mysql/bin にパスが通っていた方がなにかと便利なので、Marc Liyanage - Software - Mac OS X Packages - MySQL を参考に設定を行った。そういえば、ここの手順では、/usr/local/mysql/data の所有者を変更するという手順が入っているが、これが必要なのかどうかいまいちよくわかっていない。というか、最初ここを読みながら作業していたので、先に実行してしまっていて、不要だったのかどうかわからないということ。所有者を元に戻して動くかどうか試してみればいいのだけど、面倒なので今回のところはパス。

  • DBD::mysql のインストール

さて、次に、Perl から MySQL にアクセスするためのモジュール、DBD::mysql をインストールする。CPAN から入手する。これを書いている時点での最新バージョンは、2.9004 だ。
インストールはいつも通り……かと思ったら、make でエラーが出てしまって先へ進めない。Makefile の中を見てみてもなにが原因なのかさっぱりわからないので、検索してみると、How to Install DBD::mysql on Mac OS X 10.3 (Panther) というページを発見した。まさに詰まっていたところについて書かれている。ポイントは、Makefile ができたところで、

perl -pi -e's/MACOSX/env MACOSX/' Makefile

を実行して、Makefile 内の MACOSX と書かれている箇所を env MACOSX に置き換えているところ。これをするだけで、エラーがあっさり解消してしまった(make の途中でエラーが出て止まってしまった場合は、make clean をして最初からやり直した方がいい)。
と、ここで一点だけ注意。DBD::mysql をインストールするためには、先に DBI をインストールしておく必要がある。DBI を別にインストールしてあればいきなりインストールすることができるが、そうでないときは先にインストールする。私が作成した POPFile を使用している場合は、DBI もインストールされるが、通常 Perl のライブラリを置く場所とは別の場所(/Library/POPFile/lib)にインストールしているため、ふつうに perl Makefile.PL とすると DBI がないというエラーが発生してしまう。これを避けるためには、perl の -I オプションでライブラリの場所を追加指定すればよい。例えば、

perl -I/Library/POPFile/lib Makefile.PL

という具合だ。

DBD::mysql もインストールすることができたので、ようやく MySQLBackend の手順を実行することができる。作業に入る前に、POPFile を停止させて、既存の設定やデータベースをバックアップしておく。
MySQL (と DBD::mysql)のインストールはすんでいるので、「現在の POPFile ユーザーがバックエンドを MySQL に変更する」という部分から先を実行していく。

sudo mysql

で、MySQL のコンソールが表示されるので(パスが通っていればの話)、書かれているように命令を入力していくのだけど、手順 1 では以下のようにした方がよさそうだ。

create database popfile;
grant all on popfile.* to pfuser@localhost identified by 'pfpassword';
flush privileges;
quit

pfuser@localhost と明示することによって、ローカルからのログインのみを許可する(というか、ドキュメントの手順のようにすると、なぜか作成したユーザでログインできなかった)。残りの手順はほぼそのままだが、手順 5 で sqlite を使って popfile.db を開くところでは、

sqlite popfile.db

と、拡張子を指定する必要があった。また、手順 6 の「source dump.sql」はかなり時間がかかるので、しばらく待つ。時々「ERROR 1062: Duplicate entry '...' for key 2」というようなエラーが表示されるのが少し気になるが、これは大文字小文字の区別かなにかが関係しているのだろうか。とりあえずここも今回のところは保留。

これでようやく POPFile を動かすことができる……と思ったのだが、うちではそのままでは動かなかった。

DBD::mysql::db selectrow_array failed: No Database Selected at /Classifier/Bayes.pm line 680.
DBD::mysql::db tables failed: No Database Selected [err was 1046 now 1046]
No Database Selected at /Classifier/Bayes.pm line 683.

というようなエラーが大量に発生してまったく動かない。試行錯誤の結果、Classifier/Bayes.pm でデータベースに接続したあとに、

if ( $dbconnect =~ /mysql/ ) {
$self->{db__}->do('use popfile;');
}

でデータベースを選択するようにしてみるとエラーなく起動するようになってくれたが、メールをチェックすると同じようなエラーが大量発生。メール自体は一応受信できるものの UI にアクセスすると POPFile がエラーで終了してしまう。どこか設定でミスしているだけなような気もするので、またそうち試してみよう。

(注:ようやく動かすことができた。詳しくは、id:amatubu:20041123#p1)