Xoops や NetCommonsで「databasefactory.php line 34」と言うエラーがでたら

ホスティングサーバーでNetCommonsを使っていたところ、ホスティングサーバー側の設定がかわり突然

Error [Xoops]: Unable to connect to database in file class/database/databasefactory.php line 34

というエラーメッセージがでた。以下、その時の備忘録。

構成

NetCommonsを動かしているサーバーとMySQLを動かしているサーバーが違うので問題の切り分けにてこずった。

ホスティングサーバー(NetCommonsを動かすサーバー)<------>  MySQLサーバー 

問題切り分け

もっとも可能性が高いのがホスティングサーバーのIPアドレスが変わったため、MySQLサーバー側のアクセス制限で弾かれているということだったので、まずはホスティングサーバーからMySQLにアクセスできるかどうかをチェックすることにした。

ホスティングサーバーにログインをしてホスト名とIPアドレスを調べる。

% hostname
% nslookup hogehoge.jp

現在、MySQLサーバー側ではtcp_wrapperとMySQLのGRANT機能でアクセス制限をかけている。まずは、tcp_wrapperの制限を緩める。

% sudo vi /etc/hosts.allow

上記を「mysqld: ALL」と一時的にしておく。

次にMySQLのGRANT機能の制限を変更する。仮にホスティングサーバーのホスト名をhogehoge.jp、ホスティングサーバーからアクセスしてくるユーザー名をhogeとすると以下のように変更する。

% mysql -u root -p
> use mysql
> SELECT User,Host FROM user;
> UPDATE user SET Host = 'hogehoge.jp' where User = 'hoge';
> quite

その上で、ホスティングサーバー側からmysqlにアクセスをしてみる。

% mysql -u hoge -h mysql.server.jp DATABASENAME -p

無事、データベースにアクセスできたならば、XoopsNetCommonsが正常に動くかどうかを確かめてみる。データベースにアクセスできない場合は

  1. そもそも ping がとおるかを試す
  2. MySQLサーバーのホスト名をIPアドレスで指定してみる
  3. それでもだめなら、管理者へ相談する

今回はその他の要因だった。XOOPSのサーバアクセス設定についてで紹介されていたPHPからのデータベースアクセスをチェックする。db.phpというファイルを作成し、中身を以下のようにする。

<?php
$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password')
or die('Could not connect: ' . mysql_error());
echo 'Connected successfully';
mysql_select_db('my_database') or die('Could not select database');
?>

私の場合は、MySQLのコマンドなら接続できるのに、PHP経由だと接続できなかった。エラーメッセージで「hogehoge.jpというホストはありません」とエラーが表示されたので、ホスト名をIPアドレスにしたところ無事接続できた。

MySQLサーバー側のhosts.allowを設定しなおして、今回のトラブルシューティングは終了。

一時的に「databasefactory.php line 34」のエラーがでるケースではこういうのもあるとのこと。