ログインできない場合(rootユーザーのパスワード忘れ)

rootユーザーのパスワード忘れなどが原因で、以下のようにMySQLにログインできなくなってしまったときの対処方法です。

$ mysql -uroot -p
Enter password: 
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

mysqldを停止

CentOS6で mysqld を停止するには以下のようにします。

$ sudo service mysqld stop
Stopping mysqld:                                           [  OK  ]

CentOS7以上であれば、以下のようになります。

sudo systemctl stop mysqld.service

セーフモードでMySQLを起動

mysqld_safe 経由で mysqld を起動させます。

$ sudo mysqld_safe --skip-grant-tables &
[1] 5833
2018-12-08T06:45:53.581448Z mysqld_safe Logging to '/var/log/mysqld.log'.
2018-12-08T06:45:53.619291Z mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql

--skip-grant-tablesオプション をつけることで認証処理がスキップされるようになります。
つまり、パスワードなしでログインできるようになります。

& をつけているのでバックグラウンドでプロセスが起動します。

参考)
https://dev.mysql.com/doc/refman/5.6/ja/mysqld-safe.html

パスワード書き換え

MySQLにログイン

ユーザー名 パスワード なしでログインできます。

$ mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.24 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, 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>

DB変更

mysql> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

ユーザー情報確認

mysql> SELECT user, host, authentication_string FROM user;
+---------------+-----------+-------------------------------------------+
| user          | host      | authentication_string                     |
+---------------+-----------+-------------------------------------------+
| root          | localhost | *XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX |
| mysql.session | localhost | *XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX |
| mysql.sys     | localhost | *XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX |
+---------------+-----------+-------------------------------------------+
3 rows in set (0.00 sec)

rootユーザのパスワード更新

mysql> UPDATE `user` SET `authentication_string` = PASSWORD('new_password') WHERE `user` = 'root';
Query OK, 1 rows affected, 1 warning (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 1


mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql>
mysql> quit
Bye
MySQL5.6以下の場合
authentication_string ではなく、 password になります。

UPDATE `user` SET `password` = PASSWORD('new_password') WHERE `user` = 'root';

通常モードでMySQLを起動

通常モードで mysqld を起動させます。

$ sudo service mysqld restart
2018-12-08T06:49:21.884937Z mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
Stopping mysqld:                                           [  OK  ]
Starting mysqld:                                           [  OK  ]
[1]+  Done                    sudo mysqld_safe --skip-grant-tables

この時、セーフモードで起動させていたプロセスは停止されます。

rootユーザーでログイン

書き換えたパスワードでログインできました。

$ mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 5.7.24 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, 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>