MySQL远程连接失败,出现“未知身份验证方法”

时间:2013-01-30 19:57:30

标签: mysql pdo database-connection remote-access

我正在尝试从我的本地计算机远程连接到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();
} 

8 个答案:

答案 0 :(得分:13)

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

  

新的mysqlnd库需要使用MySQL 4.1更新的41字节密码格式。继续使用旧的16字节密码将导致mysql_connect()和类似的函数发出错误,“mysqlnd无法使用旧的身份验证连接到MySQL 4.1+。”

如果是,请参阅https://stackoverflow.com/a/1340538/187954以获取有关更新密码的信息。

答案 1 :(得分:4)

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

SELECT PASSWORD('mypass') 

我通过运行以下查询

将localhost数据库服务器密码哈希值更改为16字节
SET GLOBAL old_passwords = 1;

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

我发现由于我使用的是PHP的{​​{1}} MySQL,所以它是处理身份验证的PHP,因此我将其降级为API并且我能够成功建立远程连接。

我希望这有助于某人。

答案 2 :(得分:3)

这可能有助于解决此问题的人。这就是我在我的情况下修复它的方法。 来自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扩展程序确实支持它。

答案 3 :(得分:2)

我遇到了同样的问题并且发现问题确实与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抽象(或任何其他)层,你可能会遇到麻烦。

答案 4 :(得分:1)

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

答案 5 :(得分:0)

运行带有laravel 5.6和默认mysql数据库(设置为服务:)的bitbucket管道时出现此问题。

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

definitions:
  services:
    mysql:
     image: mysql:5.6

PS:它是PHP 7.1

答案 6 :(得分:0)

用mysql_native_password通过“ password”标识的用户“ username” @“ localhost”;会解决它。

答案 7 :(得分:0)

如果您使用 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'