MySQLが任意の/すべてのポートで接続するのはなぜですか
-
10-10-2019 - |
質問
私はLinuxミントを実行していて、この方法でmysqlに接続しようとしています
mysql --port=3306 -u root -p
その後、パスワードのために私に促します。これはすべて問題ありません。このようなものを入力すると、まだ機能します。
mysql --port=1234 -u root -p
ポート1234で実行されているMySQLサーバーがないため、失敗してはなりませんか?
私がこれを求めている理由は、SSHトンネルを作成して別のサーバーのデータベースに接続したいからです。 SSHトンネルがすべてのトラフィックをLocalHost:3308からMyRemoteserver:3306に転送するとしましょう。私のローカルMySQLサーバーはすべてのポートの接続を受け入れているため、実際にポート3308に接続してリモートサーバーを押すことはできません。私はまだローカルサーバーにヒットしています。
たとえSSHトンネルのオプションが間違っていたとしても、ポート1234に接続できる理由を誰かが知っていて、3306で実行されているローカルMySQLサーバーにヒットしたのだろうかと思っていました。
解決
IIRC MySQLは、LocalHostに接続する場合、UNIXソケットに接続します。この場合、TCPを介して接続しないため、ポートが関与しておらず、提供するポート番号は重要ではありません。
編集:これがすべてのシステムで当てはまるかどうかはわかりませんが、127.0.0.1またはLocalHostの代わりにホスト名を使用する場合、MySQLはTCPを介して接続し、ポート番号は重要です - 正しいポート番号のみに接続できます。
他のヒント
TCP接続の使用を強制します --protocol=TCP
.
例:
最初にSSHトンネル
ssh -L 4000:localhost:3306 server.ch
次に、リモートMySQLサーバーに接続します
mysql -h localhost --port=4000 --protocol=TCP -u root -p
パスワードをお願いします 前 接続しようとします。パスワードを入力して(またはその他の点で何か)、それを続行させると、次のようなもので応答します。
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/opt/local/var/run/mysql5/mysqld.sock'
@titanoboa、thxこれ!私は同じ問題を抱えていました。追加するために、以下を使用してローカルホストでも実際にTCP接続を強制することができます
[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock
protocol = TCP
乾杯