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

时间:2012-01-12 06:52:53

标签: php mysql sql database database-connection

我收到以下错误:

  

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

     

这将在mysql.user中存储一个新的,更安全的哈希值。如果这       user可以在PHP 5.2或更早版本执行的其他脚本中使用       需要从my.cnf文件中删除旧密码标记

我在本地计算机上使用PHP 5.3.8和MySQL 5.5.16,而我的主机(media temple)正在运行PHP 5.3 MySQL 5.0.51a。实时服务器上的版本比我机器上的版本旧。

如何修复此错误并从本地计算机连接到MySQL?

我知道这个帖子有类似的帖子,但是我已经尝试了所有这些帖子,但没有一个是有效的。

7 个答案:

答案 0 :(得分:39)

  • 在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;

来源:How to fix "mysqlnd cannot connect to MySQL 4.1+ using old authentication" on PHP5.3

答案 1 :(得分:3)

我遇到了一个问题,默认情况下服务器已经启用了旧密码,所以一个简单的设置密码用于某些用户'%'%' =密码(' 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服务器var设置为old_password = OFF,例如这对我有用

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

答案 2 :(得分:2)

配置目标Mysql服务器以允许旧的不安全身份验证。

http://dev.mysql.com/doc/refman/5.0/en/server-options.html#option_mysqld_old-passwords

只需在目标Mysqld服务器上的my.cnf文件中注释掉old_passwords。

也许有办法获得使用兼容(旧)身份验证模式的PHP构建(或自己构建)。

答案 3 :(得分:2)

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

在(mt)帐户中心内,只需更新密码即可。我使用了相同的密码,它解决了我所有的问题。

答案 4 :(得分:0)

当我从旧版本的MySQL导入数据库时​​,我遇到了这个问题。最大的问题 - 它阻止我与root用户连接到MySQL,所以我必须按照以下说明reset the root password

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

E.g。由:

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

答案 5 :(得分:0)

我第一次在网格服务器上使用Media Temple数据库遇到此错误。

问题的原因是因为我使用的密码仍然是旧密码格式的数据库用户。新格式需要10个以上的字符,特殊字符,数字等...

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

答案 6 :(得分:0)

我遇到了同样的问题,这是我为解决该问题而执行的所有步骤:

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

    UPDATE mysql.user SET密码= PASSWORD('NewPassword')WHERE用户='用户名';

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