「WSL2でMySQLのrootパスワードを忘れてしまった…」
「何度もリセットを試みたけれど、なぜかうまくいかない…」
そんな悩みを抱えていませんか? 本記事は、システムエンジニアとして20年以上、IT技術講師として10年以上の経験を持つ私が、この問題を確実に解決するための具体的な手順を、実践例を交えて解説します。
本記事を読めば、WSL2上のMySQL 8.0でパスワードリセットがなぜ複雑なのかを理解し、正しい手順を確実に実行できるようになります。エラーメッセージに悩まされることなく、わずか数分でパスワードを再設定し、MySQLを再び使える状態に戻すことができます。
この解説を最後まで読めば、あなたのMySQL環境は再び正常に機能し、開発作業をスムーズに進められるようになります。
目次
- WSL2上のMySQLパスワードリセットが難しい理由
- 【前提知識】パスワードリセットに必須の2つのコマンド
- 【実践】MySQL 8.0のパスワードリセット5ステップ
- パスワードポリシーの注意点と対策
- まとめ:エラーに負けないための鍵は「正しい手順」
WSL2上のMySQLパスワードリセットが難しい理由
WSL2(Ubuntu)にインストールしたMySQL 8.0のパスワードリセットがうまくいかないのには、いくつかの理由があります。
最大の原因は、MySQL 8.0から導入された新しい認証プラグイン(caching_sha2_password
)と、セキュリティポリシーの強化です。これにより、以前のバージョンで使えた簡単なパスワードリセット方法が通用しなくなりました。
また、sudo mysql -u rootコマンドが失敗するのは、OSのrootユーザーとMySQLのrootユーザーが別物であり、両者の認証が連携していないためです。
本記事では、この課題をクリアするために、MySQLを一時的に認証をスキップした状態で起動し、その隙にパスワードをリセットするというアプローチを取ります。
【前提知識】パスワードリセットに必須の2つのコマンド
本題に入る前に、パスワードリセットで頻出する2つの重要コマンドを理解しておきましょう。
1. sudo mysqld_safe --skip-grant-tables &
このコマンドは、MySQLをパスワード認証をスキップした状態(セーフモード)で起動します。これにより、パスワードなしでMySQLにログインできるようになります。
ただし、この状態では一部のコマンド(特にALTER USER
)がセキュリティ上の理由で実行できません。
2. ALTER USER 'root'@'localhost' IDENTIFIED BY '新しいパスワード';
こちらは、MySQL 8.0以降で推奨されるパスワード変更コマンドです。パスワードをハッシュ化して安全に更新します。
ただし、このコマンドは通常モードで起動している時のみ実行可能です。セーフモードでは使えません。
つまり、私たちのタスクは、パスワードなしでログインできるセーフモードの間に、パスワードをリセットできる通常モードの状態を作り出すこと、にあります。
【実践】MySQL 8.0のパスワードリセット5ステップ
それでは、実際にパスワードをリセットする手順を見ていきましょう。
ステップ1:MySQLサービスの停止
まず、現在実行中のMySQLサービスを停止します。
sudo systemctl stop mysql
ステップ2:セーフモードでMySQLを起動
認証をスキップした状態でMySQLを起動します。これにより、パスワードなしでMySQLにアクセスできるようになります。
sudo mysqld_safe --skip-grant-tables &
※もし Directory '/var/run/mysqld' for UNIX socket file don't exists. というエラーが出た場合、以下のコマンドでディレクトリを作成してから再試行してください。
sudo mkdir -p /var/run/mysqld && sudo chown mysql:mysql /var/run/mysqld
ステップ3:パスワードを空にする
セーフモードでログインし、UPDATEステートメントを使ってパスワードを一時的に空にします。
sudo mysql -u root
MySQLシェルに入ったら、以下のコマンドを実行します。
UPDATE mysql.user SET authentication_string = '', plugin = 'mysql_native_password' WHERE user = 'root' AND host = 'localhost';
FLUSH PRIVILEGES;
FLUSH PRIVILEGES;
は変更を即座に反映させるために非常に重要です。
コマンド実行後、exitでMySQLシェルを終了します。
exit
ステップ4:MySQLを再起動
セーフモードのプロセスを強制終了し、MySQLサービスを通常通りに再起動します。
sudo pkill mysqld
sudo systemctl start mysql
ステップ5:新しいパスワードを設定する
ここで、先ほど空にしたパスワードでsudo mysql -u rootコマンドが通るはずです。パスワードなしでログインし、ALTER USERコマンドで新しいパスワードを設定します。
sudo mysql -u root
MySQLシェルに入ったら、以下のコマンドでパスワードを更新します。
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新しいパスワード';
FLUSH PRIVILEGES;
ヒント:'新しいパスワード'
には、複雑なパスワードを設定してください。
最後にexitでシェルを終了します。
exit
これで、mysql -u root -p
コマンドで新しいパスワードを入力してログインできるはずです。
パスワードポリシーの注意点と対策
MySQL 8.0では、デフォルトでvalidate_passwordというパスワードポリシーが有効になっています。これにより、パスワードには以下のような強い制約が課せられます。
- パスワード長が8文字以上であること
- 大文字、小文字、数字、特殊文字をそれぞれ1文字以上含んでいること
- ユーザー名と同じ文字列を含んでいないこと
もし上記ポリシーを一時的に緩和したい場合は、my.cnfファイルでvalidate_passwordの設定を変更することができますが、セキュリティリスクが増加するため、推奨はしません。
今回の手順で設定するパスワードは、このポリシーを満たすものにしてください。
まとめ:エラーに負けないための鍵は「正しい手順」
WSL2上でのMySQL 8.0 ROOTパスワードリセットは、古いバージョンの知識だけでは解決できない場合があります。しかし、この記事で解説した「セーフモードでパスワードを空にし、通常モードでALTER USERコマンドを使う」という手順を正しく踏めば、どんなエラーも乗り越えられます。
エラーメッセージの意図を理解し、正しいコマンドを選択する。このスキルこそが、複雑な技術課題を解決するための鍵となります。
本記事が、あなたの開発環境をスムーズに戻す一助となれば幸いです。
ITエンジニアのための情報発信!
IT業界、キャリア、そして日々の技術的な課題解決に関する情報を発信しています。
この記事が役に立ったと感じたら、ぜひブックマークやSNSでシェアしてください!
また、WSL2やMySQLに関してさらに詳しく知りたいことがあれば、コメント欄からお気軽にご質問ください。
【関連記事】
WSL2の基本設定とトラブルシューティング
MySQLのセキュリティを強化するベストプラクティス
/* コマンドメモ */
mysql --version
ps aux | grep mysqld
sudo systemctl stop mysql
sudo mkdir -p /var/run/mysqld && sudo chown mysql:mysql /var/run/mysqld
sudo mysqld_safe --skip-grant-tables &
ps aux | grep mysqld
sudo mysql -u root
---
UPDATE mysql.user
SET authentication_string = '' , plugin = 'mysql_native_password' WHERE user = 'root' AND host = 'localhost';
exit
---
sudo killall -9 mysqld_safe mysqld
ps aux | grep mysqld
/*error*/sudo mysql -u root
sudo systemctl start mysql
sudo mysql -u root
---
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Xxxx@x9xx';
FLUSH PRIVILEGES;
exit
---