首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可以使用127.0.0.1连接到虚拟MySql实例,但不能使用本地主机

问可以使用127.0.0.1连接到虚拟MySql实例,但不能使用本地主机
EN

Database Administration用户
提问于 2021-11-18 21:30:46
回答 2查看 1.4K关注 0票数 3

在本地MySql实例上运行VirtualBox 5.7.33。我已经将端口3306从虚拟服务器转发到本地访问。在我的虚拟主机上,我的/etc/mysql/my.cnf文件中有这个.

代码语言:javascript
复制
[client]
#password = your_password
port = 3306
socket = /var/run/mysqld/mysqld.sock

[mysqld]
port = 3306
bind-address = 0.0.0.0
datadir = /var/lib/mysql
socket = /var/run/mysqld/mysqld.sock
pid-file = /var/run/mysqld/mysqld.pid

在我的本地机器上,我可以使用

代码语言:javascript
复制
mysql -h 127.0.0.1 -u my_user my_db -p

但是一旦我切换到“localhost”,我就不能再连接了。

代码语言:javascript
复制
$ mysql -h localhost -u my_user my_db -p
Enter password: 
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

不知道是什么问题。从我的本地机器(即不是虚拟服务器)返回“localhost”…

代码语言:javascript
复制
$ host localhost
localhost has address 127.0.0.1
localhost has IPv6 address ::1
EN

回答 2

Database Administration用户

回答已采纳

发布于 2021-11-18 23:04:17

当您指定-h localhost时,mysql客户端将尝试使用套接字(即UNIX域套接字)而不是TCP。这是MySQL及其分支中的一种特殊行为。

但是,由于MySQL服务器在VM中运行,所以服务器的套接字不能被mysql客户端直接访问。UNIX域套接字只能在共享同一个内核的进程之间共享,对于在VM中(与mysql服务器一起)运行来宾操作系统的主机OS (与MySQL客户端)来说,情况并非如此。

顺便说一下,如果在容器(docker、podman等)中运行MySQL服务器,那么您将共享同一个内核,并且还可以共享一个UNIX域套接字。

解决方案1: SSH隧道

如果必须使用套接字,则从主机OS运行此套接字以创建SSH隧道(如果提示输入密码):

代码语言:javascript
复制
ssh -L /tmp/mysql.sock:/var/run/mysqld/mysqld.sock $VM_USER@$VM_IPADDR

然后,在主机操作系统上的一个单独的shell中:

代码语言:javascript
复制
mysql -h localhost --protocol=socket -u my_user -p -S /tmp/mysql.sock my_db

您可以从客户端发出status命令,以验证是否确实通过套接字连接。

请注意,在关闭SSH隧道后,需要手动删除本地套接字文件。否则,当您试图通过一个新隧道连接mysql时,下次您将得到一个错误:

代码语言:javascript
复制
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (111) 

解决方案2:"localhost",但TCP

如果您只想使用-h localhost,但不关心Unix套接字:

代码语言:javascript
复制
$ mysql -h localhost --protocol=tcp -u my_user my_db -p

只需添加参数--protocol=tcp,就可以迫使mysql客户端通过TCP连接,而不是通过D16域套接字进行连接。(当连接到端口3306已转发到我的主机OS的127.0.0.1:3306的podman容器时,这对我是有用的。)

顺便说一句,如果您不想每次连接时都编写这些长mysql命令,当然可以将一些或所有参数放在.my.cnf文件的[client]部分(注意前面的'.')在$HOME目录的根目录中。(与VM上的/etc/mysql/my.cnf中的语法相同。)

票数 0
EN

Database Administration用户

发布于 2021-12-03 05:46:59

告诉MySQL“用户”可以通过套接字连接:

代码语言:javascript
复制
CREATE USER "user"@"localhost" ...;
GRANT ... ON ... TO "user"@"localhost";

然而,这将只允许“用户”从同一虚拟主机内连接。

把它想象成一台独立的机器。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/302856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档