まず、私は多くの提案された質問に目を通しましたが、適切な答えは見つからなかったことを述べておきます。私がやっていることは次のとおりです。
Amazon EC2 インスタンスに接続しています。次のコマンドで MySQL ルートでログインできます。
mysql -u root -p
次に、ホスト%で新しいユーザーbillを作成しました
CREATE USER 'bill'@'%' IDENTIFIED BY 'passpass';
ユーザー bill にすべての権限を付与しました:
grant all privileges on *.* to 'bill'@'%' with grant option;
次に、root ユーザーを終了し、bill でログインしてみます。
mysql -u bill -p
正しいパスワードを入力しましたが、次のエラーが発生しました:
エラー 1045 (28000): ユーザー 'bill'@'localhost' のアクセスが拒否されました (パスワード使用: YES)
ベストアンサー1
おそらく匿名ユーザー''@'localhost'
または がいます''@'127.0.0.1'
。
に従ってマニュアル:
複数の一致が考えられる場合、サーバーはどれを使用するかを決定する必要があります。この問題は次のように解決されます: (...)
- クライアントが接続を試みると、サーバーは[テーブル mysql.user] の行をソート順に検索します。
- サーバーは、クライアントのホスト名とユーザー名に一致する最初の行を使用します。
(...) サーバーは、最も具体的なホスト値を持つ行を最初に並べる並べ替えルールを使用します。リテラル ホスト名(「localhost」など)と IP アドレスが最も具体的です。
したがって、このような匿名ユーザーは、'[any_username]'@'%'
から接続する場合と同様に、他のユーザーを「マスク」しますlocalhost
。
'bill'@'localhost'
は一致します'bill'@'%'
が、(例) ''@'localhost'
priors とも一致します。
推奨される解決策は、この匿名ユーザーを削除することです (通常、これはいずれにしても良いことです)。
以下の編集は、主にメインの質問とは無関係です。これらは、このスレッド内の他のコメントで提起されたいくつかの質問に答えることのみを目的としています。
編集1
'bill'@'%'
ソケットを介して認証します。
ルート@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass --socket=/tmp/mysql-5.5.sock MySQL モニターへようこそ (...) mysql> mysql.user からユーザー、ホストを選択します。 +------+------------+ | ユーザー | ホスト | +------+------------+ | 請求書 | % | | ルート | 127.0.0.1 | | ルート | ::1 | | ルート | ローカルホスト | +------+------------+ セット内の 4 行 (0.00 秒) mysql> USER()、CURRENT_USER() を選択する。 +----------------+----------------+ | ユーザー() | CURRENT_USER() | +----------------+----------------+ | bill@localhost | bill@% | +----------------+----------------+ セット内の1行(0.02秒) mysql> 'skip_networking' のような変数を表示します。 +-----------------+-------+ | 変数名 | 値 | +-----------------+-------+ | ネットワークをスキップ | オン | +-----------------+-------+ セット内の 1 行 (0.00 秒)
編集2
まったく同じ設定ですが、ネットワークを再アクティブ化し、匿名ユーザーを作成しました''@'localhost'
。
ルート@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql MySQL モニターへようこそ (...) mysql> 'anotherpass' によって識別される ''@'localhost' ユーザーを作成します。 クエリは正常、影響を受けた行は 0 行 (0.00 秒) mysql> さようなら ルート@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \ --socket=/tmp/mysql-5.5.sock エラー 1045 (28000): ユーザー 'bill'@'localhost' のアクセスが拒否されました (パスワード使用: YES) ルート@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \ -h127.0.0.1 --プロトコル=TCP エラー 1045 (28000): ユーザー 'bill'@'localhost' のアクセスが拒否されました (パスワード使用: YES) ルート@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \ -hlocalhost --protocol=TCP エラー 1045 (28000): ユーザー 'bill'@'localhost' のアクセスが拒否されました (パスワード使用: YES)
編集3
編集 2 と同じ状況ですが、匿名ユーザーのパスワードが提供されます。
ルート@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -panotherpass -hlocalhost MySQL モニターへようこそ (...) mysql> USER()、CURRENT_USER() を選択する。 +----------------+----------------+ | ユーザー() | CURRENT_USER() | +----------------+----------------+ | ビル@localhost | @localhost | +----------------+----------------+ セット内の1行(0.01秒)
結論 1、編集 1 から:'bill'@'%'
ソケットを介して認証できます。
結論 2、編集 2 より: TCP 経由で接続するかソケット経由で接続するかは、認証プロセスに影響しません (ただし、'something'@'localhost'
明らかにソケット経由でなければ他のユーザーとして接続することはできません)。
結論3、編集3より: を指定しましたが-ubill
、匿名ユーザーとしてアクセスが許可されました。これは、上でアドバイスした「ソートルール」によるものです。ほとんどのデフォルトインストールでは、パスワードなしの匿名ユーザーが存在する(そして、保護/削除する必要があります)。