MySQL 8.0のパスワードとシステム変数

MySQL 8.0が正式リリースされたので、CentOS 7にインストールしてみました。その備忘録的なものです。

自分用の開発用インストールレシピをGithubにアップしていたりするのですが、いろいろ面倒なので、MySQL 5.6から強化されたパスワード関連の設定を最弱設定にしていたりします。（まぁ開発用なので別にいいかということで）
MySQL 5.7で更に強化されてしまったわけですが。

で、同じような設定をMySQL 8.0でも同じ設定をしてみたのですが、どうも反映されない。
どうも変数名自体が変わっていて、無駄な変数を設定しまったようです。

# パスワード関連のmy.cnfの設定

MySQL 5.7まではこんな感じにしてました。（パスワード設定の部分だけ抜粋）

```
[mysqld]
validate-password=FORCE_PLUS_PERMANENT
validate_password_length=4
validate_password_mixed_case_count=0
validate_password_number_count=0
validate_password_policy=0
validate_password_special_char_count=0
```

MySQL 8.0では上記が下記のようになるようです。

```
[mysqld]
validate_password.length=4
validate_password.mixed_case_count=0
validate_password.number_count=0
validate_password.policy=0
validate_password.special_char_count=0
```

変数の名前が変わっている。。。
これでちょっとハマりました。

# 実際どれ位の変数名が変わっているのか。

MySQL 8.0でテーブルキャッシュの実装がなくなったので、そのへんの変数は消えてるんだろうなとは思っていました。
気になって調べて見たんですが、量が多いので、ここへの記載は避けます。（途中で諦めました）

# パスワードからの変更方法が変わってる？

MySQLサーバーをインストール後、rootユーザーのパスワードを変更するんですが、MySQL 5.7までは以下の構文で出来たはず。。。

```mysql
SET PASSWORD FOR root@localhost=PASSWORD('password');
```

MySQL 8.0では上記構文が使えないようです。代わりにALTER USER構文を使います。ROLEの機能が入ったせい？

```mysql
ALTER USER 'root'@'localhost' IDENTIFIED BY 'password';
```

# こぼれ話

## MySQLのクリーンインストール。

変な手順でやったせいか、`ALTER USER`するときに`mysql.user`がないから無理とか怒られたので。一応以下でうまく行くっぽい。

1. `systemctl stop mysqld`
2. `rm -rf /var/lib/mysql/*`
3. `yum remove mysql-server`
4. `yum intall mysql-server`
5. `systemctl start mysqld`
6. `systemctl enable mysqld`

## PHPからアクセスできない

プログラム書くのがめんどくさいんで詳しくは調べてないんですが、これを書いている時点でphpMyAdminからアクセスすることは出来ませんでした。
現象的には以下のページのような感じなんですが。

- [Mysql. The server requested authentication method unknown to the client [caching_sha2_password] ](https://github.com/laradock/laradock/issues/1390)

この辺が解決策かなと思ったんですが。

- [phpMyAdmin on MySQL 8.0](https://stackoverflow.com/questions/49948350/phpmyadmin-on-mysql-8-0)

環境はNginx + PHP 7.2.5。
力尽きたので今回はここまで。

### 2019.05.08追記

どうもパスワード設定を旧設定にするためにプラグインを読み込まなければならないらしい。

```my.cnf
[webmaster@dev01 db]$ cat /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

character-set-server=utf8
skip-character-set-client-handshake

default_authentication_plugin = mysql_native_password # これが必要

validate_password.length=4
validate_password.mixed_case_count=0
validate_password.number_count=0
validate_password.policy=0
validate_password.special_char_count=0

[client]
default-character-set=utf8
```

で、MySQLにログインして、ALTER USERするときにプラグインを指定する。CREATE USERでも使えるオプションです。

```mysql
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

CREATE DATABASE `wordpress` CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
CREATE USER 'wordpress'@'%' IDENTIFIED WITH mysql_native_password BY 'wordpress';
GRANT ALL PRIVILEGES ON `wordpress`.* TO 'wordpress'@'%';
```

- [MySQL8.0にアップグレードしたらログインできなくなった時の解決法](https://e-joint.jp/556/)
- [mysql5.7 でユーザ追加の方法が変わったのでメモ](https://qiita.com/waterada/items/b06a32a2b3afd4aac901)

# 参考
- [MySQL 8.0登場！立ち止まることを知らない進化はこれからも続く。](http://nippondanji.blogspot.jp/2018/05/mysql-80.html)
- [5.1.7 Server System Variables (MySQL 8.0)](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html)