MySQLでrootのパスワードを忘れたりログインできなくなった場合の対処方法

公開日:2020/01/20 更新日:2020/01/20
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のパスワードを忘れてしまった場合の対処方法をまとめました。各自の状況によってうまく行かない可能性もありますがわずかでも参考になれば幸いです。

開発アプリ

nanolog.app

毎日の小さな出来事をなんでも記録して、ログとして残すためのライフログアプリです。