ローカルの開発環境で動いているはずのMySQLにmysql
コマンドで接続しようとして、 Can't connect to local MySQL server through socket
と言われたとき。
$ mysql -u root -p -h localhost -P 13306 DBNAME
Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
MySQLが動いてなかったり、あるはずのソケットファイルがなんらかの理由で見つからない場合にこのエラーになります。
Dockerコンテナで動かしているMySQLにホスト側からmysql
コマンドで接続しようとしている場合にもこのエラーになることがあります。DockerでMySQLを動かすと、ソケットファイルはマウントしない限りホスト側から見えないためです。
そんなときは --protocol=tcp
を付ければ接続できます。
$ mysql -u root -p -h localhost -P 13306 --protocol=tcp DBNAME
mysql
コマンドはlocalhostの場合にソケットファイルで通信しようとすることがあるようです。-P
を付ければTCPで通信してくれそうなものをそれでもソケットファイルを探すケースがありました。DockerでMySQLを動かすときはソケットファイルをマウントしていなければTCPで通信する必要がありますので、--protocol=tcp
を明示的に指定します。
本題に関係ないけど補足説明
mysql
コマンドのオプション
-
-u
: MySQLユーザ名を指定 -
-p
: パスワードをプロンプトで入力することを指定 -
-h
: 接続先ホスト名 -
-P
: ポート番号を指定(デフォルトの3306から変えている場合に指定)