【问题标题】:MySQL remote connection fails with "unknown authentication method"MySQL 远程连接因“未知身份验证方法”而失败
【发布时间】:2013-01-14 18:33:38
【问题描述】:

我正在尝试从本地计算机远程连接到 MySQL 服务器,但出现以下错误:

Warning: PDO::__construct(): The server requested authentication 
method unknown to the client [mysql_old_password] in 
C:\xampp\htdocs\ticket\terminal\sync.php

SQLSTATE[HY000] [2054] The server requested authentication method 
umknown to the client

我的本​​地 MySQL 服务器版本是 5.5.27,libmysql - mysqlnd 5.0.10 远程MySQL服务器版本为5.5.23,mysqlnd版本未暴露。

我猜这是一个不兼容的密码哈希问题,但我不知道如何解决它。 以下是我的部分连接代码

$dsn = 'mysql:host=184.173.209.193;dbname=my_db_name';
$options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
); 

try {
    $online_dbh = new PDO($dsn, 'myusername', 'mypassword', $options);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "Congratulations!";
} catch (PDOException $e) {
    echo $e->getMessage();
} 

【问题讨论】:

标签: mysql pdo database-connection remote-access


【解决方案1】:

假设您使用的是 PHP 5.3+,您可能会遇到 Backward Incompatibility Changes 之一:

新的 mysqlnd 库需要使用 MySQL 4.1 更新的 41 字节密码格式。继续使用旧的 16 字节密码将导致 mysql_connect() 和类似函数发出错误,“mysqlnd cannot connect to MySQL 4.1+ using old authentication。”

如果是这样,请参阅https://stackoverflow.com/a/1340538/187954 了解有关更新密码的信息。

【讨论】:

    【解决方案2】:

    这可能会帮助解决此问题的人。这就是我在我的情况下修复它的方法。 来自MySQL PHP API (PDO_MYSQL) 网站

    运行 7.1.16 之前的 PHP 版本或 7.2.4 之前的 PHP 7.2 时,设置 MySQL 8 Server 的默认密码插件为 mysql_native_password 或 否则您将看到类似于请求的服务器的错误 客户端未知的身份验证方法 [caching_sha2_password] 即使没有使用 caching_sha2_password。

    这是因为 MySQL 8 默认使用caching_sha2_password,一个插件 较旧的 PHP (mysqlnd) 版本无法识别。反而, 通过设置改变它 my.cnf 中的 default_authentication_plugin=mysql_native_password。这 未来的 PHP 将支持caching_sha2_password 插件 发布。同时,mysql_xdevapi 扩展确实支持它。

    【讨论】:

    • 这个“my.cnf”文件在macos中的位置在哪里?
    • @Haboosh 如果你是通过 brew 安装的,它位于/usr/local/etc/my.cnf
    • 这个答案对我有用,但我必须重新创建用户和密码才能使其工作
    • 我的情况是,在我编辑完 conf 文件后,我还发送如下命令:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
    【解决方案3】:

    我克服了挑战。 我发现我的远程 MySQL 数据库主机仍然使用 16 字节的旧 MySQL 密码哈希,而我的 localhost 数据库服务器使用 41 字节的密码哈希。我使用以下查询来查找密码长度:

    SELECT PASSWORD('mypass') 
    

    我通过运行以下查询将我的 localhost 数据库服务器密码哈希更改为 16 字节

    SET GLOBAL old_passwords = 1;
    

    然后我编辑了my.ini文件,并设置了old_password=1,以确保服务器重启时不会恢复到新的密码系统。但这并没有解决我的问题。

    我发现是PHP处理了身份验证,因为我使用的是PHPMySQLAPI,所以我降级到PHP 5.2.8并且能够成功建立远程连接。

    我希望这对某人有所帮助。

    【讨论】:

    • @ian 所以只是告诉我们降级似乎不对,而对您来说似乎是正确的?
    • @Chibuzo 是的,对我来说降级始终不是正确的解决方案。通过确保我的 mysql 客户端版本与服务器版本是最新的,我能够修复我的问题。然后设置 old_password = 0 并设置一个新的 root 密码。
    • @ian 当服务器不是你的并且你运行的版本比服务器高时怎么样?那是我的情况。解决方案是什么?
    • 只是为了明确一点:您不必更改 my.ini MySql 服务器配置中的任何内容,也不必降级 PHP 版本。在当前会话中发出set old_passwords=0 后,重置相关帐户的密码就足够了。更新密码后,无论服务器上@@old_passwords 的值如何,PDO 都可以连接。
    【解决方案4】:

    alter user 'username'@'localhost' 用 mysql_native_password by 'password' 标识;会解决的。

    【讨论】:

      【解决方案5】:

      我遇到了同样的问题,发现问题确实与 PHP 有关。

      解决方案对我来说很简单:切换到 mysqli 而不是 PDO。使用 Zend_Db 时,只需更改 1 行即可:

      $db = Zend_Db::factory('pdo_mysql',array('host' => MYSQL_HOST, 'username' => MYSQL_USER, 'password' => MYSQL_PASS, 'dbname' => MYSQL_SCHEMA));
      

      变成

      $db = Zend_Db::factory('mysqli',array('host' => MYSQL_HOST, 'username' => MYSQL_USER, 'password' => MYSQL_PASS, 'dbname' => MYSQL_SCHEMA));
      

      但如果您的应用程序没有使用 Zend_Db 抽象(或任何其他)层,您可能会遇到麻烦。

      【讨论】:

        【解决方案6】:

        我在共享托管服务 (bluehost.com) 上遇到了这个问题。我只是通过 Bluehost 提供的 Web 界面重置了 borking MySql 用户的密码。我重新使用了旧密码,在界面重新输入并保存,一切又好了。

        【讨论】:

          【解决方案7】:

          如果您使用Bitbucket PipelinesMySQL 5.8+,您可以将已知参数--default-authentication-plugin=mysql_native_password 添加到您的服务中,如下所示:

          definitions:
            services:
              mysql:
                image: mysql:8.0
                environment:
                  MYSQL_DATABASE: 'app'
                  MYSQL_ROOT_PASSWORD: 'root'
                  MYSQL_DEFAULT_AUTH: 'mysql_native_password'
          

          【讨论】:

            【解决方案8】:

            我在使用 laravel 5.6 和默认 mysql 数据库(设置为服务:)运行 bitbucket 管道时遇到了这个问题。

            解决方法是使用旧版本的mysql

            definitions:
              services:
                mysql:
                 image: mysql:5.6
            

            PS:它是 PHP 7.1

            【讨论】:

            • 更改了文件 bitbucket-pipelines.yml
            • 我找到了解决方案并分享了它。如果您知道更好的方法,请添加另一个答案。
            猜你喜欢
            • 1970-01-01
            • 2022-01-24
            • 2015-08-20
            • 2020-10-30
            • 2010-09-12
            • 2019-05-07
            • 1970-01-01
            • 2013-03-24
            相关资源
            最近更新 更多