久しぶりにあるサーバーの MySQL を操作しようとしたところ、root パスワードを忘れてしまいログインできなくなってしまった。
$ mysql -u root -p
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
実は以前にもパスワードを忘れた事がある。八年ぶり二度目らしい。
MySQL の root パスワードをリセットした。 | Lonely Mobilerこの記事にもある通り MySQL ではそのような場合に備え、root パスワードを再設定する方法が用意されている。しかし、以前の記事はかなり古いので新しい方法をメモしておこう。
MySQL の root パスワードを再設定する方法
今回は Ubuntu 18.04 + MySQL 5.7.29 で作業する。OS によるコマンドの差異や設定ファイルのパスなどは都度読み替えてほしい。
MySQL 5.7 では設定ファイルより skip-grant-tables を有効にすることで権限を無視して MySQL へログインできるようだ。mysqld.cnf を編集しよう。
$ sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
# コメントアウトを外す
skip-grant-tables
編集したら MySQL を再起動
$ sudo service mysql restart
MySQL にパスワード無しで入れるはず。
$ mysql -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 38517
Server version: 5.7.29-0ubuntu0.18.04.1 (Ubuntu)
mysql>
mysql テーブルに変更してパスワードを変更しよう。
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql>
mysql> update user set authentication_string=password('example') where user='root';
Query OK, 0 rows affected, 1 warning (0.02 sec)
Rows matched: 1 Changed: 0 Warnings: 1
mysql> flush privileges;
Query OK, 0 rows affected (0.20 sec)
これで新しいパスワードになった。
ここまでできたら再度 mysqld.cnf を編集して skip-grant-tables をコメントアウトし、 mysqld を再起動しよう。
$ sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
# コメントアウトする
#skip-grant-tables
$ sudo service mysql restart
これで再設定したパスワードでログインできるはずだ。