web-dev-qa-db-fra.com

La connexion à distance MySQL échoue avec "méthode d'authentification inconnue"

J'essaie de me connecter à distance au serveur MySQL en ligne à partir de mon ordinateur local, mais le message d'erreur suivant s'affiche:

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

La version de mon serveur MySQL local est 5.5.27, libmysql - mysqlnd 5.0.10 La version du serveur MySQL distant est 5.5.23, la version de mysqlnd n'est pas exposée.

Je suppose que c'est un problème de hachage de mot de passe incompatible, mais je ne sais pas comment le résoudre . Ci-dessous une partie de mon code de connexion.

$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();
} 
12
Chibuzo

J'ai surmonté le défi. J'ai découvert que mon hôte de base de données MySQL distant utilise toujours l'ancien hachage de mot de passe MySQL, qui est de 16 octets, alors que mon serveur de base de données localhost utilise un hachage de mot de passe de 41 octets. J'ai utilisé la requête suivante pour trouver la longueur du mot de passe:

SELECT PASSWORD('mypass') 

J'ai changé le hachage de mot de passe de mon serveur de base de données localhost en 16 octets en exécutant la requête suivante

SET GLOBAL old_passwords = 1;

Ensuite, j'ai édité le fichier my.ini et paramétré le old_password=1 pour que, lors du redémarrage du serveur, il ne revienne pas sur le nouveau système de mot de passe. Mais cela n'a pas résolu mon problème.

J'ai découvert que c'était PHP qui gérait l'authentification, étant donné que j'utilisais PHP's MySQLAPI, je suis donc passé à PHP 5.2.8 et j'ai pu établir la connexion à distance avec succès.

J'espère que ça aidera quelqu'un.

4
Chibuzo

En supposant que vous utilisiez PHP 5.3+, il est possible que l'un des Changements liés à l'incompatibilité avec les versions antérieures :

La nouvelle bibliothèque mysqlnd nécessite l'utilisation du nouveau format de mot de passe de 41 octets de MySQL 4.1. L'utilisation continue des anciens mots de passe de 16 octets fera que mysql_connect () et des fonctions similaires émettront l'erreur, "mysqlnd ne peut pas se connecter à MySQL 4.1+ avec une ancienne authentification."

Si tel est le cas, voir https://stackoverflow.com/a/1340538/187954 pour obtenir des informations sur la mise à jour de votre mot de passe.

13
Michael Robinson

Cela peut aider quelqu'un avec ce problème. Voici comment je l'ai corrigé dans ma situation . Depuis l'API MySQL PHP (PDO_MYSQL) website

Lorsque vous exécutez une version PHP antérieure à 7.1.16 ou PHP 7.2 antérieure à 7.2.4, définissez Le mot de passe par défaut du serveur MySQL 8 pour mysql_native_password ou sinon, vous verrez des erreurs similaires à Le serveur demandé méthode d'authentification inconnue du client [mot de passe caching_sha2] même lorsque caching_sha2_password n'est pas utilisé.

Ceci est dû au fait que MySQL 8 utilise par défaut caching_sha2_password, un plugin cela n'est pas reconnu par les anciennes versions PHP (mysqlnd). Au lieu, changez-le en mettant default_authentication_plugin = mysql_native_password dans my.cnf. Le Le plugin caching_sha2_password sera supporté dans un futur PHP Libération. En attendant, l'extension mysql_xdevapi le supporte.

3
Rob

J'ai rencontré le même problème et j'ai compris que le problème avait bien à voir avec PHP.

La solution était simple pour moi: passer à mysqli au lieu de PDO. Lorsque vous utilisez Zend_Db, ceci est aussi simple que de changer 1 ligne:

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

Devient

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

Mais si votre application n'utilise pas la couche d'abstraction de Zend_Db (ou toute autre), vous risquez d'avoir des problèmes.

2
Wouter

J'ai eu ce problème sur un service d'hébergement partagé (bluehost.com). Je viens de réinitialiser le mot de passe de l'utilisateur MySql via l'interface Web fournie par Bluehost. J'ai réutilisé l'ancien mot de passe, je l'ai retapé à l'interface, puis enregistré et tout s'est bien passé.

1
metatron

J'ai eu ce problème lors de l'exécution de pipelines bitbucket avec laravel 5.6 et la base de données mysql par défaut (set is services :).

solution était d'utiliser l'ancienne version de mysql

definitions:
  services:
    mysql:
     image: mysql:5.6

PS: c'était PHP 7.1

0

modifier l'utilisateur 'username' @ 'localhost' identifié avec mysql_native_password par 'password'; le réparerais.

0
Adrián Prieto