現象
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になってからパスワードの暗号化の方式が増えたようなので、この辺り注意しないといけないですね。