MySQL 5.7にアップグレード時にログインできない

MySQL 5.6から5.7にアップグレードしてデータベースユーザがmysqlにログインできなくなった場合の対処法メモ。

不具合内容

MySQL 5.6から5.7にアップグレードし、次のようにデータベース内容のアップグレードを実行後、データベースユーザがmysqlにログインできなくなった。

> sudo mysql_upgrade

rootでログインしてユーザのパスワードを変更しようとするとエラーが出て変更できない。

> mysql -u root -p
Enter password:
...(略)...
mysql> set password for 'dbuser'@'localhost' = password('newpassword');
ERROR 1524 (HY000): Plugin '*0D4FDCB1DADF84AEBCD41039C4B96A6CE0BAAE2F' is not loaded
mysql>

mysql.userテーブルのpluginフィールドを表示すると、おかしな値が入っている。

mysql> select user,host,plugin from mysql.user;
+-----------+-----------------+-------------------------------------------+
| user      | host            | plugin                                    |
+-----------+-----------------+-------------------------------------------+
| root      | localhost       | mysql_native_password                     |
| root      | hostname.net    | mysql_native_password                     |
| root      | 127.0.0.1       | mysql_native_password                     |
| root      | ::1             | mysql_native_password                     |
| dbuser    | localhost       | *0D4FDCB1DADF84AEBCD41039C4B96A6CE0BAAE2F |
| mysql.sys | localhost       | mysql_native_password                     |
+-----------+-----------------+-------------------------------------------+
6 rows in set (0.00 sec)
mysql>

自分にとっては不具合だけど、たぶんMySQLの仕様。かな?

対処法

mysqlにrootでログインし、pluginを変更してパスワード再設定する。

  1. mysqlにrootでログイン。
    > mysql -u root -p
    Enter password:
    ...(略)...
    mysql>
  2. mysql.userのpluginフィールドを ‘mysql_native_password’ に変更。
    mysql> use mysql;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Database changed
    mysql> update mysql.user set plugin='mysql_native_password' where user='yuka';
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1 Changed: 1 Warnings: 0
    
    mysql> flush privileges;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql>
  3. パスワードを再設定。
    mysql> set password for 'dbuser'@'localhost' = password('新しいパスワード');
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    
    mysql> quit
    Bye
    >
  4. mysqlにログインできることを確認。
    > mysql -u dbuser -p
    Enter password:
    mysql> 
タイトルとURLをコピーしました