ホスティングサーバーで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
無事、データベースにアクセスできたならば、XoopsやNetCommonsが正常に動くかどうかを確かめてみる。データベースにアクセスできない場合は
今回はその他の要因だった。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」のエラーがでるケースではこういうのもあるとのこと。