我最近在本地机器安装两个不同版本的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标签即可看到)
其中我mysql5.7.40占用端口号为3307,通过
mysql -uroot -p --port=3307 进行登录mysql,但是port总是没有起到作用。查找原因:是不是命令行的参数被覆盖?
从下图可以看到port的确是3307
查官方文档:https://dev.mysql.com/doc/refman/8.0/en/connecting.html
官方说明:大概告诉我们:--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)。如下:
[root@localhost ~]# /usr/local/mysql/bin/mysql -h localhost --port=3308 -uroot -p --protocol=tcp
登录不成功。
把localhost修改为127.0.0.1,再来举例
[root@localhost ~]# /usr/local/mysql/bin/mysql -h 127.0.0.1 --port=3308 -uroot -p
[root@localhost ~]# /usr/local/mysql/bin/mysql -h 127.0.0.1 --port=3307 -uroot -p
这两个例子说明--port=3307是有效并且被有效使用,port=3308,是被使用,但是没有该端口。