MySQLでrootのパスワードを忘れたりログインできなくなった場合の対処方法
はじめに
MySQLのrootのパスワードを忘れてしまいrootでログインできなくなってしまいましたが、rootのパスワードを再設定することができたのでその手順をまとめます。
状況について
どのような状況だったかというと、以下のようにrootでMySQLにログインしようと色々と試しましたがいずれも同じエラーERROR 1045 (28000): Access denied for user 'root'@'localhost'
がでました。
$ mysql -u root -p
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
$ sudo mysql -u root
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
$ sudo mysql
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
このエラーはrootのパスワードが間違っていることが原因ですが、そもそもrootのパスワードを設定しなかったり、rootでのパスワードによるログインを許可していない場合にも発生します。これらはそれぞれの状況によって異なります。
特にMySQL 5.7以降では、MySQLのrootユーザでのログインはパスワードを使用できないようになっており、システムのrootユーザでログインするのがデフォルトになっています。これについてはMySQLにパスワードでログインできるように設定変更するにまとめているので、もし新しくMySQL 5.7以降をインストールしたばかりで上記のエラーがでているような場合は見てみてください。
今回私が使用していたMySQLも5.7ですが、元々はMySQL5.6を使用していてアップデートして5.7になっていました。
前提と環境
以下の環境です。
- OS : Ubuntu 18.04
- MySQL 5.7
以降の作業を行う前に、rootユーザ以外のMySQLユーザ等でできる限りMySQLのバックアップを取っておくことをお勧めします。
rootのパスワードをリセットする手順
まず、MySQLを停止します。
$ sudo service mysql stop
systemctl
を使って停止してもOKです。
MySQLを停止後、以下のコマンドでMySQLをセーフモードで起動します。
$ sudo mysqld_safe --skip-grant-tables &
セーフモードで起動して--skip-grant-tables
オプションを使うと、どのユーザーでもパスワードなしで接続できるようになり、すべての権限が付与されます。したがって以降の作業が完了したた確実にセーフモードで起動されているMySQLを停止するよう注意してください。これについてはMySQL 5.6の公式ドキュメントですがroot のパスワードをリセットする方法の「root のパスワードのリセット: 一般的な手順」に記載されています。
もし上記のコマンドで以下のようなエラーが出た場合は、これ以降の作業を進める前に後述する方法で対応が必要です。
$ sudo mysqld_safe --skip-grant-tables &
[1] 14626
2020-01-19T16:11:58.128822Z mysqld_safe Logging to syslog.
2020-01-19T16:11:58.133871Z mysqld_safe Logging to '/var/log/mysql/error.log'.
2020-01-19T16:11:58.139690Z mysqld_safe Directory '/var/run/mysqld' for UNIX socket file don't exists.
上記でMySQLをセーフモードで起動後、以下のようにrootユーザでMySQLにログインします。
$ mysql -u root
ログイン後、以下を実行します。
mysql< use mysql;
mysql< update user set authentication_string=PASSWORD("yourrootpassword") where User='root';
上記ではユーザー情報などを含むmysql
データベースに切り替えて、rootユーザ用のパスワードを再設定しています。yourrootpassword
を各自のrootに設定したいパスワードに置き換えてください。
パスワードの再設定が完了したらMySQLからログアウトします。
mysql< exit
MySQLからログアウト後、セーフモードで起動しているMySQLのプロセスを全て停止します。そのためにMySQLのプロセスを確認して、プロセスIDをkillします。
$ ps aux | grep mysql
$ sudo kill -9 15577 # mysqlのプロセスID
MySQLを起動します。
$ sudo serivce mysql start
先程設定したrootのパスワードを使って以下でMySQLにログインできれば完了です。
$ mysql -u root -p
MySQLをセーフモードで起動時にエラーがでる場合
私の環境ではMySQLをセーフモードで起動した時に以下のようなエラーが出ました。
$ $ sudo mysqld_safe --skip-grant-tables &
[1] 14626
2020-01-19T16:11:58.128822Z mysqld_safe Logging to syslog.
2020-01-19T16:11:58.133871Z mysqld_safe Logging to '/var/log/mysql/error.log'.
2020-01-19T16:11:58.139690Z mysqld_safe Directory '/var/run/mysqld' for UNIX socket file don't exists.
これはエラーメッセージに書いてある通り、/var/run/mysqld
というディレクトリがないことが原因です。よってMySQLがアクセスできる形で/var/run/mysqld
を作成してあげます。
$ sudo mkdir /var/run/mysqld/
$ sudo chown mysql:mysql /var/run/mysqld/
上記で完了です。再度MySQLをセーフモードで起動してみると起動できると思います。
sudo mysqld_safe --skip-grant-tables &
まとめ
MySQLのrootのパスワードを忘れてしまった場合の対処方法をまとめました。各自の状況によってうまく行かない可能性もありますがわずかでも参考になれば幸いです。
関連記事
- 公開日:2019/09/09 更新日:2019/09/09
CSVファイルをMySQLにインポートするSQL文
CSVファイルをMySQLにインポートするSQL文をよく使うのでこのSQL文についてメモします。
- 公開日:2019/05/27 更新日:2019/05/27
Ubuntu18.04にMySQLをインストールする手順
UbuntuにMySQLサーバをインストールする機会が何かと多く、MySQL5.7以降で少々設定が変わっていたのでインストールと設定手順をまとめます。
- 公開日:2019/04/19 更新日:2019/04/19
MySQL Workbenchでエクスポート時にmysqldump Version Mismatchが出る場合の解決策
リモートサーバ上のMySQLデータベースの中身をちょっと確認したい時にMySQL Workbenchを使用しています。SSH経由での接続ももちろん可能で特に不満なく使えます。ただ、エクスポートする際に警告が表示されて解決に少しだけ時間かかってしまったので原因と解決手順をメモします。
- 公開日:2015/03/16 更新日:2015/03/16
Ruby on RailsでMySQLを使用する際に必要な作業手順
RailsではデータベースとしてSQLite3をデフォルトで使用しますが、SQLite3ではなくMySQLを使用したかったので、RailsでMySQLを使用するために行った作業をメモしておきます。