web-dev-qa-db-ja.com

localhostからではなく127.0.0.1からmysqlに接続する

here と同様の問題があります。問題はそこに提案された解決策が私にとってうまくいかないことです:

今のところ私はユーザーを持っています:

+----------+------------------------------------+
| user     | Host                               |
+----------+------------------------------------+
| root     | 127.0.0.1                          |
| root     | localhost                          |

両方ともパスワードなし(今のところ、私はそれが悪いことを知っています!).

次のコマンドを使用してmysqlに接続しています。

mysql -u root -h 127.0.0.1 --protocol=tcp

ログインすると、次のようになります。

mysql -u root -h 127.0.0.1 --protocol=tcp
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.1.61-log Source distribution

Copyright (c) 2000, 2011, 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> \s
--------------
mysql  Ver 14.14 Distrib 5.1.61, for redhat-linux-gnu (x86_64) using readline 5.1

Connection id:      5
Current database:   
Current user:       root@localhost
SSL:            Not in use
Current pager:      stdout
Using outfile:      ''
Using delimiter:    ;
Server version:     5.1.61-log Source distribution
Protocol version:   10
Connection:     127.0.0.1 via TCP/IP
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    latin1
Conn.  characterset:    latin1
TCP port:       3306
Uptime:         2 days 9 hours 2 min 13 sec

Threads: 1  Questions: 102  Slow queries: 0  Opens: 19  Flush tables: 1  Open tables: 12  Queries per second avg: 0.0
--------------

mysql> SELECT USER(),CURRENT_USER();
+----------------+----------------+
| USER()         | CURRENT_USER() |
+----------------+----------------+
| root@localhost | root@localhost |
+----------------+----------------+
1 row in set (0.00 sec)

mysql> 

質問:

「root」@127.0.0.1としてログインする方法

6
misiek

こんばんは @ RolandoMySQLDBA です (あなたが言った投稿 )の作者です。

最後の3行を見てください

_Server version:     5.1.61-log Source distribution
Protocol version:   10
Connection:     127.0.0.1 via TCP/IP
_

最後の行は_127.0.0.1 via TCP/IP_であるため、TCP/IPプロトコルを100%使用しています。

SELECT USER(),CURRENT_USER();を実行しましたか?

もしそうなら、それは言うべきです

_[email protected] | [email protected]
_

出力が奇妙に見える

_[email protected] | root@localhost
_

次の点に注意してください。両方のrootユーザーが同じ許可と同じパスワード(この場合はなし)を持っているため、mysqldは_root@localhost_を選択することにしました。 「なぜmysqldはそのような選択をするのでしょうか?」

DBA StackExchangeには、この2年前の投稿があります( MySQLエラー:ユーザー 'a' @ 'localhost'のアクセスが拒否されました(パスワードを使用:YES) )。その過去では、mysqldがユーザー認証を実行する方法を正確に説明しました。 MySQL 5.0 Certification Study Guide の486,487ページの段落に注意してください

クライアントアクセス制御には2つの段階があります。

最初の段階では、クライアントが接続を試み、サーバーが接続を受け入れるか拒否します。成功するには、ユーザーテーブルの一部のエントリが、クライアントが接続するホスト、ユーザー名、およびパスワードと一致する必要があります。

2番目の段階(クライアントが既に正常に接続している場合にのみ発生します)では、サーバーはクライアントから受信したすべてのクエリをチェックして、クライアントにそれを実行するための十分な特権があるかどうかを確認します。

サーバーは、クライアントの接続元のホストとクライアントが提供するユーザーに基づいて、クライアントを許可テーブルのエントリと照合します。ただし、複数のレコードが一致する可能性があります。

認定書で述べたように、_it's possible for more than one record to match_。したがって、mysqldが選択しました。

_root@localhost_から_mysql.user_を削除する場合、これはSELECT USER(),CURRENT_USER();を一致させる1つの方法です。別の方法は、_[email protected]_にパスワードを与えることです。

概要

ユーザー認証に使用される同じ方法で2人のrootユーザーがいることが、_[email protected]_が表示されない理由の根本的な原因です。それにもかかわらず、あなたは_TCP/IP_を使用しています。

サイドノート

OSで_127.0.0.1_が定義されていることを確認してください。これを実行してください:

_cat /etc/hosts | grep -c "127\.0\.0\.1"
_

_0_を取得した場合、OSはそれを認識していません。 _127.0.0.1_を_/etc/hosts_に追加し、ネットワークを再起動してからmysqlを再起動する必要があります。

更新2014-04-26 20:00 EDT

私がこれから言うことはばかげて聞こえるかもしれませんが、ドキュメントではtcpの代わりにTCPを使用しています

Unixでは、MySQLプログラムはホスト名localhostを特別に扱います。これは、他のネットワークベースのプログラムと比較して、予想とは異なる可能性があります。 localhostへの接続の場合、MySQLプログラムはUnixソケットファイルを使用してローカルサーバーへの接続を試みます。これは、ポート番号を指定するために--portまたは-Pオプションが指定されている場合でも発生します。クライアントが確実にローカルサーバーにTCP/IP接続するようにするには、-Hostまたは-hを使用して、ホスト名の値に127.0.0.1を指定するか、ローカルサーバーのIPアドレスまたは名前を指定します。 --protocol = TCPオプションを使用して、localhostの場合でも、接続プロトコルを明示的に指定することもできます。例えば:

_Shell> mysql --Host=127.0.0.1
Shell> mysql --protocol=TCP
_

--protocolオプションを使用すると、他のオプションが通常は他のプロトコルにデフォルト設定される場合でも、特定のタイプの接続を確立できます。

このように protocol = TCP を使用してみてください

_mysql -u root -h 127.0.0.1 --protocol=TCP -ANe"SELECT USER(),CURRENT_USER()"
mysql -u root -h localhost --protocol=TCP -ANe"SELECT USER(),CURRENT_USER()"
_

それが違いを生むかどうかを確認します。

アップデート2014-05-09 16:19

_/etc/hosts_を注意深く確認する必要があります

これが_/etc/hosts_にある場合

_127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
_

次に、_[email protected]_としてログインすると、正しく機能するはずです。

これを_/etc/hosts_に表示する場合

_127.0.0.1       localhost
_

次に_[email protected]_は動作する可能性がありません

2
RolandoMySQLDBA