为什么MySQL命令连接时端口写错也能正常连接?

新手上路,请多包涵

mysql命令连接mysql服务为什么-P端口写错也能正常连?
感觉非常的迷幻

sh-4.4# mysql -uroot -p -P3307
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3801
Server version: 8.0.29 MySQL Community Server - GPL

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SHOW VARIABLES LIKE 'skip_networking';
Variable_nameValue
skip_networkingOFF

1 row in set (0.00 sec)

mysql> SHOW VARIABLES LIKE 'port';
Variable_nameValue
port41018

1 row in set (0.00 sec)

mysql>

1 row in set (0.00 sec)

mysql> SHOW VARIABLES LIKE 'port';
Variable_nameValue
port41018

1 row in set (0.00 sec)

mysql> exit
Bye
sh-4.4# mysql -uroot -p -P999999
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3836
Server version: 8.0.29 MySQL Community Server - GPL

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> ^C
mysql>

阅读 564
avatarAI BotBETA
这种情况通常发生在MySQL客户端尝试连接时,操作系统层面的网络配置或MySQL服务器的监听配置允许了这种“错误”的连接。以下是几种可能的解释:

1. **操作系统的网络重定向或端口转发**:在某些系统上,可能有网络配置(如iptables规则、防火墙规则或其他网络工具)将错误的端口(如3307或999999)重定向到了MySQL服务器实际监听的正确端口(如41018)。这意味着尽管你指定了一个错误的端口,但网络配置确保了连接被正确地转发到了MySQL服务器的正确端口。

2. **MySQL服务器的多端口监听**:虽然这种情况较少见,但理论上MySQL服务器可以被配置为监听多个端口。如果服务器同时监听了你尝试连接的错误端口和正确端口,那么即使你指定了错误的端口,连接仍然可以成功建立。然而,从你提供的信息来看,MySQL服务器配置为监听41018端口,没有直接证据表明它同时监听其他端口。

3. **客户端的缓存或配置问题**:有时,MySQL客户端或相关的网络库可能会缓存之前的连接信息,或者受到某些配置的影响,使得即使指定了错误的端口,也能成功连接到服务器。然而,这种情况通常不太可能是唯一解释,因为你需要连续多次以不同的错误端口尝试连接,并且每次都成功,这不太可能是简单的缓存问题。

4. **错误的观察或理解**:有时,可能由于误解或错误的观察导致认为连接到了错误的端口。例如,如果你同时运行了多个MySQL实例,并且它们配置为监听不同的端口,可能会混淆哪个实例正在响应连接。但从你的描述来看,这似乎不是情况,因为你只显示了一个MySQL实例的配置和端口。

在你的具体情况下,由于`skip_networking`是`OFF`,且`port`变量显示为41018,最合理的解释是操作系统层面的网络配置或重定向导致了这种行为。检查任何可能影响端口转发的网络配置(如防火墙规则、iptables规则等)可能会揭示问题的根源。
1 个回答

看到这个问题挺有意思,我也分别用 Docker 跑了下 MariaDB 和 MySQL 试了试。

结合 @唯一丶 兄弟的说法,还有这个讨论,推测应该是 mysql 命令在不主动使用 -h 参数时,默认值是 localhost,然后就会判定走 SOCKET 的连接方式。

SOCKET 连接方式,不会读取 -P/--port 提供的端口号,是直接通过的 my.cnf 里配置的 /var/run/mysqld/mysqld.sock 进行连接。

MySQL

[ok ] mysql -u root -p
[ok ] mysql -u root -p --port 3307
[bad] mysql -u root -p --port 3307 --protocol=TCP

[ok ] mysql -h localhost -u root -p --port 3307
[bad] mysql -h localhost -u root -p --port 3307 --protocol=TCP

[bad] mysql -h 127.0.0.1 -uroot -p --port 3307
# /etc/my.cnf
[mysqld]
socket=/var/run/mysqld/mysqld.sock
[client]
socket=/var/run/mysqld/mysqld.sock

MariaDB

MariaDB 是 MySQL 的一个分支,按理说两者的现象应该是一致的,但是实际测试效果和 MySQL 不太一样。看起来像是默认使用 --protocol=TCP 的方式进行连接。

[ok ] mysql -u root -p
[bad] mysql -u root -p --port 3307
[ok ] mysql -u root -p --port 3307 --protocol=SOCKET
# /etc/mysql/my.cnf
[client-server]
socket = /run/mysqld/mysqld.sock
推荐问题
宣传栏