我试着用python连接mysql。它在工作台mysql中连接。然后在cmd中,我也尝试连接(如下所示)。效果不错!
mysql -u MyNewPass
但是,当我运行python代码时:
db = MySQLdb.connect(host = "127.0.0.1", user="root", passwd="MyNewPass", db="test", port=3306)
它显示了错误
db = MySQLdb.connect(host = "127.0.0.1", user="root", passwd="MyNewPass", db="test", port=3306)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/site-packages/MySQLdb/__init__.py", line 74, in Connect
return Connection(*args,**kwargs)
File "/usr/lib/python2.7/site-packages/MySQLdb/connections.py", line 170, in __init__
super(Connection, self).__init__(*args,**kwargs2)
_mysql_exceptions.OperationalError: (1045, "Access denied for user 'root'@'localhost' (using password: YES)")
有人能帮我吗?谢谢
1条答案
按热度按时间khbbv19g1#
在mysql中,用户由用户名('root')和用户连接的主机标识。
在linux上的mysql中,主机名“localhost”是特殊的,它指定通过本地套接字的连接,而不是tcp/ip连接。
似乎已启用dns主机名解析(默认设置)
--skip-name-resolve
未为mysql服务器指定选项)看起来mysql服务器看到一个来自ip地址127.0.0.1的连接,然后进行反向查找,找到主机名“localhost”,然后查找匹配的用户“root”@“localhost”。
(这个解释对我来说似乎有点奇怪,但是我没有任何其他的解释来解释这个行为,因为python connect指定mysql server ip address为127.0.0.1,并且错误消息报告“root”@“localhost”。)
一些建议:
尝试强制tcp/ip连接而不是本地套接字连接。使用mysql命令行客户机,我们可以指定
--protocol=TCP
例如我不确定python连接器的确切语法,但我希望它会非常相似。
或者,尝试指定“localhost”的主机名以使用本地套接字连接。
检查mysql.user表中用户名为“root”的用户的内容
请注意,“root”@“%”的密码可以不同于“root”@“localhost”,因为它们是不同的用户。
真正令人困惑的是,该连接似乎提供了ip地址127.0.0.1作为目标主机,而且似乎应该强制tcp连接。但是mysql似乎报告了一个错误,试图使用unix套接字进行连接。
报告的行为很奇怪。我不确定python连接器到底是怎么回事
127.0.0.1
解释为本地主机套接字连接。以下是对预期行为的引用:
https://dev.mysql.com/doc/refman/5.7/en/connecting.html
在unix上,mysql程序特别处理主机名localhost,与其他基于网络的程序相比,这种处理方式可能不同于您所期望的。对于到localhost的连接,mysql程序尝试使用unix套接字文件连接到本地服务器。即使提供了--port或-p选项来指定端口号,也会发生这种情况。要确保客户端与本地服务器建立tcp/ip连接,请使用--host或-h指定主机名值127.0.0.1,或者指定本地服务器的ip地址或名称。您还可以使用--protocol=tcp选项显式指定连接协议,即使对于localhost也是如此。