rootユーザーのパスワード忘れなどが原因で、mysqlにログインできなくなってしまったときの対処方法です。
目次
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>