MySQL笔记-mysql -hlocalhost和mysql -h127.0.0.1的不同
背景
我这边有台Linux的机器,搭建了MySQL,端口号是1万开头(非3306),因业务需求,需要再搭建一台MySQL,端口号为3306的,为了方便,我搭建了一个docker版MySQL,启动时做了HOST,端口是3306。
有意思的地方来了,当我输入
mysql -hlocalhost
时,他连接到宿主机(端口号1万开头的那个mysql了,查日志查到的)
当输入
mysql -h127.0.0.1
时就会访问到docker里面的mysql。
应用程序里面也是如此,当输入的是localhost时,连接到宿主机。当输入127.0.0.1时连接到docker。
一开始以为是iptables转发是不是有问题,就强制写了一条nat转发127.0.0.1到docker网关的规则,但还是不行。
对此十分震惊,难道对于mysql这个命令,官方难道是做了什么优化?简直可怕,对此学习了下,受益匪浅。
结论
在使用 MySQL 时,mysql -h localhost 和 mysql -h 127.0.0.1 之间的主要区别在于连接的方式:
mysql -h localhost
- 当使用 localhost 时,MySQL 客户端会尝试通过 Unix 域套接字(Unix socket)来连接数据库。这种方式通常比通过网络更快,因为它不需要网络协议的开销。
- 在Linux系统中,这种连接方式通常是通过 /var/run/mysqld/mysqld.sock 等路径的 socket 文件进行的。
mysql -h 127.0.0.1
- 使用 127.0.0.1 时,MySQL 客户端会通过 TCP/IP 协议进行连接。这意味着它会将数据包发送到 IP 地址 127.0.0.1,并通过网络层建立连接。
- 虽然 127.0.0.1 也是指本机,但实现方式不同。
总结
- localhost 会优先使用 Unix 域套接字连接。
- 127.0.0.1 会使用 TCP/IP 连接。
要让 mysql -h localhost 通过 TCP/IP 进行连接而不是使用 Unix 域套接字,你可以在连接命令中指定 IP 地址,这里有几种方法可以实现这个目标:
使用 --protocol 参数
可以使用 --protocol 参数来强制 MySQL 客户端使用 TCP/IP 连接。运行以下命令:
mysql -h localhost --protocol=TCP -u username -p