これは非常に簡単なことのはずなのですが、どうしてもうまくいきません。
私はMySQLサーバーにリモートで接続しようとしているだけです。
として接続
mysql -u root -h localhost -p
は正常に動作しますが
mysql -u root -h 'any ip address here' -p
はエラーで失敗します。
ERROR 1130 (00000): Host ''xxx.xx.xxx.xxx'' is not allowed to connect to this MySQL server
mysql.user`テーブルに、ホストが 'localhost'のユーザ 'root'と、ホストが '%'のユーザ 'root'がまったく同じエントリを持っています。
どうしたらいいのか、途方に暮れています。 何かアイデアがあれば教えてください。
セキュリティ上の注意かもしれません。新しい管理者アカウントを追加してみてはいかがでしょうか。
mysql> CREATE USER 'monty'@'localhost' IDENTIFIED BY 'some_pass';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost'
-> WITH GRANT OPTION;
mysql> CREATE USER 'monty'@'%' IDENTIFIED BY 'some_pass';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%'
-> WITH GRANT OPTION;
しかし、Pascalや他の人が指摘しているように、この種のアクセス権を持つユーザーを任意のIPにオープンにするのは良いアイデアではありません。管理者ユーザーが必要な場合は、root を使用し、localhost に置いてください。それ以外の場合は、必要な権限を正確に指定し、Pascalが以下に提案しているように、ユーザーのアクセス性を制限してください。
Edit:
MySQL FAQより。
アクセスが拒否された原因がわからない場合は アクセスが拒否された場合、ユーザ テーブルから削除してください。 ワイルドカードを含む値を持つすべてのエントリ( '%'を含むエントリ に '%'や ''の文字が含まれているエントリ)を削除してください。)A 非常によくあるエラーは、Host=〜のエントリを新規に挿入することです。 ホスト='%'とユーザー=''のエントリを挿入してしまうことです。 User='some_user'としたエントリーを挿入してしまうことです。 これにより、同じマシンからの接続にlocalhostを指定して 同一マシンからの接続を可能にします。これでは これがうまくいかない理由は デフォルトの権限には Host='localhost'の>エントリと User=''というエントリがあります。そのエントリには、Host 値 'localhost'は 'よりも具体的なものであるため よりも具体的なHost > 値 '%'を持っているため、そのエントリは 新しいエントリよりも優先的に使用されます。 ローカルホストからの接続時に正しい 正しい手順は、2つ目のエントリを挿入することです。 ホスト='localhost'と User='some_user'とした2つ目のエントリを挿入するか、Host='localhost'としたエントリを削除してください。 Host='localhost' and > User='some_user' のエントリを削除します。 User=''としたエントリーを削除します。エントリを削除した後 FLUSH PRIVILEGES ステートメントを発行してグラントテーブルを再読み込みしてください。 セクション5.4.4「アクセス」も参照してください。 コントロール、ステージ1:接続 検証」を参照してください。
メッセージ *Host ''xxx.xx.xxx.xxx'' is not allowed to connect to this MySQL server
は、MySQL サーバから MySQL クライアントへの返信です。ホスト名ではなく、IP アドレスを返していることに注目してください。
もし、mysql -h<hostname> -u<someone> -p
で接続しようとして、IPアドレスでこのメッセージが返された場合、MySQLサーバはクライアントの逆引きができていないことになります。これは、MySQL クライアントをグラントにマッピングする方法であるため、非常に重要です。
MySQL サーバから nslookup <mysqlclient>
を実行できることを確認してください。それができない場合は、DNSサーバにエントリがありません。または、MySQLサーバのHOSTSファイル(<ipaddress> <fullyqualifiedhostname> <hostname>
<-ここの順番が重要かもしれません)にエントリを入れてください。
サーバのHOSTSファイルにMySQLクライアントの逆引きを可能にするエントリを設けることで、この問題を解決しました。
グラントテーブルを手動で変更した場合(INSERT、UPDATEなどを使用)は、FLUSH PRIVILEGES
文を実行して
FLUSH PRIVILEGES` ステートメントを実行して、サーバーにグラントテーブルの再読み込みを指示する必要があります。
追記: 任意のホストに任意のユーザの接続を許可することはお勧めしません(特に root
の使用は不可)。クライアント/サーバアプリケーションでmysqlを使用している場合は、サブネットアドレスを使用してください。Web サーバやアプリケーションサーバで mysql を使用している場合は、特定の IP を使用します。