我最近在本地机器安装两个不同版本的mysql数据库。一个是mysql8.0.31,一个是mysql5.7.40,本来我想把mysql5.7.40也通过docker来安装,但是我尝试过好多次。发现一旦docker run mysql5.7.40,本地机器的10多G内存立刻消耗完,关于mysql5.7启动内存问题,今后再写一篇。

docker image inspect mysql:latest | grep -i version (一般查看docker安装最新容器的软件版本号,其他版本在tag标签即可看到)

关于mysql -uroot --port=xxx的--port失效问题_mysql

其中我mysql5.7.40占用端口号为3307,通过

mysql -uroot -p --port=3307   进行登录mysql,但是port总是没有起到作用。查找原因:是不是命令行的参数被覆盖?

[root@localhost ~]# /usr/local/mysql/bin/mysql --verbose --help

从下图可以看到port的确是3307

关于mysql -uroot --port=xxx的--port失效问题_docker_02

关于mysql -uroot --port=xxx的--port失效问题_docker_03

/usr/local/mysql/bin/mysql --verbose --help | grep my.cnf

关于mysql -uroot --port=xxx的--port失效问题_mysql_04


查官方文档:​​https://dev.mysql.com/doc/refman/8.0/en/connecting.html​

关于mysql -uroot --port=xxx的--port失效问题_docker_05

官方说明:大概告诉我们:--protocol规定客户端与服务端传输协议,其他参数也会影响到传输协议使用。一旦规定了--protocol,与该协议相关的参数将被使用,例如,在Unix上使用--host=localhost,客户端会尝试使用Unix套接字文件连接到本地服务器,即使给出了--port或-P选项来指定TCP/IP端口号。

为了确保客户端与本地服务器建立TCP/IP连接,使用--host或-h指定127.0.0.1(而不是localhost)的主机名,或本地服务器的IP地址或名称。也可以通过使用--protocol=TCP选项明确指定传输协议,甚至是localhost

下面两个例子说明--protocol 3308端口是不存在的,这里为了举例说明,随便拿3308使用。

[root@localhost ~]# /usr/local/mysql/bin/mysql -h localhost --port=3308 -uroot  -p

port=3308,竟然在没有使用--protocol情况下,竟然可以登录成功,说明--port=3308被忽略(实际端口是3307)。如下:

关于mysql -uroot --port=xxx的--port失效问题_IP_06

[root@localhost ~]# /usr/local/mysql/bin/mysql -h localhost --port=3308 -uroot  -p --protocol=tcp

登录不成功。

关于mysql -uroot --port=xxx的--port失效问题_mysql_07


把localhost修改为127.0.0.1,再来举例

[root@localhost ~]# /usr/local/mysql/bin/mysql -h 127.0.0.1 --port=3308 -uroot  -p

关于mysql -uroot --port=xxx的--port失效问题_IP_08

[root@localhost ~]# /usr/local/mysql/bin/mysql -h 127.0.0.1 --port=3307 -uroot  -p

这两个例子说明--port=3307是有效并且被有效使用,port=3308,是被使用,但是没有该端口。

关于mysql -uroot --port=xxx的--port失效问题_mysql_09