MySQL8でパスワードを変更しようとするとなぜかうまくできませんでした。
いろんな方法を試した結果ようやくできたので、MySQL8におけるユーザのパスワード変更及びパスワードリセットの方法を紹介します。
一度MySQLを停止する
mysql.server stop
セーフモードで起動する
mysqld_safe --skip-grant-tables &
パスワードなしでログインする
mysql -u root
一度パスワードなしに設定する
mysql> UPDATE mysql.user SET authentication_string=null WHERE User='root';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
EXIT
mysql > exit;
MySQLを再起動する
mysql.server restart
パスワードなしでログインする
mysql -u root -p
パスワードを変更する
mysql > USE mysql;
mysql > ALTER USER 'root'@'localhost' identified BY '(ここは新しいパスワード)';
もし、エラーメッセージが出たら、パスワード設定ルールを確認してください。
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
パスワード設定ルールの変更も可能
mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+--------+
| Variable_name | Value |
+--------------------------------------+--------+
| validate_password_check_user_name | OFF |
| validate_password_dictionary_file | |
| validate_password_length | 8 |
| validate_password_mixed_case_count | 1 |
| validate_password_number_count | 1 |
| validate_password_policy | MEDIUM |
| validate_password_special_char_count | 1 |
+--------------------------------------+--------+
7 rows in set (0.00 sec)
パスワードの設定ルールを変更しよう
mysql> set global validate_password_length=4;
Query OK, 0 rows affected (0.00 sec)
mysql> set global validate_password_policy=LOW;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------+-------+
| validate_password_check_user_name | OFF |
| validate_password_dictionary_file | |
| validate_password_length | 4 |
| validate_password_mixed_case_count | 1 |
| validate_password_number_count | 1 |
| validate_password_policy | LOW |
| validate_password_special_char_count | 1 |
+--------------------------------------+-------+
7 rows in set (0.01 sec)
注意点:
下記のコマンドは昔よく使っていましたが、MySQL5.7までしか使えません。エラーが発生する時、上記の方法を使ってみてください。
mysql > update mysql.user set password=password('password') where user = 'root