MySQL , DBD:mysql と PHP をバージョンアップ

とあるサーバーのMySQLのバージョンを確認したら、なんと驚きの MySQL 3.23.58。いくらなんでも古すぎるので、最新のMySQL5.0 をインストールしたら、連鎖的に DBD::mysql , PHP までバージョンアップすることになってしまったという作業ログ。

今回は、すでに MySQL 用のユーザーなどが存在しますが、クリーンインストールの場合は、mysql 用のユーザーを以下のサイトを参考に作成。

まずは、現在稼働している、MySQL 3.23.58 のプロセスを終了。

/etc/rc.d/init.d/mysqld stop

MySQL のソースをダンロード

MySQLAB :: MySQL 5.0 Downloads
# wget http://dev.mysql.com/get/Downloads/MySQL-5.0/mysql-5.0.45.tar.gz/from/http://ftp.iij.ad.jp/pub/db/mysql/
# tar zxvf mysql-5.0.45.tar.gz
# cd mysql-5.0.45
# ./configure --prefix=/usr/local/mysql --with-charset=utf8 --with-extra-charsets=all  --with-mysqld-user=mysql
# make
# make install

MySQLの設定ファイルをコピーして、文字コードの設定を追加。

#cp ./support-files/my-medium.cnf /etc/my.cnf
#vi /etc/my.cnf
以下の行を追加、修正
[mysqld]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqldump]
default-character-set=utf8

データベースの初期化をおこなうスクリプトを起動

./scripts/mysql_install_db --user=mysql

起動スクリプトをコピーしつつ、MySQLを起動。

# cp ./support-files/mysql.server /etc/rc.d/init.d/mysql
# chmod +x /etc/rc.d/init.d/mysql
# /etc/rc.d/init.d/mysql start

MySQL の root パスワードを設定する。

# /usr/local/mysql/bin/mysqladmin -u root password パスワード文字列
# /usr/local/mysql/bin/mysql -u root -p

テスト用のDBとユーザーを作ってみる

mysql > create database mytest;
mysql > grant ALL PRIVILEGES on mytest.* to 'testuser'@'localhost' identified by 'パスワード文字列';

次に、DBD::mysql もかなり古いバージョンが入っていたので、最新にアップデート。cpan からだとエラーが出まくって、うまくアップデートできなかったので、こちらもソースから。

Patrick Galbraith / DBD-mysql - search.cpan.org
# wget http://search.cpan.org/CPAN/authors/id/C/CA/CAPTTOFU/DBD-mysql-4.005.tar.gz
# tar xvfz DBD-mysql-4.005.tar.gz
# cd DBD-mysql-4.005

ここで普通にmake, make testを走らせたところ、山のようなエラーがでた。つまずいたところを見ると、こんな感じ。

t/00base.............install_driver(mysql) failed: Can't load '/usr/local/src/DBD-mysql-4.005/blib/arch/auto/DBD/mysql/mysql.so' for module DBD::mysql: libmysqlclient.so.15: cannot open shared object file: No such file or directory at /usr/lib/perl5/5.8.5/i386-linux-thread-multi/DynaLoader.pm line 230.

エラーメッセージのキーワーでググってみる。どうも、古いMySQL の共有ライブラリなどが /usr/lib/mysql/ などに残ってしまっていて、そちらを参照してエラーになっているよう。

MySQL AB :: MySQL 5.1 リファレンスマニュアル :: 2.15.3 Perl DBI/DBD インターフェースを使用した際の問題

なので、ld.so.conf を編集して、新しいパスを指定してあげる必要がある。

# vi /etc/ld.so.conf

 /usr/lib/mysql/
を削除して、以下を追加
/usr/local/mysql/lib/mysql    

保存をしたら、以下で設定を反映。

# /sbin/ldconfig

完了したら、DBD-mysql-4.005のディレクトリーに戻って、make を続ける。その他に、テストに必要な引数も追加。

# cd DBD-mysql-4.005

(実際には改行せずに引数を指定)
# perl Makefile.PL
  --cflags="-I/usr/local/mysql/include/mysql"
  --libs="-L/usr/local/mysql/lib/mysql -lmysqlclient -lz -lcrypt -lnsl -lm"
  --testhost="localhost"
  --testuser="testuser"
  --testpassword="パスワード文字列"

# make
# make test
エラー無しで通った!ので、
# make install

これで、めでたく DBD::mysql も最新の4.005 にアップグレードされました。 と思ったら、今度は Apache の php モジュールがうまく動かなくなった。多分、これも旧 MySQL 依存だと思われるので、PHPもこの際、最新版にしてしまう。

# wget http://jp.php.net/get/php-5.2.3.tar.gz/from/this/mirror
# tar xvfz php-5.2.3.tar.gz
# cd php-5.2.3

# ./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql=/usr/local/mysql
# make

とすると、こんなエラー

ext/mysql/.libs/php_mysql.o(.text+0x2219): In function `zif_mysql_create_db': /usr/local/src/php-5.2.3/ext/mysql/php_mysql.c:1198: undefined reference to `mysql_create_db' ext/mysql/.libs/php_mysql.o(.text+0x2434): In function `zif_mysql_drop_db': /usr/local/src/php-5.2.3/ext/mysql/php_mysql.c:1237: undefined reference to `mysql_drop_db' collect2: ld returned 1 exit status make: *** [sapi/cli/php] Error 1

これも、例によって、古いライブラリ依存だと思われるので,以下で新しいライブラリに置き換え。

# cd /usr/include/
# mv mysql/ mysql.backup
# ln -s /usr/local/mysql/include /usr/include/mysql

そして再び

# make clean
# ./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql=/usr/local/mysql
# make
# make test

でOKが出たので、Apacheを止めて、インストール

# apachectl stop
# make install

# apachectl configtest
Syntax OK
# apachectl start

ふーー。これで長いバージョンアップの道のりが終了した。