Dragon Arrow written by Tatsuya Nakaji, all rights reserved animated-dragon-image-0164

MySQL 5.6から8.0にupgradeした後のエラー

イメージ
Apr 20, 2019

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


MYSQL5.7まで有効なコマンドで、MySQL8では利用できません。


MacでMysqlを5.6から8.0にupgradeした後、LaravelからMysqlにアクセスできなくなった。

ちなみにupgradeのコマンドは、

$ brew upgrade mysql
$ mysql_upgrade -u root -p




修理手順1 MySQL8での、ユーザのパスワード変更

mysql > USE mysql;
mysql > ALTER USER 'root'@'localhost' identified BY 'your_now_password';

Query OK, 1 row affected (0.04 sec)
Rows matched: 1  Changed: 1  Warnings: 0



【補足】root ユーザのパスワード忘れて、ログイン出来ないとき

// 一度終了
$ mysql.server stop

// セーフモードでの起動、
$ mysqld_safe --skip-grant-tables &

// パスワードなしでログインできる
$ mysql -u root


一度パスワードを空にします。

// root のパスワードを空にする
mysql > UPDATE mysql.user SET authentication_string=null WHERE User='root';
mysql > exit;


その後、MYSQLを再起動。空のパスワードでログインして、上記のALTERコマンドを実行します。

// MySQL再起動(非セーフモード)
$ mysql.server restart

// 空のパスワードでログイン
$ mysql -u root -p 

// パスワード設定
mysql > USE mysql;
mysql > ALTER USER 'root'@'localhost' identified BY 'remake_password';

Query OK, 1 row affected (0.04 sec)
Rows matched: 1  Changed: 1  Warnings: 0



補足】MySQL8のパスワード認証プラグインについて


MySQLでは、パスワードの認証時に、実行される、「authentication plugin」という仕組みのがあります。

例えば上記のコマンドで設定したパスワードについて、下記のコマンドで、確認できます。

mysql> select User, Plugin from mysql.user where User = 'root';
+------+-----------------------+
| User | Plugin                |
+------+-----------------------+
| root | caching_sha2_password |
+------+-----------------------+Copy

下のコマンドで確かめられるように、MySQL8 からは、「caching_sha2_password」がデフォルトとなったようなのですが・・、

mysql > use mysql;
mysql > show variables like 'default_authentication_plugin';
+-------------------------------+-----------------------+
| Variable_name                 | Value                 |
+-------------------------------+-----------------------+
| default_authentication_plugin | caching_sha2_password |
+-------------------------------+-----------------------+Copy

mysqlを利用するクライアントソフトウェア(例えば、PhpMyAdminなど)では、この認証方法をサポートしていないため、エラーとなりログイン出来ないことがあるようです。

パスワードを下記のコマンドで設定すると、回避できます。


mysql> ALTER USER 'root'@'localhost' identified WITH mysql_native_password BY 'your_now_password';
Query OK, 0 rows affected (0.01 sec)

同様に「my.cnf」にも書き込んでおきます。これでデフォルトの認証プラグインを変更できましたので、これ以降の新規ユーザ作成時は、デフォルトで、mysql_native_password が使用されます。

修理手順2 my.cnfの設定を変更する

$ mysql --help | grep my.cnf
                      order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf

左から順に存在するファイルを確認していく

$ ls -la /usr/local/etc/my.cnf
ls: /etc/my.cnf: No such file or directory

$ ls -la /usr/local/etc/my.cnf
ls: /etc/mysql/my.cnf: No such file or directory

$ ls -la /usr/local/etc/my.cnf
-rw-r--r--@ 1 nakajitatsuya  admin  222  4 20 21:57 /usr/local/etc/my.cnf

/usr/local/etc/my.cnfが存在しているので、[mysqld]下に、
default_authentication_plugin = mysql_native_password
を加える


conf.d/my.conf

$ vi /usr/local/etc/my.cnf

[mysqld]
# 省略
default_authentication_plugin = mysql_native_password #<--追加


$ mysql.server restart

これで完了


はあ〜〜お疲れ様でした     



参考文献