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
接続確認用にこんなサンプルを作成。
- <?php
- try {
- $pdo = new PDO('mysql:host=localhost;dbname=sample;charset=utf8mb4','admin','P@ssw0rd');
- } catch (PDOException $e) {
- exit($e->getMessage().PHP_EOL);
- }
- 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
- 関連記事
-
- MySQL 5.7 文字コードの確認とmy.confでutf8mb4への変更
- MySQL 5.7 インストール後のrootパスワードと変更方法(Ubuntu 18.04)
- phpからMySQL 8.0へPDOで接続時「SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client」
- MySQL 8.0 外部(他の端末)から接続する
- MySQL 8.0をUbuntu Server 18.04へインストール
コメント
No title
ありがとうございます<(_ _)>
2020/11/13 11:40 by - URL 編集
解決しました
とても助かりました。ありがとうございます!
2020/12/21 19:16 by YHTB URL 編集
管理人のみ閲覧できます
2021/06/08 07:06 by - 編集