UbuntuでのMySQLのWARNING

UbuntuRailsログを見ていたら、ここ(→http://d.hatena.ne.jp/satake7/edit?date=20080509)にあったのと同じWARNINGを発見。Windows環境だけじゃなかったんだということで、Ubuntuでも対処することに。WARNING内容はこちら(↓)

WARNING: You're using the Ruby-based MySQL library that ships with Rails. 
This library is not suited for production. 
Please install the C-based MySQL library instead (gem install mysql).

「あなたがいま使っているMySQLライブラリはRubyベースのもので、production環境じゃマズイですよ。Cベースのライブラリに入替えてください」というやつ。

インストール

上のメッセージにあるように gem install mysql すればいいじゃんと思って気軽にやったら結構はまった。結論から先に書いておくと、正しい手順はこちら(↓)

$ s aptitude install mysql-server mysql-client libmysqlclient15-dev libmysql-ruby1.8 -y
$ gem install mysql

Ubuntu serverの最初のインストールでは、MySQLサーバは入るんだけど MySQLクライアントのライブラリは入らないみたい。ま、サーバだから当然だよね。途中でなんかおかしいと思ったんだよね。
ちなみにこの手順はその他いろいろとやった上で「たぶんこれだけでいいんじゃね?」ということで書いてありますので、これだけだとうまくいかない場合は、ここ(→Ubuntuの環境整備 - satake7’s memo)の手順を片っ端からやってみてください。

これに気づくまでの経過

エラーメッセージでググってくるひとの参考になれば、ということで試行錯誤の過程を収録。
まずは gem install mysql をやってみる。(結果は途中省略)

$ s gem install mysql
Select which gem to install for your platform (i486-linux)
 1. mysql 2.7.3 (mswin32)
 2. mysql 2.7.1 (mswin32)
 3. mysql 2.7 (ruby)
 4. mysql 2.6 (ruby)
 5. Skip this gem
 6. Cancel installation
 > 3
ERROR:  While executing gem ... (Gem::Installer::ExtensionBuildError)
    ERROR: Failed to build gem native extension.
ruby extconf.rb update mysql
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lm... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lz... yes
 *** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.
Provided configuration options:
        --with-mysql-config
        --with-mysql-dir
        --with-mysql-include
        --with-mysql-lib
Gem files will remain installed in /var/lib/gems/1.8/gems/mysql-2.7 for inspection.
Results logged to /var/lib/gems/1.8/gems/mysql-2.7/gem_make.out

/var/lib/gems/1.8/gems/mysql-2.7/mkmf.log のなかを見てみたけど、ここで出てる mysql_query() というやつがないのがエラーの原因のようだ。
ググると gem install mysql にオプションを付けたらうまくいったという記述がいくつか見つかるので片っ端からやってみるがすべてNG。

$ s gem install mysql -- --with-mysql-config
$ s gem install mysql -- --with-mysql-lib=/usr/lib
$ s gem install mysql -- --with-mysql-lib=/usr/share/mysql
$ s gem install mysql -- --with-mysql-lib=/usr/lib/mysql
$ s gem install mysql -- --with-mysql-dir=/usr/lib/mysql

だいたい、MySQLのライブラリがどこを探しても見当たらない。この辺りでなんかおかしいなぁとは気づいていたんだけど、まだなにか魔法のキーワードがあるんじゃないかとググるググる
もしかすると、もうちゃんと入ってて、やらなくてもいいことを延々とやってんじゃないの、と楽観的になってリストを見てみたりしたけど、やっぱり入ってない。この時点での gem のリストはこちら(↓)

$ s gem list --local
 *** LOCAL GEMS ***
actionmailer (2.0.2)
actionpack (2.0.2)
activerecord (2.0.2)
activeresource (2.0.2)
activesupport (2.0.2)
columnize (0.1)
fastthread (1.0.1)
hpricot (0.6)
linecache (0.42)
passenger (1.0.5)
rails (2.0.2)
rake (0.8.1)
ruby-debug (0.10.1)
ruby-debug-base (0.10.1)
sources (0.0.1)
sqlite3-ruby (1.2.2)

さすがにこの辺りで「Railsアプリ だって passenger でちゃんと動いてるんだから、いまのままでいいんじゃね?」という声とともに、あきらめの境地に入ってきてるんだけど、もう少しだけがんばる。

$ s find / -name mysql*.lib
$ s find / -name mysql*.so
/usr/lib/perl5/auto/DBD/mysql/mysql.so
/usr/lib/php5/20060613+lfs/mysql.so
/usr/lib/php5/20060613+lfs/mysqli.so
$ s apt-get update
$ s gem update
$ s gem install mysql

変わらず。やっぱりダメだ。で、ここで犬の散歩へ行く。道すがら考えてみるがやっぱりどう考えても gem で install しようとしている mysql の対象(MySQLクライアント)がないんじゃないか。散歩から帰ってきて、いま入っているパッケージリストを見てみることに。

$ s dpkg -l | grep mysql
ii  libdbd-mysql-perl     4.004-2               A Perl5 database interface to the MySQL database
ii  libmysqlclient15off   5.0.45-1ubuntu3.3     MySQL database client library
ii  mysql-client-5.0      5.0.45-1ubuntu3.3     MySQL database client binaries
ii  mysql-common          5.0.45-1ubuntu3.3     MySQL database common files
ii  mysql-server          5.0.45-1ubuntu3.3     MySQL database server (meta package depending on the lates
ii  mysql-server-5.0      5.0.45-1ubuntu3.3     MySQL database server binaries
ii  php5-mysql            5.2.3-1ubuntu6.3      MySQL module for php5

ググるとどうやら「libmysqlclient15-dev」とか「libmysql-ruby1.8」が必要みたいだ。ということで、MySQLのクライアント関係を入れなおすことに方針決定。最初に戻る。

参考

  1. apt-cache や dpkg の使い方などはこちら(→[Think IT] 第3回:Ubuntu Serverの特徴と管理方法 (1/3))を参照。
  2. MySQLインストールのヒントはこちら(→http://karetta.jp/article/blog/karetta-dev/010989)でいただきました。(直接の記事じゃないですけど)