MySQL8.0.4以降 のログイン認証方式は caching_sha2_password がデフォルト
mysql_native_password 認証プラグインと比較して、安全なパスワードの暗号化、キャッシュを用いた認証処理の パフォーマンスの向上(今回は検証していませんが。)等のメリットが多いものの、コネクタが対応していない等の理由から mysql_native_password が使用される事も、まだあるかと思います。
MySQL 8.0では上記構文が使えないようです。代わりにALTER USER構文を使います。ROLEの機能が入ったせい? ALTER USER 'root'@'localhost' IDENTIFIED BY 'password';
SHOW VARIABLES LIKE 'validate_password%'; で現在のパスワード検証状態を確認します。MySQL8.0の場合下記のように表示されます。MySQL5.7とMySQL8.0は形式が違いますので要注意です。MySQL5.7は`_`(アンダーバー)で区切られていてMySQL8.0は`.`で区切られています。
$ /usr/local/etc/my.cnf [mysqld] SET GLOBAL validate_password.length=4; SET GLOBAL validate_password.policy=LOW;
MySQL8.0の場合:デフォルトのままでOK (∵MySQL8.0のデフォルト文字コードはutf8mb4のため)
すでにDBとテーブルが存在する場合はもう一手間必要です。
MySQL8.0から上記の方法ではユーザーが作成できなくなりました。どうするのかというと、 CREATE USER ‘ユーザー名’ IDENTIFIED BY ‘パスワード’;でユーザーを作成 GRANT 権限 ON データベース名.テーブル名 TO ‘ユーザー名’;で権限を付与 の2段階で行えば良いのです。
原因:MySQL8.0ではGRANT構文でユーザを作成できない
CREATE USER 'foo'@'localhost' IDENTIFIED WITH mysql_native_password BY 'xxx'; GRANT ALL PRIVILEGES ON `bar`.* TO `foo`@`localhost`;
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/opt/openssl/lib/
bundle config --local build.mysql2 "--with-cppflags=-I/usr/local/opt/openssl/include"
8.x:「jdbc:mysql://localhost:3306/testdb?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B9:00&rewriteBatchedStatements=true」
JDBCドライバのプロパティ「allowPublicKeyRetrieval」をtrue、「useSSL」をfalseにする
通信は従来の MySQL Protocol と異なり、Protocol Buffers Based となっていて、各言語のドライバの実装が簡単になっている