python 中的 (1045, "Access denied for user 'root'@'ip-address' (using password: YES)")

(1045, "Access denied for user 'root'@'ip-address' (using password: YES)") in python

我想使用 pymysql(python 库)访问托管在域 my_domain_name 上的 MySql 数据库。 我的代码是:

connection = pymysql.connect('my_domain_name', user, passd, db)

但是我收到这个错误

(1045, "Access denied for user 'root'@'ip-address' (using password: YES)")

在大多数答案中,人们建议:

either password is wrong or 'root' user do not have privileges to access database

但是,我可以使用直接 link 访问数据库:http://www.my_domain_name/phpmyadmin/index.php 使用相同的用户和密码。 感谢您的帮助。谢谢


注意:'my_domain_name' 正在转换为 ip_address。当我将此 IP 置于我的浏览器时,它会将我带到我的 Internet 提供商的网站。


更新: 很明显 domain_name 正在被 Internet 提供商的 ip_address 取代。我该如何解决这个问题?请分享任何 link。谢谢。

MySQL 访问控制取决于 客户端 的 IP 地址而不是 服务器 的 IP 地址。

我假设您正在连接到 MySQL 的某个云实例,换句话说,它不是您本地计算机上的 运行。 (如果它是本地的,只需使用 "localhost" 而不是 "my_domain_name.")

当您连接到 MySQL 服务器时 "my_domain_name," 它会看到来自您的 public IP 地址的传入连接。 (如果您 Google 表示“what's my IP address”,Google 显示的地址应该与错误消息中的地址匹配。)如果您在浏览器中输入该 IP 地址,您将连接到您自己的路由器。如果您从 ISP 那里获得该路由器,他们可能会对其进行设置,以便连接到路由器时将您重定向到 ISP 自己的主页。

在MySQL中,客户端地址是用户身份的一部分。换句话说,john@host1john@host2 是 MySQL 的两个不同用户。您在创建用户时指定主机:

# Only applies to john connecting from host1
CREATE USER 'john'@'host1' IDENTIFIED BY 'password';

您还可以对客户端地址使用通配符,这意味着具有该名称的用户从任何客户端地址连接。

# john can connect from any host
CREATE USER 'john'@'%' IDENTIFIED BY 'password';

您的 MySQL 实例可能是为名为 root@localhost 的用户设置的。要从其他地方连接,您可以创建另一个 root@my-ip-address 用户,其中 my-ip-address 是您的地址,但是,此用户将与 root@localhost 不同。您必须授予它与 root@localhost 相同的权限。以这种方式访问​​ MySQL 可能会很不方便,因为如果您的 IP 地址发生变化,您将失去访问权限。您可以创建一个用户 root@%,它可以在任何客户端上工作,但是只要用户有密码,您就允许从任何客户端地址访问您的 MySQL 服务器。

您可以从 Web 管理控制台登录的原因是,当您访问控制台时,您并没有直接连接到数据库,而是与控制台交互,而控制台正在连接数据库.控制台 运行 与 MySQL 在同一台服务器上,因此当它连接到 MySQL 时,连接来自 localhost

如果您想通过命令行访问 MySQL,更好的策略是通过 SSH 连接到 MySQL 服务器,然后在本地使用 mysqlroot@localhost 身份连接.


问题是默认情况下,MySql 服务器不会为用户分配远程访问数据库所需的权限。因此,打开您的 SqlServer 控制台并使用此命令将权限分配给 'root' 用户:

GRANT ALL ON root.* TO 'root'@'ip_address_of_server' IDENTIFIED BY 'password_for_root' ;
FLUSH PRIVILEGES;

 GRANT ALL ON root.* TO 'root'@'server_name' IDENTIFIED BY 'password_for_root' ;
    FLUSH PRIVILEGES;

请参阅此答案以获取更多信息: