“the user specified as a definer (‘mysql.infoschema’@’localhost’) does not exist” というエラーが出たときの対処

投稿者: | 2020年7月13日

現象

AWSのlightsailでcentosのサーバーを運用していたのですが、yum updateでmysqldなどをバージョンアップしたところ、「show databases」などを実行すると次のようなエラーが表示されるようになりました。

the user specified as a definer ('mysql.infoschema'@'localhost') does not exist

原因

rootユーザーでmysqlのコンソールに入り、下記のコマンドを実行しました。

select User, plugin, authentication_string from mysql.user where user like 'mysql.%';

その結果は次のようになりました。

+------------------+-----------------------+------------------------------------------------------------------------+
| User             | plugin                | authentication_string                                                  |
+------------------+-----------------------+------------------------------------------------------------------------+
| mysql.infoschema | mysql_native_password | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| mysql.session    | mysql_native_password | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| mysql.sys        | caching_sha2_password | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
+------------------+-----------------------+------------------------------------------------------------------------+

authentication_stringにはパスワードのハッシュが保存されるようですが、どうも「$A$005・・・」という形式はcaching_sha2_password_sha2_passwordを使った暗号化をした際に発生するようです。
つまり、mysql_native_passwordなのにこの形式になっているmysql.infoschemaとmysql.sessionはおかしいことになります。

解決

ちょっと強引な気もしますが、下記のSQLを実行し、パスワードの暗号化方式とハッシュの形式が一致するようにしました。

update mysql.user set plugin = 'caching_sha2_password' where User = 'mysql.infoschema'
update mysql.user set plugin = 'caching_sha2_password' where User = 'mysql.session'

その後、もう一度前述のSQLでmysql.userの内容を確認します。下記のような内容になっているはずです。

+------------------+-----------------------+------------------------------------------------------------------------+
| User             | plugin                | authentication_string                                                  |
+------------------+-----------------------+------------------------------------------------------------------------+
| mysql.infoschema | caching_sha2_password | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| mysql.session    | caching_sha2_password | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| mysql.sys        | caching_sha2_password | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
+------------------+-----------------------+------------------------------------------------------------------------+

この後、mysqldを再起動したところ、show databaseも問題なく実行されるようになりました。
MySQL8になってからパスワードの暗号化の方式が増えたようなので、この辺り注意しないといけないですね。