2つのサーバー[〜#〜] a [〜#〜]および[〜#〜] b [〜# 〜]。 [〜#〜] b [〜#〜]にはMySQLサーバーがあり、これは機能します。
mysql -h localhost -P 3306 -u user -p
これはしませんが:
mysql -h 127.0.0.1 -P 3306 -u user -p
My.cnfには次の行がありますが:
bind-address = 127.0.0.1
# Next addr differs slightly, but anyway
bind-address = 99.99.99.99
トンネルについて。それは次を接続します:(A) localhost(9989) -> (B) localhost(3306)
しかし(on[〜#〜] a [〜#〜]、ポートを転送した場合)
mysql -v -h 127.0.0.1 -P 9989 -u user userdb -p
ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0
を取得します
そして私がするとき
mysql -v -h localhost -P 9989 -u user userdb -p
ERROR 1045 (28000): Access denied for user 'user'@'localhost' (using password: YES)
を取得します
理由は何ですか?私は何を間違えていますか?
ここには3つの問題があります。
1-今のところSSHトンネルを忘れる
MySQLを複数の特定のIPにバインドすることはできません。最初の_bind-address
_句は、2番目の句によってオーバーライドされます(したがって、無視されます)。サーバーは_99.99.99.99
_のみをリッスンします。
_-h localhost
_で接続できるが_-h 127.0.0.1
_では接続できない理由は、最初の形式では、実際にはTCP/IP経由ではなく、ローカルソケット経由で接続するためです。
_my.cnf
_でsocket
句を探します。
1つの冗長な_bind-address
_句を削除します。 _bind-address=0.0.0.0
_を使用すると、MySQLデーモンにallネットワークインターフェイスをリッスンするように指示できます。
2-SSHトンネルをセットアップしましょう
エラーERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0
の理由は私には明らかではありません。 IsuspectSSHトンネルは、実際には接続要求を受信したときにのみ確立されます(あなたの場合、mysql
クライアントを実行したとき)。サーバーは127.0.0.1をリッスンしないため(前の段落を参照)、SSHトンネルを確立できず、接続に失敗し、クライアントはそれをネットワーク障害として解釈します。
3-_mysql -v -h localhost -P 9989 -u user userdb -p
_が失敗する理由
の出力を投稿してください
[編集:単に_...OR Host LIKE 'localhost'
_を追加しました。これはトラブルシューティングの目的に関連する可能性があるためです]
_mysql > SELECT user, Host FROM mysql.user WHERE user LIKE 'user' OR Host LIKE 'localhost';
_
(LIKE
句の後の_'user'
_を、必要に応じて実際のユーザー名に置き換えます)
MySQLアクセス制御は、ユーザーを識別するために、ユーザー名/パスワード(user
)と接続の発信元(Host
)の両方をチェックします。おそらくユーザー_'user'@'localhost'
_を作成していません。
N.B .: mysql.comが現在の場所から到達できないため、関連するマニュアルページにリンクできません。
まさにこの問題に遭遇しました。
私の場合、MySQLサーバーはbind-address: 192.168.4.4
で構成されています。私はもともと一般的に言及されている-L 3306:localhost:3306 user@server
文字列を使用してSSHトンネルをセットアップし、コンピューターからmysql -h 127.0.0.1
で接続します。
これは、MySQLが.0.0.または"localhost"
(別名127.0.0.1)でリッスンしなくなり、192.168.4.4
のみをリッスンするため、機能しません。
正しいトンネル文字列は-L 3306:192.168.4.4:3306 user@server
である必要があります。これにより、MySQLが実際にリッスンするIPを使用して、リモートトンネルエンドがMySQLに接続するように指示されます。
ステップバイステップのSSHトンネリング
- - サーバ側 - -
ターゲットマシン(IPまたはホストドメインで追加可能)には、構成ファイル/ etc/mysql/my.cnfがあります
bind-address = 127.0.0.1
コンソールで確認済み
netstat -tapn | grep mysql
// tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 18469/mysqld
これは、mysqlサーバーがローカルホストからのリクエストにのみ応答することを意味します
- - クライアント側 - -
cygwin、PuTTY、またはlinux_Shellを使用してログを記録するアカウント(最終的にはsshキー)を持っている
ssh user_name@Host_name
sSHトンネルを作成する
ssh -f -N -L 1000:127.0.0.1:3306 user_name@Host_name
つまり、私が入力したマシンのポート1000からリモートHost_name:3306への永続的な接続を作成することを意味します。 IPではなくUNIX(名前付き)ソケットに接続します...取得します 'ERROR 2002(HY000):Ca n't connect to local MySQL server through socket'/var/run /mysql.sock '(2)'mysqlをco接続しようとするとき
-f =バックグラウンドに入る-N =実行なし
両方の-f -N種類のnohoop-コンソールを閉じてトンネルを維持できます
- - サーバ側 - -
netstat -tapn | grep ssh
// tcp 0 0 server_ip:22 clint_ip:port ESTABLISHED 24915/sshd: user_name
これは、shhプロトコルを介した永続的な接続があることを意味します
- - クライアント側 - -
mysql -h 127.0.0.1 -P 1000 -u mysql_user -pmysql_pass
これで、(クライアント側の)mysqlクライアントはリモートmysqlサーバーに接続されます...ここで127.0.0.1はクライアントマシンです
ワークベンチ、heidiSQLでも同じ
sSHトンネルを殺す方法
ps fax | grep ssh
kill process_id
Windowsでも同じ問題("Lost connection..."
)がありました(PuTTY経由でsshトンネルを使用中)。ここに2つの問題があります。
PuTTY: Connection > SSH > Tunnels > Local ports accept connections from other hosts
で有効にするのを忘れました私の場合、SSHデーモンの構成がトンネルをブロックしていました。 AllowTcpForwardingを有効にする必要があります。
AllowTcpForwarding yes
簡単なステップが私のために働いた...私はこれを共有するので、多分あなたの一部は頭痛を免れることができます。
私の設定
私の場合、Ubuntuで実行されているPerconaサーバーがあり、SSHを介して(Windows VMの)MySQL Workbenchに接続されています。クエリの処理中にエラー10060が発生するまで、サーバーは数日間正常に動作しました。
私のために働いた
Acquia.comのフォーラムで、ワークベンチがホストとして「127.0.0.1」を受け入れない場合があるため、「localhost」に変更する必要があることがわかりました。私はそれをしましたが、うまくいきました(奇妙なことに、Workbenchは既にパスワードが保存されていたとしてもパスワードを再度要求しましたが、それでもうまくいきました)。