这对我来说有点神秘。 我可以连接到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_resolve
variables:
mysql> show variables like 'skip_name_resolve'; +-------------------+-------+ | Variable_name | Value | +-------------------+-------+ | skip_name_resolve | ON | +-------------------+-------+ 1 row in set (0.00 sec)
默认情况下, skip_name_resolve
为OFF
,并尝试将所有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_resolve
: mysql> 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