mysqlの認証はいつからlocalhostと127.0.0.1を同じ扱いにしたのか?
動機
shimizukawa.iconはmysqlの以前の挙動として、 -h 127.0.0.1 を指定するとmysql内のユーザー認証が root@localhost から root@127.0.0.1 に変わり、そのようなユーザーを登録していないために認証エラーになる、と思っていましたが、認識を改める必要がありそう
予想
調査
2014年、MySQL-5.6.19 時点では別だったようだ?
2018年。MySQL-5.6。
mysqlでは、「user名@ホスト名」を1つの単位として権限やパスワードを設定します。
また、localhostと127.0.0.1は、mysqlでは別扱いで、挙動も厳密には異なります。
(localhostの場合はソケット通信になる)
つまり
root@localhostのみにパスワードや権限が設定がされていた場合、
root@127.0.0.1は定義されていない状態になります。
2018年の記事だが、mysqlバージョンが書かれていないので参考にならない
5.7で127.0.0.1を指定してもlocalhostになる挙動の質問
The server performs host name resolution using the gethostbyaddr() and gethostbyname() system calls.
5.6でも同じ記述がある..
さらに調べたけど、やっぱり分からない
とっかかりを見つけたかも。
ホスト 127.0.0.1 への接続を試みると、通常 localhost アカウントに解決します。ただし、サーバーが --skip-name-resolve オプションを使用して稼働されている場合は、これは失敗します。そのため、その場合には 127.0.0.1 アカウントが便利です
skip-name-resolveでMySQLサーバー内の名前解決をスキップして接続の高速化が出来る、と言う話。
なるほど、サーバー設定で変えられるのか。Linuxディストリビューションとかでデフォルトが違うというのはありそう。
mysql 5.1.46 かららしい
--skip-name-resolve サーバオプションの値から設定される skip_name_resolve という新しいシステム変数が存在する。これにより、サーバでクライアント接続の名前解決を使用するかどうかを実行時に決定する方法が提供される( Bug#37168 )。
MySQL 5.1.46 (2010-04-06) .
2008-06-03発行のチケットには、/etc/my.cnf の skip_name_resolve がシステム変数として見えるようにしたい、という話がある。
MySQL 5.0 以前の情報はあまりネットに残ってないのか、追いづらくなってきた。
2008年頃にはskip_name_resolve相当の機能がもうあって、「user@localhost と user@127.0.0.1 は別ユーザー」という話は当時からこのオプションに依存してた、ってことなのかなぁ..