【问题标题】:Error: mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication错误:mysqlnd 无法使用旧的不安全身份验证连接到 MySQL 4.1+
【发布时间】:2012-01-12 06:52:52
【问题描述】:

我收到以下错误:

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

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

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

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

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

【问题讨论】:

  • 正如我的帖子中所述,我已经尝试了这些建议,但没有一个对我有用。那篇文章也回到了 09,所以我重新发布,看看是否有其他/更新的解决方案。

标签: php mysql sql database database-connection


【解决方案1】:
  • 在 my.cnf 中删除或注释 old_passwords = 1

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

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

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

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

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

+----------+---------+ |用户 |长度(`密码`) | +----------+---------+ |根 | 41 | |根 | 16 | |用户2 | 16 | |用户2 | 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

【讨论】:

  • 我有点困惑,我应该在我自己的 comp 的命令行中执行此操作,还是应该使用 myadminphp 连接到外部数据库。我的数据库在远程服务器上,而不是在我的电脑上。
  • 我在 phpmyadmin 中运行的所有内容都告诉我访问被拒绝。我可以进行正常查询,但任何管理命令都会被拒绝。
  • 当我在本地机器上运行上述代码时,我得到了 root | 0 三倍。三行根|0。就像没有密码或密码长度为 0 一样。当我在 phpmyadmin(外部数据库)中运行它时,我被拒绝访问。
  • @user982853 你应该通过 root 用户连接到远程 mysql 主机。在您的本地机器上,您将获得 root | 0 因为你没有root密码
  • @user982853 我是你没有从其他主机访问。仅来自本地主机。询问您的管理员
【解决方案2】:

我遇到了服务器默认启用旧密码的问题,所以一个简单的 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`;

密码不会转移到 from

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

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

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

      【讨论】:

      • 我确实可以访问我的 my.cnf 文件。我对注释该行进行了更改,现在我收到错误:数据库选择失败:用户'db95658_ewr'@'%'对数据库'mvc'的访问被拒绝。我检查了我的用户名和密码,它们是正确的。
      • 尝试重置你的密码。当mysqld更改身份验证模式时,它需要更改用户表中的密码哈希。
      • 我们如何在构建之前配置 php 以使用旧的兼容身份验证模式?
      【解决方案5】:

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

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

      我以新格式创建了一个新的数据库用户和密码,效果很好。

      【讨论】:

        【解决方案6】:

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

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

        例如作者:

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

        【讨论】:

          【解决方案7】:

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

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

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

          3. 请务必在 /etc/my.cnf 中注释 oldpassword 值
          4. 重启 mysql 服务以避免任何其他问题

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-01-21
            • 2010-12-07
            • 2012-01-18
            • 2011-09-25
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多