MySQLでrootのパスワード忘れたという話は結構あると思いますが、自分の場合、パスワード忘れたわけでもないのにログインできなくなってハマったという話です。一言で結論を言うと、認証のplugin欄がなぜかrootだけ空になってました。なんでや。rootパスワード再設定してもログインできない人はpluginのカラムを見てみましょう。
それだけではなんなので。
rootパスワードがわからなくなった場合のよくある対処法は、セーフモードで起動してmysql.userテーブルのpassword(場合によってはauthentication_string)を手動でUPDATEするという感じです。うちはDebian(stretch)なので多少よそとコマンドが違うかもしれないから、手順を備忘録として書き記しておきます。
具体的な手順
1.MySQLの停止
$ sudo service mysql stop
2.セーフモードでの起動
$ mysqld_safe --skip-grant-tables &
&
はバックグラウンドでプロセスを走らせておくと言う意味。--skip-grant-tables
で権限に関する動作を停止する。この間はMySQLでSHOW GRANT
などの権限関係のコマンドは実行できない。
ここで'/var/run/mysqld' for UNIX socket file don't exists.
というエラーが出るときは次の操作をしてから再度上を実行する。
$ sudo mkdir /var/run/mysqld
$ sudo chown mysql:mysql /var/run/mysqld
3.MySQLへログイン
$ mysql -u root
4.パスワードとpluginをUPDATE
USE mysql
UPDATE user SET authentication_string='パスワード' WHERE User='root';
UPDATE user SET plugin='mysql_native_password' WHERE User='root';
FLUSH PRIVILEGES;
2行目のauthentication_stringが古いバージョン(確かMySQL 5.7.5以前らしい)の場合はカラム名が違うので2行目はこちらを実行
UPDATE user SET password=password('パスワード') WHERE User='root';
5.確認してMySQLからログアウト
SELECT User, Host, plugin FROM user WHERE User='root';
これでplugin欄にmysql_native_password
になっていることを確認する。なお、認証Pluginは最新のものにcaching_sha2_password
があるが、これに対応していないソフトがある様子。PhpMyAdminとか。
確認して問題無かったらMySQLから出る。
quit
6.セーフモードのバックグラウンドプロセスを停止させる
このままMySQLを停止〜再起動させる手順もあるようだが、自分の環境ではセーフモードのバックグラウンンドプロセスが走ったままだったので、これを停止させてからでないと再起動しなかった。
$ sudo pkill -f mysql
7.MySQLを起動し、rootでログインできるかどうか試す
$ sudo service mysql start
$ mysql -u root -p
パスワードを入力
これでログインできたらOK。いやしかしなんで認証pluginが空欄になったのか全くわからない。CMS用に作ったユーザーとかは消えてないのに。
参考
大変参考になりました。多謝。
- Ubuntu 18.04 で MySQL 8 で root パスワードを忘れたときの再設定方法
[- How To Reset Your MySQL or MariaDB Root Password] (https://www.digitalocean.com/community/tutorials/how-to-reset-your-mysql-or-mariadb-root-password)
*こちらはMariaDBの場合やバージョン違いの場合も丁寧に書いています。