ローカルの開発環境で動いているはずの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から変えている場合に指定)