无法使用“ localhost”连接到MySQL,但使用“ 127.0.0.1”可以吗?


12

我的/ etc / hosts文件如下所示:

127.0.0.1 localhost

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

我在构建服务器时发现,尽管我可以成功ping通localhost,但是在某些配置文件中,如Postfix,Apache和Dovecot等服务中,我需要指定127.0.0.1而不是localhost使它们工作。

我还需要更改某些数据库驱动的网站的配置文件,这些网站用于localhost连接MySQL。

我已经尝试过对该hosts文件进行各种修改,但是到目前为止我没有尝试过。

服务器正在运行Ubuntu 12.04.02 LTS。它没有安装selinux,即使将IPtables默认策略设置为接受并刷新它们,上述情况仍然存在。

Answers:


15

您可能要检查的一件事是(这要求您登录到MySQL控制台)-检查以确保您具有root通过via 登录的权限localhost

mysql -h 127.0.0.1 -u root -p

-成功登录后-

mysql> select user,host from mysql.user;
+------+--------------------------------+
| user | host                           |
+------+--------------------------------+
| root | 127.0.0.1                      | 
| root | ::1                            |
| root | localhost                      | <-- Make sure you have a localhost entry for root
+------+--------------------------------+
3 rows in set (0.00 sec)

只是把它扔在那里,以防万一这是问题所在。


我觉得您的做法正确。我已经做到了,并且可以看到,尽管root和其他几个用户都是为localhost创建的,但是主机控制面板为用户创建的用户都是127.0.0.1(除了之外的%)。我认为这可能足以为我解决问题,因此我可能会在短时间内接受您的回答。
彼得·斯诺

谢谢您的帮助!我想补充一点,在更新mysql.user表之后,需要重新启动mysql服务器,以使更改生效。
不足维克

尽管已被接受,但对于mysql,这通常不是(永远?)问题。请参阅EEAA的答案(mysql解释localhostsocket而不是TCP)。
制造商史蒂夫,

8

大多数MySQL客户端奇怪的是,如果将host指定为localhost,它们会将其别名为套接字连接而不是TCP连接。您的选择是坚持使用,127.0.0.1或者如果客户端支持它(如mysql CLI二进制文件使用该--protocol标志),则强制其使用TCP而不是unix套接字。


谢谢EEAA。问题是,诸如Joomla安装程序之类的事情会失败。如果您在安装过程中在主机名字段中指定127.0.0.1而不是localhost在主机名字段中指定,则会导致安装路径混乱,给我其他错误,但是指定本地主机无法连接数据库!是什么原因造成这种情况?我为什么有它?
彼得·斯诺

3
@PeterSnow在MySQL配置中设置Unix域套接字。
迈克尔·汉普顿

感谢@MichaelHampton我已经搜索了最后一个半小时,却找不到如何设置它。您能指出我的文章还是给我一些想法?我确实socket = /var/run/mysqld/mysqld.sock在其中my.cnf,该文件已存在,由mysql拥有,权限为777。谢谢。
彼得·斯诺

@PeterSnow进行更改后是否重新启动了mysqld?
EEAA 2013年

目前,我正在尝试通过Joomla安装脚本使用它。http页面要求输入主机名。如果我选择127.0.0.1它可以工作(但是脚本以后使用该条目并失败,因为它期望使用可解析的名称,例如localhost),但是如果我使用localhost,连接来创建数据库,则会失败。
彼得·斯诺


1

您可以像这样检查权限:

[learner@localhost ~]$ sudo netstat -npa | grep mysqld  
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      6284/mysqld         
unix  2      [ ACC ]     STREAM     LISTENING     233040 6284/mysqld         /var/lib/mysql/mysql.sock

如果在0 0.0.0.0:*上监听,则表示每个人都可以访问该mysql。

您可以在my.conf文件中编辑此绑定。在linux中,默认路径是:

[learner@localhost ~]$ sudo vi /etc/my.cnf

将这些行添加到my.conf文件中,以允许您需要的IP。

bind-address = 127.0.0.1   
bind-address = 0.0.0.0

感谢a_learner提供的信息,尽管我已经接受了答案。
彼得·斯诺

0

PHP仍在尝试使用默认套接字位置。如果您已将MariaDB / MySQL文件夹从/ var / lib / mysql移至另一个位置,则可能出现此问题。为了解决该问题,您必须在/etc/php.ini文件中定义新套接字的位置。

mysqli.default_socket =/newDBLocation/mysql/mysql.sock

0

我通过创建symlink解决了这个问题sudo ln -s /opt/lampp/var/mysql/mysql.sock /var/run/mysqld/mysqld.sock。但是首先我必须创建文件夹,/var/run/mysqld/因为该文件夹最初并不存在。


-1

您需要/ tmp中的mysql.sock

ln -s /var/lib/mysql/mysql.sock mysql.sock

之后应该可以正常工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.