MySQLのバージョンを8系にアップグレードした後、SOY CMSの初期化画面(ログイン画面でもおそらく同じ)を開いたら、
データベースの接続に失敗しました。(Can not get DataSource (myqsl:********port=3306;dbname:******)というエラーが表示された。
/CMSインストールディレクトリ/admin/webapp/pages/_init/InitPage.class.phpの
/** * データベースに接続できるかをチェックする * @return Boolean */ private function checkLoginable(){ if(!is_writable(SOY2::RootDir() . "db")){ $this-<_message["db"] = CMSMessageManager::get("ADMIN_DB_CONNECT_FAILURE") . " " . CMSMessageManager::get("ADMIN_DB_NO_ROLE") . " " . realpath(SOY2::RootDir() . "db"); }else if(SOYCMS_DB_TYPE != "sqlite"){ try{ $con = SOY2DAO::_getDataSource(); }catch(Exception $e){ $this-<_message["db"] = CMSMessageManager::get("ADMIN_DB_CONNECT_FAILURE") . " (" . $e-<getMessage() . ")"; } } return (!isset($this-<_message["db"]) || strlen($this-<_message["db"]) == 0); }
でExceptionが拾える箇所があるので、ダンプしてみると、
SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client
というエラーであった。
どうやら、MySQL8.0は認証方法周りの仕様が変更されたらしいが、PHPのPDOの方がその仕組みに対応出来ていないらしいので、接続エラーとなる。
今回はPDOの対応までの応急処置をメモしておく。
環境
OS:Ubuntu 19.10
MySQL:8.0.18
PHP:7.3.11
はじめに端末の方でアプリと接続するアカウントの認証方法を確認してみる。
端末でMySQLにログインして、下記を実行すると
mysql> select user, host, plugin FROM mysql.user WHERE user = 'root'; +------+-----------+-------------+ | user | host | plugin | +------+-----------+-------------+ | root | localhost | auth_socket | +------+-----------+-------------+ 1 row in set (0.01 sec)
※開発環境なので、SOY CMSでMySQLに接続するアカウントをrootにしていますが、本番環境ではrootでの接続はよろしくないです。
指定のアカウントのpluginがauto_socketになっていた。
auto_socketが何なのか?は保留にしておいて、SOY CMSでMySQLに接続できる応急処置に戻る。
MySQLからログアウトして、端末で下記の対応を行う。
$ sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
MySQLの設定ファイルを開いたら、[mysqld]の下に下記の値を追加する。
default_authentication_plugin=mysql_native_password
設定ファイルを更新したら、端末で、
sudo /etc/init.d/mysql restart
でMySQLを再起動する。
再び、SOY CMSのログイン画面を開いたら、無事にMySQLと接続できた。