MySQL不能通过“localhost”连接,只有127.0.0.1

这对我来说有点神秘。 我可以连接到MySQL的唯一方法是,如果我通过“127.0.0.1”调用它…例如,我的PHP连接脚本将不会与本地主机

我运行Mac OS X Lion,内置apache2,MySQL,PHP,phpMyAdmin

mysqladmin:

count 0 debug-check FALSE debug-info TRUE force FALSE compress FALSE character-sets-dir (No default value) default-character-set auto host (No default value) no-beep FALSE port 0 relative FALSE socket (No default value) sleep 0 ssl FALSE ssl-ca (No default value) ssl-capath (No default value) ssl-cert (No default value) ssl-cipher (No default value) ssl-key (No default value) ssl-verify-server-cert FALSE user (No default value) verbose FALSE vertical FALSE connect-timeout 43200 shutdown-timeout 3600 plugin-dir (No default value) default-auth (No default value) 

    如果您告诉它连接到“localhost”,MySQL将尝试连接到unix套接字。 如果你告诉它连接到127.0.0.1,你强迫它连接到networking套接字。 因此,可能你已经configuration了MySQL只侦听networking套接字而不是文件系统套接字。

    什么是你的unix套接字是很难说的。 但是我build议你阅读MySQL参考指南中的这个页面 。 这应该对你有所帮助

    更新:基于更新的问题:参数“套接字”应该是这样的:“/var/lib/mysql/mysql.sock”。 参考手册中的这一页有更多的信息。

    这里你有我的/etc/my.cnf文件的开头:

     [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock 

    你的文件应该是相似的。 那么你的问题应该得到解决。 在testing之前,不要忘记重启MySQL服务器。

    您可能启用了IPv6,它的非常可能的本地主机parsing到ipv6本地主机,这是没有定义在您的msqlconfiguration。

    我也有一个问题,我必须添加'localhost'来代替'127.0.0.1'给该用户允许的子网,不明白为什么(我使用的是ipv4,这是前一阵子),但它值得一试。

    对于我来说,OSX的内置的PHP被configuration为使用不同的Unixsockets比自制的MySQL。 因此它不能通过使用该套接字的localhost进行连接。

    我用一个快速的黑客来解决这个问题,通过configurationphp的configuration的套接字path来指向一个mysql实际使用的套接字path。

     sudo ln -s /tmp/mysql.sock /var/mysql/mysql.sock 

    以下诊断命令非常有帮助。

    检查php和mysql使用的默认套接字path:

     php -i | fgrep 'mysql.default_socket' mysql -e 'show variables where variable_name = "socket"' 

    使用指定的套接字连接:

     php -r 'var_dump(mysql_connect("localhost:/tmp/mysql.sock", "user", "pass"));' mysql --socket=/tmp/mysql.sock 

    确定什么样的套接字mysql客户端正在使用连接:

     lsof | egrep '^mysql .*(IPv|unix)' 

    你可以检查mysql/conf/my.conf (在mysql/conf/my.conf的目录结构应该几乎是一样的)来查看skip-networking是否被取消注释? 如果是这样,请在该行的前面添加#并重新启动mysql服务器。

    我其实早就有类似的问题了(虽然这不在OSx中),所以我认为这可能值得一试。

    localhost是在/private/etc/hosts文件中定义的吗?

    我能够在我的testing框上重新创build相同的症状,希望这会有所帮助。

    在MySQL中,用户由两部分(名称和主机)定义。 默认情况下,MySQL将有3个root用户:

     mysql> SELECT host,user,password FROM mysql.user WHERE user='root'; +-----------------------+------+-------------------------------------------+ | host | user | password | +-----------------------+------+-------------------------------------------+ | localhost | root | | | localhost.localdomain | root | | | 127.0.0.1 | root | *PASSWORD_HASH_GOES_HERE | +-----------------------+------+-------------------------------------------+ 

    密码字段将为空(无密码)或存储散列。 如果你为一个特定用户设置了密码,那么它不会自动更新所有的密码,因为MySQL把它们视为不同的用户。

    例如:

     mysql> set password for 'root'@'127.0.0.1' = password('Password'); 

    将更新'root'@'localhost' 'root'@'127.0.0.1'的密码,而不是'root'@'localhost''root'@'localhost.localdomain' 'root'@'localhost' 'root'@'localhost.localdomain'

    看看skip_name_resolvevariables:

     mysql> show variables like 'skip_name_resolve'; +-------------------+-------+ | Variable_name | Value | +-------------------+-------+ | skip_name_resolve | ON | +-------------------+-------+ 1 row in set (0.00 sec) 

    默认情况下, skip_name_resolveOFF ,并尝试将所有IP地址parsing为主机名。 例如,如果你连接为'root'@'localhost' 'root'@'127.0.0.1' ,MySQL会改变连接你'root'@'localhost'

    如果它是ON ,MySQL会看到并连接'root'@'127.0.0.1''root'@'localhost'作为单独的用户。 他们可能有也可能没有不同的密码,这取决于他们是如何设置的。


    所以首先,我会检查看到任何密码的区别: mysql> SELECT host,user,password FROM mysql.user WHERE user='root';

    如果有,你可以修复它们,或者你可以继续调查。

    然后我会检查skip_name_resolvemysql> show variables like 'skip_name_resolve';

    如果它是ON ,我会找出它被设置的位置(例如/etc/my.cnf ),并删除它,除非有需要。

    希望这可以帮助你!

    我有这个问题,我无法弄清楚。 我尝试了一切,我可以罚款无济于事。

    我发现我在/ root /里有一个.netrc,里面有信息。

    我删除了它,问题消失了。

    能够使用mysql -uroot -plogin到mysql,现在没有问题。

    我知道这是一个旧的职位,但希望这可以帮助一个人。

    PHP仍然试图使用默认的套接字位置。 如果将MariaDB / MySQL文件夹/ var / lib / mysql移动到另一个位置,可能会出现此问题。 为了解决这个问题,你必须在/etc/php.ini文件中定义新的套接字位置。

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

    注意,根据你使用的驱动程序,你可能需要指定pdo_mysql.default_socket =

    为了检查你的当前目录,在mysql中运行以下命令:

     select @@datadir; 

    你必须在私人的/ etc / hosts中定义它,我想…或者只是使用127.0.0.1,因为无论如何它只是一个别名。

    对我来说,将权限更改为在mysql.sock的父目录中公开可读的问题修复了这个问题:

     chmod 755 /var/lib/mysql