[MySQL]rootでログインできない場合の対処法

MySQL

自サーバーに設置してあるMySQLに久々に接続を試みたところ、

[username ~]$ mysql -u root -p
Enter password: 
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

こんな感じで接続できなくなっていた。
パスワードを忘れた場合も含み、rootユーザーで接続できない場合の復旧方法を残しておく。

スポンサーリンク

セーフモードで起動する

まずは起動中のMySQLを停止する。

[username ~]$ su #ルートユーザーに変更(sudoでやっても良い)
Password: 
[root]$ service mysqld stop #serviceコマンドでmysqldを停止
Stopping mysqld:                                           [  OK  ]

停止後、セーフモードでMySQLサーバーを起動する。

[root]$ mysqld_safe --skip-grant-tables #&を付ければバックグラウンドで起動
2017-12-10T18:34:15.411258Z mysqld_safe Logging to '/var/log/mysqld.log'.
2017-12-10T18:34:15.413688Z mysqld_safe Logging to '/var/log/mysqld.log'.
2017-12-10T18:34:15.433956Z mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
スポンサーリンク

rootユーザーでMySQLにログイン

[root]$ mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.17 MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
スポンサーリンク

rootユーザーのpasswordを変更する

ログインできたら、mysqlデータベースを指定する。

mysql> use mysql;

ここで注意が必要なのが、調べたところmysql.userテーブルのpasswordをupdateして変更する方法が書かれていたが、我々が使っているMySQLのversion5.7.17では以下の通りpasswordカラムが存在しない。

mysql> desc user;
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Field                  | Type                              | Null | Key | Default               | Extra |
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Host                   | char(60)                          | NO   | PRI |                       |       |
| User                   | char(32)                          | NO   | PRI |                       |       |
| Select_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Insert_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Update_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Delete_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Create_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Drop_priv              | enum('N','Y')                     | NO   |     | N                     |       |
| Reload_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Shutdown_priv          | enum('N','Y')                     | NO   |     | N                     |       |
| Process_priv           | enum('N','Y')                     | NO   |     | N                     |       |
| File_priv              | enum('N','Y')                     | NO   |     | N                     |       |
| Grant_priv             | enum('N','Y')                     | NO   |     | N                     |       |
| References_priv        | enum('N','Y')                     | NO   |     | N                     |       |
| Index_priv             | enum('N','Y')                     | NO   |     | N                     |       |
| Alter_priv             | enum('N','Y')                     | NO   |     | N                     |       |
| Show_db_priv           | enum('N','Y')                     | NO   |     | N                     |       |
| Super_priv             | enum('N','Y')                     | NO   |     | N                     |       |
| Create_tmp_table_priv  | enum('N','Y')                     | NO   |     | N                     |       |
| Lock_tables_priv       | enum('N','Y')                     | NO   |     | N                     |       |
| Execute_priv           | enum('N','Y')                     | NO   |     | N                     |       |
| Repl_slave_priv        | enum('N','Y')                     | NO   |     | N                     |       |
| Repl_client_priv       | enum('N','Y')                     | NO   |     | N                     |       |
| Create_view_priv       | enum('N','Y')                     | NO   |     | N                     |       |
| Show_view_priv         | enum('N','Y')                     | NO   |     | N                     |       |
| Create_routine_priv    | enum('N','Y')                     | NO   |     | N                     |       |
| Alter_routine_priv     | enum('N','Y')                     | NO   |     | N                     |       |
| Create_user_priv       | enum('N','Y')                     | NO   |     | N                     |       |
| Event_priv             | enum('N','Y')                     | NO   |     | N                     |       |
| Trigger_priv           | enum('N','Y')                     | NO   |     | N                     |       |
| Create_tablespace_priv | enum('N','Y')                     | NO   |     | N                     |       |
| ssl_type               | enum('','ANY','X509','SPECIFIED') | NO   |     |                       |       |
| ssl_cipher             | blob                              | NO   |     | NULL                  |       |
| x509_issuer            | blob                              | NO   |     | NULL                  |       |
| x509_subject           | blob                              | NO   |     | NULL                  |       |
| max_questions          | int(11) unsigned                  | NO   |     | 0                     |       |
| max_updates            | int(11) unsigned                  | NO   |     | 0                     |       |
| max_connections        | int(11) unsigned                  | NO   |     | 0                     |       |
| max_user_connections   | int(11) unsigned                  | NO   |     | 0                     |       |
| plugin                 | char(64)                          | NO   |     | mysql_native_password |       |
| authentication_string  | text                              | YES  |     | NULL                  |       |
| password_expired       | enum('N','Y')                     | NO   |     | N                     |       |
| password_last_changed  | timestamp                         | YES  |     | NULL                  |       |
| password_lifetime      | smallint(5) unsigned              | YES  |     | NULL                  |       |
| account_locked         | enum('N','Y')                     | NO   |     | N                     |       |
+------------------------+-----------------------------------+------+-----+-----------------------+-------+

どうやら、以前のversionではpasswordだったカラムが、最近のversionではauthentication_stringに変更されているようだ。
なのでrootユーザーのauthentication_stringカラムをupdate文で変更しよう。

mysql> update user set authentication_string=PASSWORD('{password}') where User='root';
Query OK, 1 row affected, 1 warning (0.06 sec)
Rows matched: 1  Changed: 1  Warnings: 1

passwordの変更が完了したら、exitでMySQLサーバーから抜ける。

スポンサーリンク

MySQLサーバーを通常モードで起動

先ほどセーフモードで起動したMySQLサーバーを停止し、通常モードで起動する。

[root]$ service mysqld stop
Stopping mysqld:                                           [  OK  ]
[root]$ service mysqld status
mysqld is stopped
[root]$ service mysqld start
Starting mysqld:                                           [  OK  ]
スポンサーリンク

設定したパスワードで接続できるかを確認

[root]$ mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.17 MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

無事接続出来たら、作業完了。

コメント

  1. […] / リセット方法 [MySQL]rootでログインできない場合の対処法 […]

タイトルとURLをコピーしました