ITも大抵筋肉でなんとかなる

気が向いたら技術的なことも書くかもしれないですが、技術的なこと=ITとは限りません。

MySQLのテンポラリパスワードでログインできないときの対処法

環境

  • CentOS7
  • MySQL5.7

MySQLのテンポラリパスワードについて

MySQLは初回インストール後の起動時にrootユーザのテンポラリパスワードをログに吐くようになっている。これを使用することで本来ログインできる はず なのだが、何らかの理由でこれを使ってもログインできない場合があるよう。下記はその対処法となる。

MySQLのパスワードなしログインを有効にする

$ sudo vim /etc/my.cnf
  • /etc/my.cnf
    ※ …は省略を示す
…
[mysqld]
skip-grant-tables
…

上記の通り[mysqld]配下にskip-grant-tablesを追加。

$ sudo systemctl restart mysqld

MySQLを再起動しておく。

$ mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.23 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.

入れた。

パスワードの変更

構築した環境がローカルだったため安直なパスワードを使用。UPDATE user SET authentication_string=password('root') WHERE user='root';とすることでパスワードを「root」に変更。flush privilegesで反映。

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> UPDATE user SET authentication_string=password('root') WHERE user='root';
Query OK, 1 row 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> exit
Bye

MySQLのパスワードログインを無効にする

パスワードを設定したので設定を戻す。

$ sudo vim /etc/my.cnf
  • /etc/my.cnf
    ※ …は省略を示す
…
[mysqld]
# skip-grant-tables
…

上記の通りコメントアウトするか設定そのものを削除する。

$ sudo systemctl restart mysqld

MySQLを再起動しておく。

パスワードポリシー等の変更

MySQLはデフォルトでパスワードポリシーを持っているため、パスワード変更後にポリシーも変更する必要がある。これを実行しないと「root」でログインはできるがGRANTが使えないなど不都合が生じる。下記3コマンドを実行。

SET GLOBAL validate_password_length=4;
SET GLOBAL validate_password_policy=LOW;
set password for root@localhost=password('root');
$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.23

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> SET GLOBAL validate_password_length=4;
Query OK, 0 rows affected (0.00 sec)

mysql> SET GLOBAL validate_password_policy=LOW;
Query OK, 0 rows affected (0.00 sec)

mysql> set password for root@localhost=password('root');
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> exit
Bye

これで晴れてmysql -u root -prootでログインできるようになる。