web-dev-qa-db-de.com

MySQL-Remote-Verbindung schlägt mit "unbekannter Authentifizierungsmethode" fehl

Ich versuche, von meinem lokalen Rechner aus online eine Fernverbindung zum MySQL-Server herzustellen, aber ich erhalte die folgende Fehlermeldung:

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

Meine lokale MySQL-Server-Version ist 5.5.27, libmysql - mysqlnd 5.0.10 Die entfernte MySQL-Server-Version ist 5.5.23. Die mysqlnd-Version ist nicht verfügbar.

Ich denke, es ist ein inkompatibles Passwort-Hash-Problem, aber ich weiß nicht, wie ich es lösen kann ... __ Im Folgenden finden Sie einen Teil meines Verbindungscodes

$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

Ich habe die Herausforderung gemeistert. Ich fand heraus, dass mein entfernter MySQL-Datenbankhost immer noch den alten MySQL-Kennwort-Hash von 16 Byte verwendet, während mein Localhost-Datenbankserver einen 41-Byte-Kennwort-Hash verwendet. Ich habe die folgende Abfrage verwendet, um die Kennwortlänge zu ermitteln:

SELECT PASSWORD('mypass') 

Ich habe den Kennworthash für den localhost-Datenbankserver in 16 Byte geändert, indem ich die folgende Abfrage ausgeführt habe

SET GLOBAL old_passwords = 1;

Dann habe ich die my.ini-Datei bearbeitet und den old_password=1 eingestellt, um sicherzustellen, dass der Server beim Neustart nicht auf das neue Kennwortsystem zurückgesetzt wird. Aber das hat mein Problem nicht gelöst.

Ich habe herausgefunden, dass PHP die Authentifizierung übernimmt, da ich PHPs MySQLAPI verwendet habe, also habe ich auf PHP 5.2.8 heruntergestuft und konnte die Remote-Verbindung herstellen erfolgreich.

Ich hoffe das hilft jemandem.

4
Chibuzo

Angenommen, Sie verwenden PHP 5.3 und höher, kann eine der Änderungen in Backward Inkompatibilitätsänderungen auftreten:

Die neue mysqlnd-Bibliothek erfordert die Verwendung des neueren 41-Byte-Passwortformats von MySQL 4.1. Die fortgesetzte Verwendung der alten 16-Byte-Kennwörter führt dazu, dass mysql_connect () und ähnliche Funktionen den Fehler ausgeben.

In diesem Fall finden Sie unter https://stackoverflow.com/a/1340538/187954 Informationen zum Aktualisieren Ihres Kennworts.

13

Dies kann jemandem mit diesem Problem helfen. So habe ich es in meiner Situation behoben ... von der MySQL PHP - API (PDO_MYSQL) - Website

Wenn Sie eine Version von PHP vor 7.1.16 oder PHP 7.2 vor 7.2.4 ausführen, setzen Sie Das Standardpasswort-Plugin von MySQL 8 Server in mysql_native_password oder Andernfalls werden ähnliche Fehler angezeigt. Der Server hat angefordert Authentifizierungsmethode, die dem Client nicht bekannt ist [caching_sha2_password] auch wenn caching_sha2_password nicht verwendet wird.

Dies liegt daran, dass MySQL 8 standardmäßig caching_sha2_password (ein Plugin .__) verwendet. Das wird von älteren PHP (mysqlnd) -Versionen nicht erkannt. Stattdessen, Ändern Sie es mit der Einstellung default_authentication_plugin = mysql_native_password in my.cnf Das Das Plugin caching_sha2_password wird in zukünftigen PHP-Dateien unterstützt. Veröffentlichung. In der Zwischenzeit wird sie von der Erweiterung mysql_xdevapi unterstützt.

3
Rob

Ich bin auf das gleiche Problem gestoßen und habe herausgefunden, dass das Problem tatsächlich mit PHP zu tun hat.

Die Lösung war für mich einfach: Wechseln Sie zu mysqli anstelle von PDO. Bei der Verwendung von Zend_Db ist dies so einfach wie das Ändern einer Zeile:

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

Wird

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

Wenn Ihre Anwendung jedoch nicht die Abstraktionsschicht Zend_Db (oder eine andere) verwendet, können Probleme auftreten.

2
Wouter

Ich hatte dieses Problem bei einem Shared-Hosting-Service (bluehost.com). Ich habe das alte Passwort des MySql-Benutzers einfach über die von Bluehost bereitgestellte Webschnittstelle zurückgesetzt. Ich habe das alte Passwort wiederverwendet, es an der Schnittstelle neu eingegeben und gespeichert und alles war wieder in Ordnung.

1
metatron

Ich habe dieses Problem beim Ausführen von Bitbucket-Pipelines mit Laravel 5.6 und der Standard-Mysql-Datenbank (Set ist Dienste :).

lösung war die Verwendung einer älteren Version von MySQL

definitions:
  services:
    mysql:
     image: mysql:5.6

PS: Es war PHP 7.1

0

Ändern Sie den Benutzer 'Benutzername' @ 'localhost', der mit 'mysql_native_password' durch 'password' identifiziert wurde. würde es reparieren.

0
Adrián Prieto