Error:SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client

WordPressのインストールをしようとしたら、Error:SQLSTATE[HY000] [2054] The server requested authentication method unknown to the clientというエラーが出たので対処法となります。

データベース関連

データベースの情報は以下の通りです

  • ミドルウェア:MySQL
  • バージョン:8.0

ユーザー情報

  • ユーザー名:logw
  • パスワード:nyi9rGK3)*%K&?
  • ホスト名1:locahost
  • ホスト名2:127.0.0.1
  • ポート番号:3306

ホスト名は1でも2でもどちらでも問題ありません。

症状

SSHからの接続はできますが、PHPからの接続ができなくエラーとなります。

# mysql -u logw -p
Enter password:上記のパスワードをいれる
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 203
Server version: 8.0.18 MySQL Community Server - GPL

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

問題無く接続できました。

phpから接続

<html>
<head><title>PHP TEST</title></head>
<body>

<?php

$dsn = 'mysql:dbname=logw;host=127.0.0.1';
$user = 'logw';
$password = 'nyi9rGK3)*%K&?';

try{
    $dbh = new PDO($dsn, $user, $password);

    print('
');

    if ($dbh == null){
        print('接続に失敗しました。
');
    }else{
        print('接続に成功しました。
');
    }
}catch (PDOException $e){
    print('Error:'.$e->getMessage());
    die();
}

$dbh = null;

?>

</body>
</html>

エラー文:Error:SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client
となります。phpのバージョンは7.3となります。

原因

MySQL8では、デフォルトの認証方式がcaching_sha2_passwordとなっていますが、PHPのライブラリが対応していないことでエラーとなります。PHPの認証方式はmysql_native_passwordのため、これに戻す事で解決します。

設定確認

まずはSSHで設定を確認します。

# mysql -u root -p
Enter password:rootのパスワードをいれる
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 203
Server version: 8.0.18 MySQL Community Server - GPL

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

#認証方式を確認する
mysql> SELECT user, host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| logw             | localhost | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | mysql_native_password |
+------------------+-----------+-----------------------+
#認証方式がcaching_sha2_passwordとなっています。

認証方式が違うので、PHPだとエラーとなります。今回は既存ユーザーとなるので、既存ユーザーの修正コマンドをいれます。

既存ユーザー修正

mysql> ALTER USER 'logw'@'localhost' IDENTIFIED WITH mysql_native_password BY 'nyi9rGK3)*%K&?';
Query OK, 0 rows affected (0.01 sec)

これで設定完了です。
※パスワードは自身の使っているパスワードに置き換えて下さい
中身を確認します

mysql> SELECT user, host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| logw             | localhost | mysql_native_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | mysql_native_password |
+------------------+-----------+-----------------------+

無事に変更されました。これで接続できます