MySQL无法通过“ localhost”进行连接,只有127.0.0.1


27

这对我来说还是个谜。我可以连接到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)

1
对于服务器故障,这可能更多,但请确保您的主机文件具有localhost别名。
马特

127.0.0.1 localhost在我的主机文件中。
dcolumbus

打开命令提示符并键入ping localhost并查看其内容。
史蒂夫·罗宾斯

从127.0.0.1开始的64个字节:icmp_seq = 0 ttl = 64时间= 0.100 ms从127.0.0.1开始的64个字节:icmp_seq = 1 ttl = 64时间= 0.102 ms从127.0.0.1开始的64字节:icmp_seq = 2 ttl = 64时间= 0.096 ms
dcolumbus 2011年

Answers:


26

如果您告诉MySQL连接到“ localhost”,MySQL将尝试连接到Unix套接字。如果告诉它连接到127.0.0.1,则将强制其连接到网络套接字。因此,可能您已将MySQL配置为仅侦听网络套接字,而不侦听文件系统套接字。

UNIX套接字到底有什么问题很难说。但是我建议您阅读MySQL参考指南上的此页面。这应该对您有帮助。

更新:基于更新的问题:参数“ socket”应类似于以下内容:“ / var / lib / mysql / mysql.sock”。参考手册中的此页面提供了更多信息。

这是我的/etc/my.cnf文件的开头:

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

您的文件应该相似。那你的问题应该解决了。测试之前,请不要忘记重新启动MySQL服务器。


1
哇:“如果您不指定主机名或指定特殊主机名localhost,则使用Unix套接字文件。” 似乎……不直观。因此,所有其他答案。
马克·瓦格纳

很高兴知道+1
Matt

我很欣赏理论……只是不知道答案是什么。
dcolumbus 2011年

@dcolumbus:正如我已经写过的,这很难说。我建议您打开一个控制台,然后只写命令“ mysql”。也许您会获得更多信息。另一件事是查看日志文件。我的位于目录/ var / log /中,名为mysql.log。您的名字可能是其他名称或其他位置。如果您可以为我们提供更多信息,那么我们可能可以为您提供更好的帮助。
拉斐尔·卢西格

2
php.ini引用了“ /var/mysql/mysql.sock”(精确到3个地方),需要将其更改为“ /tmp/mysql.sock” ...谢谢您的帮助!
dcolumbus 2011年

8

您可能已启用IPv6,其很有可能的localhost解析为ipv6 localhost,这在您的msql配置中未定义。

香港专业教育学院也有一个问题,我必须在该用户允许的子网中添加“本地主机”代替“ 127.0.0.1”,不明白为什么(我使用的是ipv4,有一段时间了),但值得一试。


您可以通过在命令行中查看“ host localhost”是否返回:: 1以及127.0.0.1来进行检查。如果是这样,则可以从/ private / etc / hosts中删除:: 1映射,也可以重新配置MySQL以侦听IPv6 :: 1地址以及127.0.0.1
David North

我想我记得在某处读过Mac OS X上默认启用IPv6的情况。
dcolumbus 2011年

如今,几乎所有现代OS都启用了ipv6,即osx10.6上的im,默认情况下已启用。
Silverfire

错误。Localhost对于mysql客户端具有特殊含义-请查看serverfault.com/a/295300/67675
poige

5

对我来说,OSX的内置php配置为使用与Homebrew的mysql不同的unix-socket。因此,它无法通过使用该套接字的localhost连接。

我通过符号链接php的已配置套接字路径以指向mysql实际使用的一个快捷技巧来修复它。

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

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

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

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)'

2

您是否可以检查mysql/conf/my.conf(在OSx上目录结构应该几乎相同)以查看是否skip-networking未注释?如果是这样,请#在该行的最前面添加一个并重新启动mysql-server。

实际上我前一段时间也遇到过类似的问题(尽管在OSx中不是),所以我认为值得一试。


1
为什么会对此表示不满?一个解释会有所帮助。
karllindmark

我没有拒绝您的投票,但您的回答实际上与OP的要求相反。但是我支持您,因为我在相反的情况下苦苦挣扎-可以通过套接字连接,而不能通过网络连接。顺便说一句,我不能通过my.conf来解决此问题;我必须将其放在命令行上:“ mysqlf --skip_networking = 0 ...”
Jan Steinman

2

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

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

注意,根据您使用的驱动程序,您可能必须指定pdo_mysql.default_socket =

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

select @@datadir;


1

我能够在测试盒上重现您的相同症状,希望这会有所帮助。

在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'@'127.0.0.1',但不会'root'@'localhost''root'@'localhost.localdomain'

看一下skip_name_resolve变量:

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地址解析为主机名。例如,如果您以as身份连接'root'@'127.0.0.1',MySQL将更改您以as身份连接'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除非有必要,否则我将找出它的设置位置(例如)并将其删除。

希望这可以帮助您!


1

我遇到了这个问题,无法解决。我尽我所能地尝试了一切。

我发现我在/ root /中有一个.netrc,其中包含信息。

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

现在可以使用mysql -uroot -p登录mysql而不会出现问题。

我知道这是一篇旧文章,但希望对您有所帮助。


1

对我来说,将权限更改为可在mysql.sock的父目录上公开读取的问题解决了:

chmod 755 /var/lib/mysql

1

对于将CageFS与CloudLinux结合使用的人:

我重新创建/var/lib/mysql是因为我从头开始重建MySQL服务器...

这从cagefs卸载了路径。我知道这无关,但是我正在使用cPanel和CloudLinux。我无法验证为什么套接字连接不起作用,最后,我意识到了。

添加/var/lib/mysql/etc/cagefs/cagefs.mp (如果已经存在,请继续下一步)并运行

cagefsctl --remount-all

解决了问题


1
我的天啊!这就是为我解决的问题!它已经在/etc/cagefs/cagefs.mp运行,但已cagefsctl --remount-all修复。谢啦!
AlvaroFlañoLarrondo

0

您必须在我认为的private / etc / hosts中定义它...或只使用127.0.0.1,因为无论如何它都是同一件事,只是一个别名。


127.0.0.1 localhost在我的主机文件中。
dcolumbus
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.