错误:mysqlnd无法使用旧的不安全认证连接到MySQL 4.1+

26

我遇到了以下错误:

数据库连接失败:mysqlnd 无法使用旧的不安全验证方式连接 MySQL 4.1+。请使用管理工具在命令中重置密码:SET PASSWORD = PASSWORD('your_existing_password')

这将在mysql.user中存储一个新的、更安全的哈希值。如果此用户在 PHP 5.2 或更早版本执行的其他脚本中使用,您可能需要从您的my.cnf文件中删除 old-passwords 标志。

我在我的本地机器上使用 PHP 5.3.8 和 MySQL 5.5.16,我的主机(Media Temple)正在运行 PHP 5.3 MySQL 5.0.51a。生产服务器上的版本比我的机器上的版本旧。

我该如何修复这个错误并从我的本地机器连接到 MySQL?

我知道有类似的帖子,但我已经尝试过所有的方法,都没有起作用。


这是https://dev59.com/4XI_5IYBdhLWcg3wAd42的副本。 - rkosegi
5
正如我在帖子中所述,我已经尝试了那些建议,但是它们都对我不起作用。那篇帖子也发表于09年,因此我重新发布它,看看是否有其他/更近期的解决方案。 - user982853
7个回答

43
  • 在 my.cnf 中删除或注释掉 old_passwords = 1

重启 MySQL。如果不这样做,MySQL 将继续使用旧密码格式,这将意味着您无法使用内置的 PASSWORD() 哈希函数升级密码。

旧密码哈希值为 16 个字符,新密码哈希值为 41 个字符。

  • 连接到数据库,并运行以下查询:

    SELECT user, Length(`Password`) FROM  `mysql`.`user`;
    

这将向您显示哪些密码采用了旧格式,例如:

+----------+--------------------+
| user     | Length(`Password`) |
+----------+--------------------+
| root     |                 41 |
| root     |                 16 |
| user2    |                 16 |
| user2    |                 16 |
+----------+--------------------+

请注意,每个用户可以有多行(每个不同的主机规范一行)。

要更新每个用户的密码,请运行以下命令:

UPDATE mysql.user SET Password = PASSWORD('password') WHERE user = 'username';

最后,刷新权限:

FLUSH PRIVILEGES;

来源: 如何在PHP5.3上修复“mysqlnd无法使用旧的身份验证连接到MySQL 4.1+”


我有点困惑,我应该在自己电脑的命令行中操作还是使用myadminphp连接到外部数据库。我的数据库位于远程服务器上而不是在我的电脑上。 - user982853
我在phpMyAdmin中运行的所有内容都显示访问被拒绝。我可以执行普通查询,但任何管理员命令都被拒绝。 - user982853
@user982853,您应该使用root用户连接到远程MySQL主机。在本地机器上,因为您没有root密码,所以您获得了root | 0。 - Ramil Amerzyanov
嘿,我遇到了同样的问题,我正在使用SQLYog GUI来管理MySQL,但是我找不到my.cnf文件。请帮我解决这个问题。 - Anil Kumar Pandey
当移除 old_password=1 时,所有当前的密码仍然有效吗?我能否仅更新导致问题的账户的密码并保持其他所有账户不变? - Byscripts
显示剩余3条评论

4

我曾遇到一个问题,服务器默认启用了旧密码,因此简单的 SET PASSWORD FOR 'some-user'@'%' = PASSWORD ('XXXX'); 无法生效(由于旧软件和传统原因,我不会深入解释...)

解决方案:

SET old_passwords = 0;
SET PASSWORD FOR 'some-user'@'%' = PASSWORD ('XXXX');
FLUSH PRIVILEGES;

细节:

以已登录用户身份执行此操作。

SET Password = PASSWORD('password')

无法正常工作

例如在此处进行测试

SHOW CREATE TABLE `mysql`.`user`;

密码无法转移。
| HOST | USER | PASS |

旧密码

| % | some-user | 7fa559aa33d844b4 |

我需要做的是更改密码。

| % | some-user | *CF04AECA892176E6C0C8206F965C03374D12F93E |

所以我查找了旧密码的变量。

SHOW VARIABLES;

...
old_passwords = ON
...

基本上,我需要先设置mysql服务器变量为old_password=OFF,例如这对我有效。

SET old_passwords = 0;
SET PASSWORD FOR 'some-user'@'%' = PASSWORD ('XXXX');
FLUSH PRIVILEGES;

2

我在尝试通过我的本地Windows机器上的IIS连接mediatemple external-db时遇到了相同的问题。更新特定数据库用户的密码解决了连接数据库的问题。

在(mt)账户中心内,简单地更新密码即可。我使用了相同的密码,解决了所有的问题。


2

我确实可以访问我的 my.cnf 文件。我已经注释掉了那一行并且现在出现了一个错误:数据库选择失败:用户 'db95658_ewr'@'%' 没有访问数据库 'mvc' 的权限。我已经检查了我的用户名和密码,它们是正确的。 - user982853
尝试将密码重置为与之前相同。当mysqld更改了认证模式时,需要在用户表中更改密码哈希值。 - rkosegi
我们如何在构建之前配置PHP以使用旧的兼容认证模式? - nurp

0

我第一次在网格服务器上使用Media Temple db时遇到了这个错误。

问题是由于我为数据库用户使用了旧的密码格式而导致的。新格式需要使用10个以上的字符、特殊字符、数字等...

我创建了一个新的数据库用户和密码,按照新的格式,它可以正常工作。


0

我有同样的问题,这是我解决这个问题所做的所有步骤:

  1. 检查是否使用了正确的凭据
  2. 使用此命令确保您更改了密码:使用字符、数字和字母(超过10个)

    UPDATE mysql.user SET Password = PASSWORD('NewPassword') WHERE user = 'username';

  3. 确保您在/etc/my.cnf中注释掉旧密码的值
  4. 重新启动mysql服务以避免任何其他问题

0

我在将数据库从旧版本的MySQL导入时遇到了这个问题。最大的问题是它阻止我使用root用户连接MySQL,因此我必须按照以下说明重置root密码

之后,我能够应用上面给出的修复方法。

例如,通过:

SET PASSWORD FOR 'root'@'localhost' = PASSWORD('MyNewPass');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接