「Can't connect to local MySQL server through socket '/tmp/mysql.sock'」
MySQLのクライアントソフト(mysql,PHP,Perl等)からMySQLサーバに接続しようとすると、
「Can't connect to local MySQL server through socket」エラーについて
「Can't connect to local MySQL server through socket '/tmp/mysql.sock'」のようなエラーが出力されて接続に失敗することがある。
1.原因の分析
まずはじめに、エラーメッセージは次の意味を持ちます。
「Can't connect to local MySQL server through socket」エラーについて
「ソケット'/tmp/mysql.sock'を通じてローカルのMySQLサーバーに接続することが出来ません」。ソケットとはプロセスやネットワーク間の通信機構のことで、MySQLではこのソケットを通じてサーバとクライアントとが接続されます。ソケットというとポート番号を指定して利用する方法が思い浮かびますが、ここでは/tmp/mysql.sockというファイルが出てきています。これはUNIXドメインソケット(ファイルシステムソケット)と言って、UNIX系OS特有のソケットで、ローカルシステム内での通信を行なう場合に用いられます。このソケットの実体はファイルでサーバ・クライアント間の通信は、実際は、このファイルの入出力を通じて行なわれます。
2.原因1:MySQLサーバが起動していない
MySQLサーバが生存していないとこのエラーがでます。「ps ax | grep mysqld」などのなどのコマンドでプロセスの確認を行なう。
3.原因2:MySQLサーバとクライアントで、使用しているUNIXソケットパスが異なる
サーバとクライアントは同じソケットファイルを参照しなければならないのですが、関連する各ソフトのインストール方法が異なる場合は、違うソケットが参照される可能性があります。(例えば、MySQLはソースからインストール、PHPはRPMからインストールというように)。この場合、MySQLサーバは/tmp/mysql.sockを利用しているのにPHPでは/var/lib/myswl/mysql.sockに接続しに行こうとする、というような事態になり接続が成立しません。解決方法としては、MySQLサーバに合ったソフトをインストールするのが一番良いのですが、次のような方法も考えられます。
(1)MySQLサーバで使うソケット(/etc/my.conf)をクライアントに合わせる
[mysqld]
# socket=/var/lib/mysql/mysql.sock
socket=/tmp/mysql.sock
[client]
socket=/tmp/mysql.sock
(2)クライアント側で接続先のソケットを指定する(例はPHPの場合)
if(!$con=mysql_connect("localhost","mysql","passwd")){
↓
if(!$con=mysql_connect("localhost:/var/lib/mysql/mysql.sock","mysql","passwd")){
4.原因3:なんらかの理由でソケットファイルに異常がある
最後にソケットファイルが削除されている場合があります。この場合、MySQLサーバを一旦シャットダウンして再起動をかけるとソケットファイルが復元されます。また、これでソケットファイルが作成されない場合はソケットファイル格納ディレクトリのパーミッションの問題が考えられます。ソケットを作成できない場合はMySQLのエラーログが出力されるのでそれを参考にできます。僕の場合は、パーミッションの問題でソケットファイルを読み込めずにエラーが出力されていました。
| 固定リンク
「プログラミング」カテゴリの記事
- 2つのファイルから一致する行を抜き出す(Perl)(2007.11.12)
- rubyのLOAD_PATH($:)(2012.03.27)
- Rubyでは++演算子によるインクリメントができない(2012.03.06)
- 日付の整形(Perl)(2007.08.17)
- eqと==の違い(Perl)(2007.08.24)

コメント