MySQL: 2010年4月アーカイブ

Perl で、DBD::mysql モジュールを使って MySQL のデータベースに接続しているのだが、

Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) at hogehoge.pl line 97

というエラーになって接続出来ず。
この間書いたエントリー「MTOS で MySQL の Socket が見つからない時」と同じパターンじゃね。

これは、DB に接続する時に、

$dbname = 'hogehoge';
$user = 'hogeuser';
$passwd = 'hogepass';
$host = 'localhost';
$port = '3306';
$option = 'mysql_socket=/tmp/mysql.sock';

$dbh = DBI->connect("dbi:mysql:$dbname:$host:$port;$option", "$user", "$passwd");

と、オプションでソケットの位置を明示的に指定してやればOK。

しかし、何で my.cnf の socket 指定は読んでくれんのかね?
/etc/my.cnf には、

socket  = /tmp/mysql.sock

と書いているのだが。この値を使ってくれないの?

/etc/my.cnf に、

mysql_socket  = /tmp/mysql.sock

なんて書くと

[ERROR] /usr/local/mysql/libexec/mysqld: unknown variable 'mysql_socket=/tmp/mysql.sock'

って怒られるしね。

まあ、取りあえず動いているので良いが、釈然としないな。誰かエロい、いや、エラい人、MySQL のこと教えて!

一応、(本気でハックしたことは無いが)MovableType も 3 の頃からの付き合いなので、先日 MTOS5 をインストールした時もついつい今までの習慣で mt-config.cgi を自分で編集して put したが、MT5 からは Web 画面の「環境設定ウィザード」で自動生成するのが推奨されているようである。

つーことで、先日入れた MTOS5 を一旦全部消して入れ直してみた。

なるほど。
全ファイルをサーバ上に put して、cgi に実行権与えて(必要であれば、httpd の実行ユーザで更新が行われるディレクトリやファイルの権限を修正して)、mt.cgi とかにアクセスすれば、セットアップが済んでいないので

http://www.exsample.jp/mt/mt-wizard.cgi

に強制的にリダイレクトされて、環境設定ウィザードの開始である。

なるほど、簡単だな。(もちろん、まったく知識の無い人間では厳しいが(^^;)


20100409_db_test.jpg

この間「MTOS で MySQL の Socket が見つからない時」で書いた MySQL の Socket ファイルのパスも(「高度な設定」リンクをクリックしなければいけないが)、画面に「データベースソケット」という項目があるのでここで入力すれば良い。
Socket のパスが /var/lib/mysql/mysql.sock ではない人は必ず設定しようね!

まあ、ただ、こういう具合に「一見簡単」なインタフェースを用意されると、かえってうちらのような業者は面倒くさいことになるんだよな。

「中途半端に知識があるお客さんのチャレンジ」が始まるからだ。(^^;

絶対、こういうインタフェースがあると「自分でやる」と言い出すお客さんが出てくるのだ。それはかまわない。俺らも、やってない作業に金をくれ」とは言わないので。是非自分で頑張ってコスト削減に励んでほしい。
・・・でも、「質問はタダ」とは思わないでほしい。(^^;

絶対、これ、「DB の接続テストが OK にならんのじゃけど、なんで?」と聞いてくるお客さん、いるよなあ。(^^;
そこから原因調べて「こうすればいいですよ」とアドバイスするところ、そこが正に俺らの仕事なわけで「タダではない」んですよ!俺らに相談したところで「既に自分の力だけでやっているのではない」んですよ!

・・・ってことを、ちゃんと認識してほしいな。社会人として。:-)

と、そんなことを思っているうちに作業は終了した。楽になったものだ。

MovableType をベースにする案件があるので、自社サーバに MTOS5 をセットアップしていたのだが、対話式インストールウィザードの実行で

Connection error: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'

というエラーが出てしまう。

まあ、読んで字の如く「Socket が見つからないので MySQL デーモンと Socket 通信が出来ませんぜ」ということだろう。

そりゃそうだ。
Socket の位置は /var/lib/mysql/mysql.sock ではないもの。

現在テスト機で動かしている MySQL は、

socket = /tmp/mysql.sock

という設定で実行している。
ちなみに、同じサーバで某地域 SNS(OpenPNE ベース)を動かしていて、PHP から MySQL の利用は問題なく行われているし、拡張機能のいくつかを Perl で組んで実装しているので Perl からの接続も問題無い。

ということで、これは MovableType 側の問題だ。

で、ざっと grep かけて Socket のパスをどこで指定しているか探してみたが分からなかったので、何か情報は無いかと思ってググってみたら・・・とんでもねえ。
この件に関して記事を書いてるブログはけっこうあるのだが、ほとんどが、

/etc/my.cnf の socket の値を /var/lib/mysql/mysql.sock に変更して MySQL を再起動しましょう

と説明しているのだ。(驚)

ええ???アプリケーション側の事情にデーモン側が設定変更して合わせるの?(^^;
とんでもねえ!そんな対応、下の下の対応だ。
どこぞの素人が書いた記事が、これまた素人によってどんどん拡散していってるんじゃないのか?こえ~(笑)

正解は、mt-config.cgi に

DBSocket /tmp/mysql.sock

という記述を追加する・・・だ。

このアーカイブについて

このページには、2010年4月以降に書かれたブログ記事のうちMySQLカテゴリに属しているものが含まれています。

前のアーカイブはMySQL: 2010年1月です。

次のアーカイブはMySQL: 2010年5月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。


月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら