MySQL Version 8.0.11でrootのパスワードを変更する。

mysqlのrootのパスワードを忘れてしまい、リセット時にはまったので書いておきます。

 

前提

  • macOS High Sierra
  • mysql version 8.0.11(Homebrewで入れました)

 

目次

パスワードのリセット方法

  1. mysqlを停止する
  2. mysqlの自動起動停止
  3. 権限テーブルを読まないでmysqlを起動
  4. mysqlにログインします
  5. mysql_upgradeを実行する
  6. rootのパスワード変更
  7. mysql起動
  8. 自動起動を設定

 

今日mysqlを久々に触っていたらこんな警告が出た。

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

パスワードを求められているらしいけど、完全に忘れてしまった、、。

ということで、ググりながらパスワードのリセットしてみた。

 

パスワードのリセット方法

 

1.mysqlを停止する。

$ mysql.server stop

 

2.mysqlの自動起動停止
$ brew services listでhomebrewで自動起動を設定しているサービスを確認できます。

$ brew services list
Name         Status  User Plist
chromedriver stopped      
mysql        stopped      
php          stopped      

$ brew services stopで、mysqlの自動起動停止を無効にする。

$ brew services stop mysql
==> Successfully stopped `mysql`

 

3.権限テーブルを読まないでmysqlを起動。

$ mysql.server start --skip-grant-tables
Starting MySQL
.. SUCCESS! 

 

–skip-grant-tablesオプションとは?

This option causes the server to start without using the privilege system at all, which gives anyone with access to the server unrestricted access to all databases. You can cause a running server to start using the grant tables again by executing mysqladmin flush-privileges or mysqladmin reload command from a system shell, or by issuing a MySQL FLUSH PRIVILEGES statement after connecting to the server.

とあるので、ざっくり言うと権限システムを使わないでログインできるモードですね。全てのデータベースに全てのアクセス権がある状態です。

https://dev.mysql.com/doc/refman/8.0/en/server-options.html#option_mysqld_skip-grant-tables

 

4.mysqlにログインします。

$ mysql

 

5.mysql_upgradeを実行する。

パスワードをセットするコマンドは、$ ALTER USER 'root'@'localhost' IDENTIFIED BY 'New Password';なのですが、自分の場合は、ERROR 1146 (42S02): Table 'mysql.role_edges' doesn't existと怒られてしまいました。

 

versionが8系になってから?権限システムがかなり変わったらしく、それでこのTableがないのかな?と当たりをつけてググっていた所mysqlのアップデートに関する記事を発見。

 

mysql_upgrade とは?
MySQLのリファレンスに以下のようなページがありました。

MySQL のアップグレードでは、その度に、mysql_upgrade を実行します。これにより、データベース内のテーブルにおける最新の MySQL Server との互換性をチェックすることができます。該当テーブルが非互換の場合は、チェックの対象になり、問題があれば、そのテーブルを修正します。mysql_upgrade コマンドは、システム テーブルのアップグレードも行うため、新たな権限と追加機能を使用できるようになります。

MySQLをアップグレードしたら、mysql_upgradeをしてね。だそうです。知らんかった。

mysql_upgrade を実行する | firegoby.jp

 

ということで、

$ mysql_upgrade -u root -p
Enter password: (パスワード入力)
Checking if update is needed.
Checking server version.
Running queries to upgrade MySQL server.
Upgrading system table data.
Checking system database.
略、、、

を実行。

 

6.rootのパスワード変更

$ mysql.server stop
$ mysql.server start --skip-grant-tables
$ mysql
//パスワード変更
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'New Password';

#パスワードなしは、IDENTIFIED BY ‘New Password’を空にする。(IDENTIFIED BY ”;)

 

7.mysql起動

$ mysql.server stop
$ mysql.server start
$ mysql -u root -p

で、mysql起動+新しいパスワードでログイン

#パスワードなしログイン $ mysql -u root

 

8. 自動起動を設定

$ brew services start mysql
==> Successfully started `mysql` (label: homebrew.mxcl.mysql)

 

 

まとめ

パスワードのリセット方法

  1. mysqlを停止する
  2. mysqlの自動起動停止
  3. 権限テーブルを読まないでmysqlを起動
  4. mysqlにログインします
  5. mysql_upgradeを実行する
  6. rootのパスワード変更
  7. mysql起動
  8. 自動起動を設定