Cacti 0.8.7i でMySQLへ接続できない問題の解決

Cactiでローカルホスト上にあるMySQLサーバへ接続しようとしても接続できなくて困ったときの解決メモです。
基本的にこの問題は、Cactiだけでなくデータベースを使用する全てのスクリプトで起こる可能性がある問題ではないかと思います。

作成日:2012.02.18
更新日:2012.02.18

原因と解決策
まず、私が陥ったときの条件は

  ●同一サーバ上で利用することを前提にMySQL側でポートでの接続を禁止している。
   (「my.cnf」にskip-networkingオプションを付けている)
  ●ソケットファイルを保存場所をデフォルトの「/tmp/mysql.sock」とは別のとこに作成している。
  ●Cactiの「include/config.php」内で「$database_hostname = "localhost";」としている。

になります。

PHPではMySQLへの接続時に接続先のホストがlocalhostの場合、ソケットを利用して接続することが出来るのですが、Cactiではソケットに関する設定がありません。そのため、ソケットによる接続にはデフォルトのソケットファイルへのパスが指定されるわけですが、このファイルをデフォルトと違う場所に作成していた場合にファイルが見つからず結果的に接続エラーとなってしまいます。

なので、解決方法としては

  ●ソケットファイルの保存場所をデフォルトの「/tmp/mysql.sock」に戻す。
  ●ポートによる接続を行えるようにするのと、Cactiの「include/config.php」内で
   「$database_hostname = "127.0.0.1";」とする。

のいずれかになると思います。

それでもソケットによる接続で、尚且つファイルの場所をデフォルトと違う場所のままで接続したい場合はCactiの設定を以下のようにします。
"include/config.php"
(色分け:書換追記コメント)
25:/* make sure these values refect your actual database/host/user/password */
26:$database_type = "mysql";
27:$database_default = "cacti";
28:$database_hostname = ":/var/tmp/mysql/mysql.sock"; 
  ※ソケットファイルを「/var/tmp/mysql/mysql.sock」に作っている場合。
   ちなみに先頭のコロンは必須です。

29:$database_username = "cactiuser";
30:$database_password = "cactiuser";
31:$database_port = "3306";
32:$database_ssl = false;
ページのトップへ

補足&メモ
解決方法の2番目に記載している内容ですが、 127.0.0.1 は一般的には localhost と同じ意味になりますが、IPアドレスで指定しないと繋がりませんでした。
もしかしたらCactiがデータベースの接続に利用しているADOdbライブラリの仕様によるものかもしれません。
ページのトップへ

参考にしたサイト

ページのトップへ