MySQLがソケットエラーで起動しません。
Can't connect to local MySQL server through socket '/tmp/mysql.sock'
というエラーが出ています。
目次
Can't connect to local MySQL server through socket '/tmp/mysql.sock' とは
エラーメッセージの意味は次の通りです。
ソケット'/tmp/mysql.sock'を通じてローカルのMySQLサーバーに接続することが出来ません
ソケットとはプロセスやネットワーク間の通信機構のことで、MySQLではこのソケットを通じてサーバーとクライアントとが接続されます。
ソケットについてはポート番号を指定して利用する方法が普通ですが、ここでは/tmp/mysql.sockというファイルが出てきています。
これはUNIXドメインソケット(ファイルシステムソケット) という UNIX系OS特有のソケットで、ローカルシステム内での通信を行う場合に用いられます。
このソケットの実態はファイルでサーバー・クライアント間の通信は、このファイルの入出力を通じて行われます。
解決策、対処方法
このエラーが発生する原因には以下の3つです。
MySQLサーバーが起動していない
MySQLサーバーが生存していないとこのエラーが出ます。
以下のコマンドで確認して下さい。
1 |
$ ps ax | grep mysqld |
/tmp/mysql.sockが削除されている
ソケットファイル/tmp/mysql.sockが削除されている場合があります。
この場合、MySQLサーバーを一旦シャットダウンして再起動をかけるとソケットファイルが復元されます。
※ MySQL標準のクライアントプログラムはオプション--hostでIPアドレスを指定すると、非ソケットファイル経由での接続が行われます。
次のようなコマンドでMySQLサーバーをシャットダウンして下さい。
1 |
$ mysqladmin --host=192.168.10.100 shutdown |
もし、これでもソケットファイルが作成されない場合はソケットファイル格納ディレクトリのパーミションの問題が考えられます。
ソケットファイルを作ってみましょう。
1 |
$ sudo touch /tmp/mysql.sock |
MySQLサーバーで使っているソケットとクライアントで使っているソケットのパスが違う
サーバーとクライアントは同じソケットファイルを参照しなければなりません。
関連する各ソフトのインストール方法が異なる場合は、違うソケットが参照される場合があります。
(例えば、MySQLはソースからインストール、PHPはRPMでインストールというように)
この場合、MySQLサーバーは/tmp/mysql.sockを利用しているのにPHPでは/var/lib/mysql/mysql.sockに接続しに行こうとする、というような事態になり接続が成立しません。
解決方法としては、MySQLサーバーに合ったソフトをインストールするのが一番良いのですが、次のような方法も考えられます。
(1) MySQLサーバーで使うソケットをクライアントに合わせる
/etc/my.cnfの[mysqld]のsocket項目を編集して行います。
1 2 3 4 5 |
[mysqld] # socket=/var/lib/mysql/mysql.sock socket=/tmp/mysql.sock |
この場合、MySQL標準クライアントプログラムのソケットも変えておいた方が良いでしょう。
/etc/my.cnfの[client]のsocket 項目を編集します。
1 2 3 |
[client] socket=/tmp/mysql.sock |
(2) クライアント側で接続先のソケットを指定する
ポート番号を指定する個所でソケットファイルへのパスを指定することが出来ます。
PHPの場合、
1 2 3 |
if(!$con=mysql_connect("localhost","mysql","passwd")){ ↓ if(!$con=mysql_connect("localhost:/var/lib/mysql/mysql.sock","mysql","passwd")){ |
Perlの場合、
1 2 3 4 5 |
$dbh=DBI->connect("DBI:mysql:tsumiki:localhost","mysql","passwd", {RaiseError=>0,PrintError=>1,AutoCommit=>1}); ↓ $dbh=DBI->connect("DBI:mysql:tsumiki;host=localhost;port=/var/lib/mysql/mysql.sock", "mysql","passwd",{RaiseError=>0,PrintError=>1,AutoCommit=>1}); |
コメント