何ヶ月もの間、ローカルテストサーバーで実行されているMySQLインスタンスにSSHトンネル経由で問題なく接続してきました。しかし、突然、何も変わらないと思いますが、サーバーがSequel Proからのログイン試行を次のエラーで拒否し始めました。
アクセスが拒否されたため、ホスト127.0.0.1に接続できません。
ユーザー名とパスワードを再確認し、現在地からのアクセスが許可されていることを確認してください。
MySQLによると、ユーザー 'root' @ 'localhost'のアクセスは拒否されました(パスワードを使用:YES)
SSHトンネル経由ではなく、SSH経由でサーバーに直接接続すると、ターミナルからログインできます。この問題はSequel Proや特定の個人に固有のものではありません。MySQLWorkbenchを介して接続するときに、オフィスの他のユーザーと同じエラーが発生します。私は正気のためにmysqladmin
でパスワードをリセットしましたが、それは間違いなく問題ではありません。
詳細を調べ始めたところ、エラーがサーバーをSequel Proで入力した「127.0.0.1」ではなく「localhost」として報告していることに気付きました。友人はそれはおそらく単にエラー処理が悪いのではないかと提案しましたが、MySQLでのlocalhostと127.0.0.1の大きな違いを考えると奇妙に思えます。
トンネリングの問題を回避するために、直接接続できるようにroot @%へのアクセスを許可しました。これはほとんどの部分で機能し、テーブルデータを表示したり、新しいデータベースを作成したりできます。唯一の問題は、ユーザーを作成するときにエラーが発生することです。
ユーザー 'root' @ '%'のアクセスが拒否されました(パスワードを使用:YES)
奇妙なことに、ユーザーは実際に作成されていますが、それは付与の問題にすぎないと思います。繰り返しますが、ターミナルからrootとしてログインすると何でもできます。
トンネル接続と(おそらく)grantコマンドがアクセス拒否エラーを受け取っている理由を誰かが明らかにするのを手伝ってくれる人はいますか?
参考までに、MySQはバージョン5.6.16で、ほとんどがデフォルト設定で、MAC OS X ServerマシンにHomebrewを介してインストールされています。
更新
Rootが現在アクセスを許可されているホストのリストは次のとおりです。
mysql> select Host,user from mysql.user where user='root';
+----------------+------+
| Host | user |
+----------------+------+
| % | root |
| 127.0.0.1 | root |
| ::1 | root |
| localhost | root |
+----------------+------+
4 rows in set (0.00 sec)
私が理解しているように、最初の行( "%")は他の行を本当に冗長にする必要がありますか?
更新2
助成金の問題を修正しました。 root @%ユーザーには、追加のwith grant option
最後に、付与以外のすべてを実行できます。ただし、SSHトンネルが拒否されている理由を知りたいと思っています。
MySQLでは、localhost
キーワードはMySQLソケットを使用した接続用に予約されており、127.0.0.1上のMySQLネットワークポートへのTCP接続には、ip-address 127.0.0.1
を使用する必要があります。つまり、両方のサーバーは、127.0.0.1
およびからユーザーに特権を付与する必要があり、クライアントは、ローカルに接続する代わりに-h 127.0.0.1
を使用してトンネルを通過する必要があります。ソケット。
SSHポート転送を使用してアクセスできるようにするには、次のようなものが必要です。
GRANT SELECT ON *.* TO user@`127.0.0.1`
そして実行する
FLUSH PRIVILEGES;
そしておそらく
FLUSH QUERY CACHE;
それでも機能しない場合は、サーバープロセスを再起動します。
エラーメッセージで、逆DNSルックアップがlocalhost
に変換された後の127.0.0.1は、デバッグを困難にします。
manual がそれを説明しているように:
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
オプションを使用すると、他のオプションが通常は他のプロトコルにデフォルト設定される場合でも、特定のタイプの接続を確立できます。
これまでにssh tunelsで見たことがありますが、「localhost」へのすべての付与と「127.0.0.1」へのすべての付与には違いがあるため、「localhost」付与の代わりに、または「127.0.0.1」に付与してみてください。
Sequelを使用してトンネルを作成する代わりに、自分でトンネルを作成するにはどうすればよいですか。
ssh -Cc blowfish -Nf -vv -L3306:localhost:3306 sshuser @ domain
次に、Sequelで127.0.0.1:3306に接続します。接続できますか?ターミナル(またはSSHクライアントログ)に何か表示されますか?