MySQLの認証プラグインを変更する方法(caching_sha2_password)

## はじめに
MySQLに接続できないエラーでハマったので対処法を備忘録としてまとめました。

## エラー内容
```
Plugin caching_sha2_password could not be loaded: /usr//usr/lib/x86_64-linux-gnu/mariadb19/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory
```

認証プラグインがcaching_sha2_passwordとなっていることが原因だそうです。
そこで、まずはMySQLに接続して認証プラグインを確認します。

```:ターミナル 
$ mysql -u root   //mysqlにrootで接続。rootにパスワードを設定している場合はオプションでパスワードを指定する

mysql> SELECT User, Host, Plugin FROM mysql.user;  //User, Host, Pluginを確認
+------------------+-----------+-----------------------+
| User             | Host      | Plugin                |
+------------------+-----------+-----------------------+
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
```
rootの認証プラグインがcaching_sha2_passwordになっています。


## 対策(caching_sha2_passwordをmysql_native_passwordに変更)
認証プラグインをcaching_sha2_passwordからmysql_native_passwordに変更します。
下記が変更するためのコマンドです。

```:ターミナル
mysql> ALTER USER <User>@<Host> IDENTIFIED WITH mysql_native_password BY '<password>';
```

User, Host, passwordの部分は置き換えてください。

私の場合はrootを変更したいので下記のようにしました。

```:ターミナル
mysql> ALTER USER root@localhost IDENTIFIED WITH mysql_native_password BY 'password';
```

変更できているか確認する

```:ターミナル
mysql> SELECT User, Host, Plugin FROM mysql.user;  //User, Host, Pluginを確認
+------------------+-----------+-----------------------+
| User             | Host      | Plugin                |
+------------------+-----------+-----------------------+
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | mysql_native_password |  <= 変更されている!
+------------------+-----------+-----------------------+
```


## Dockerの場合
Dockerのコンテナ内で認証プラグインを変更する場合にはまずコンテナに入る必要があります。


```:ターミナル
$ docker ps       //DockerのCONTAINER IDを確認
$ docker exec -it <CONTAINER ID> bash     //確認したMySQLのCONTAINER IDを指定してコンテナに接続
# mysql -u root -p
Enter password: <database.ymlで設定したpassword>

mysql> SELECT User, Host, Plugin  FROM mysql.user;  //User, Host, Pluginを確認
+------------------+-----------+-----------------------+
| User             | Host      | Plugin                |
+------------------+-----------+-----------------------+
| root             | %         | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+

mysql> ALTER USER <User>@<Host> IDENTIFIED WITH mysql_native_password BY '<password>' //rootの認証プラグインを変更
```

変更されているか確認↓

```:ターミナル
mysql> SELECT User, Host, Plugin  FROM mysql.user;  //User, Host, Pluginを確認
+------------------+-----------+-----------------------+
| User             | Host      | Plugin                |
+------------------+-----------+-----------------------+
| root             | %         | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | mysql_native_password |  <= 変更されている!
+------------------+-----------+-----------------------+
```

コンテナを削除して、再度Buildすれば完了です。

```:ターミナル
$ docker-compose down
$ docker-compose build
```

## 終わりに
RailsとMySQLを使用しているとたまーにハマって抜け出せなくなるので、私みたいに時間を無駄にしてほしくないという思いも込めてまとめてみました。
みなさんの一助となれば幸いです。