phpからMySQL 8.0へPDOで接続時「SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client」

Ubuntu 18.04にnginx + phpの動作環境を作成したり、
MySQL 8.0をインストールしたりしてみました。

Ubuntu18.04 Server + nginx + php-fpmの動作環境を構築する
MySQL 8.0をUbuntu Server 18.04へインストール
MySQL 8.0 外部(他の端末)から接続する

今回は、この環境を利用してphp 7.2からMySQL 8.0に接続してみようと思います。


接続ライブラリのインストールと確認用のサンプル



phpからmysqlへ接続するためのライブラリをインストールします。


$ sudo apt install php-mysql




接続確認用にこんなサンプルを作成。


  1. <?php
  2. try {
  3.     $pdo = new PDO('mysql:host=localhost;dbname=sample;charset=utf8mb4','admin','P@ssw0rd');
  4. } catch (PDOException $e) {
  5.     exit($e->getMessage().PHP_EOL);
  6. }
  7. echo('ok'.PHP_EOL);



動かしてみるとエラーになります。


$ php sample.php
SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client



なんでだ?




認証方式の変更



色々調べてわかったことは、
・MySQLは接続時の認証方式を変更可能
・MySQL 8.0のデフォルトは「caching_sha2_password」
・今のところ、PHPの接続ライブラリは「caching_sha2_password」に対応していない。

こちらが参考になりました。
MySQL 8.0.4におけるデフォルト認証形式の変更

2点対応を行います。


ユーザーの認証方式変更



まず、作成したユーザーの認証方式は何になっているか。
mysql.userを検索してみます。


mysql> SELECT user, host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| user             | host     | plugin                |
+------------------+-----------+-----------------------+
| admin            | %     &nbp;   | caching_sha2_password |
| mysql.infoschema | localhost | mysql_native_password |
| mysql.session    | localhost | mysql_native_password |
| mysql.sys        | localhost | mysql_native_password |
| root             | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
5 rows in set (0.00 sec)




作成したadminユーザーの認証方式が「caching_sha2_password」になっているのでこ
「mysql_native_password」に変更します。

書式は以下のとおり。


ALTER USER 'admin'@'%' IDENTIFIED WITH mysql_native_password BY 'P@ssw0rd';



これでadminユーザーの認証方式が変更できました。


mysql> ALTER USER 'admin'@'%' IDENTIFIED WITH mysql_native_password;
Query OK, 0 rows affected (0.19 sec)

mysql> SELECT user, host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| user             | host     | plugin                |
+------------------+-----------+-----------------------+
| admin            | %         | mysql_native_password |
| mysql.infoschema | localhost | mysql_native_password |
| mysql.session    | localhost | mysql_native_password |
| mysql.sys        | localhost | mysql_native_password |
| root             | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
5 rows in set (0.00 sec)





デフォルトの認証方式変更



MySQLが接続時に期待している認証方式のデフォルト値を変更します。
設定ファイルを編集。


$ sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf



[mysqld]セクションの末尾に
「default-authentication-plugin=mysql_native_password」
を追記します。


[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket         = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
log-error     = /var/log/mysql/error.log
default-authentication-plugin=mysql_native_password



変更した内容を反映。


$ sudo service mysql reload



これでクライアントから接続が行われた時、mysql_native_passwordで認証してくれます。



サンプルの実行



再度PDO接続するサンプルを実行してみます。


$ php sample.php
ok



接続できました!


【参考URL】

MySQL 8.0.4におけるデフォルト認証形式の変更
13.7.1.1 ALTER USER Syntax
Caching SHA-2 (or 256) Pluggable Authentication for MySQL 8
Upgrading to MySQL 8.0 : Default Authentication Plugin Considerations

関連記事

コメント

No title

この記事のおかげで接続することができました。
ありがとうございます<(_ _)>

解決しました

記事を参照し解決しました。

とても助かりました。ありがとうございます!

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます

プロフィール

Author:symfo
blog形式だと探しにくいので、まとめサイト作成中です。
https://symfo.web.fc2.com/

PR

検索フォーム

月別アーカイブ