Edited at

MySQLでlocalhostと127.0.0.1の違い

More than 3 years have passed since last update.


全然違います

windows環境でCygWin入れてると怒られますよね?

※ Linuxでもとても難解な問題が出てくるので環境依存関係無いです(バグです)

mysql -uroot -p して怒られます。

ekaneko@hoge ~

$ mysql -uroot -p
Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysql.sock' (2)

こんな感じで怒られます。

省略した場合は localhost が暗黙で使用されるためです。

※ MySQL5.6.19 ソースより

127.0.0.1でやってみます。


ekaneko@hoge ~
$ mysql -h 127.0.0.1 -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 22
Server version: 5.6.19-log MySQL Community Server (GPL)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| ************ |
| ************ |
| mysql |
| mytest |
| performance_schema |
| ************ |
| test |
| world |
| ************ |
| ************ |
+--------------------+
11 rows in set (0.00 sec)

mysql>

問題なくOKです。


違いは接続方法

ホスト名が localhost だった場合、パフォーマンスのためなのかソケットが暗黙で使用されます。

ですが。Windowsにはそんなの用意されてません。

その場合 127.0.0.1 を使うとTCP/IP接続が同PCであっても使用され問題なくTCP経由で接続できます。


覚える意味があるのか?

MySQLデーモンを二重化してポートをそれぞれに割り振った場合、面倒な事になります。

localhostを接続先ホストに指定すると、ポート指定のオプションを無視しsocket経由で接続しようとします。

Windowsの場合はつながらないだけですが、Linuxの場合はデフォルトソケット(ini記載かも?)に繋がってしまい、訳わからない状況になります。

mysql -h localhost -uroot -p --port=3307 こうやった場合でもポート指定が無視されちゃいます。

mysql -h 127.0.0.1 -uroot -p --port=3307 この場合はすんなり接続されるはずです(もう忘れました)

ソケット接続する場合は、事前にソケットを作成して、

それぞれのデーモンにソケットをそれぞれ割り当てちゃんと指定すれば動きます。たぶん。

mysql -uroot -p --socket=/var/run/mysql01.sock

mysql -uroot -p --socket=/var/run/mysql02.sock


あとがき

ソースを読めるって大切だよなぁって思います。

読みたくて読んでるわけじゃないけど、食べたくないけど食べないと体調悪くなるって感じと似てるよね。

だってそんなことしてるって思わないじゃない。

以上、メモでした