ローカルポートのmysqlに対してTCPで接続する

  • 17
    いいね
  • 2
    コメント
この記事は最終更新日から1年以上が経過しています。

mysqlにlocalhostで接続する場合、(おそらく)自動的にunix domain socket経由で接続しようとする。
dockerで起動した場合やローカルポートからproxyしてmysqlに接続しているような場合は、unix domain socketのファイルは存在しないため以下のようなエラーが発生してしまう。

$ mysql -h localhost --port 3306 -u root -ppass
Warning: Using a password on the command line interface can be insecure.
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

解決方法

接続するプロトコルを--protocolで指定できる。socketやtcpの他、pipeやmemoryなどがあるらしい。

$ mysql -h localhost --port 3306 --protocol tcp -u root -ppass

これでdockerを使って即座にDBを用意することができる。
publishするportを変えれば複数のportを使って複数のmysqlインスタンスも起動可能。

$ docker run -d -e MYSQL_ROOT_PASSWORD=pass -p 3306:3306 mysql:5.6
$ mysql -h localhost --port 3306 --protocol tcp -u root -ppass

別の方法

接続先がlocalhostでなければunix domain socket経由で接続しようとしないのでローカルマシンのIPを指定すればもちろん接続できる。
自分のIPアドレスを知るのは結構面倒なことが多いしそもそもpublicにしていないことが多いのでプロトコル指定した方が便利。

$ IPADDR=`ip -f inet -o addr show eth0 |cut -d\  -f 7 | cut -d/ -f 1`
$ mysql -h $IPADDR --port 3306 -u root -ppass