[MariaDB, MySQL] root パスワードを忘れたときの対応

MariaDB, MySQL

MariaDB, MySQL

さて新しくCREATE DATABASEするか。
・・・あれ、rootパスワードなんだっけ???

何てことよくありますよね。

そんな時は慌てずにrootパスワードを初期化すればよいだけなのですが、この初期化方法を良く忘れてしまうので備忘録。

前提

OS: CentOS 7系
MySQL:5.5
*MySQL5.6.7以上の人向けの補足あり

実行したのはMariaDB環境ですが、MySQL / MariaDBともに利用できるように記事にしてみました。

注意点

CentOS7系 & MariaDB環境の場合、pkillにて強制終了をしていますが、DB終了時は正しい手順を踏まないとデータが壊れる可能性があると記憶しています。

そのため、可能な限り作業中はデータが更新されないように注意しましょう。

具体的には、下記のようなことですかね。

  • 外部からの更新を遮断
    • webサーバーの停止
    • 外部からのDB接続を遮断
  • cronの停止

せっかちさんのためのまとめ

せっかちさんのために、手順だけをまとめたものを用意しておきます。
MariaDB / MySQLとあるので、環境に合わせてご利用ください。

MariaDB 環境

# 1. 念のためDBの起動確認
systemctl status mariadb.service

# 2. DBを停止
systemctl stop mariadb.service

# 3. セーフモードでDBを起動
mysqld_safe --skip-grant-tables &

# 4. DBに接続
mysql -u root mysql

# 5. パスワードを更新
MariaDB [mysql]> update user set password=PASSWORD('newpassword') where User='root';

# 6. セーフモードを終了
pkill -TERM -P $(pgrep mysqld_safe)

# 7. 通常モードで起動
systemctl start mariadb.service

# 8. 通常モードでの起動確認(ログインできなければOK)
mysql -u root mysql

MySQL環境

# 1. 念のためDBの起動確認
systemctl status mysqld.service

# 2. DBを停止
systemctl stop mysqld.service

# 3. セーフモードでDBを起動
systemctl set-environment MYSQLD_OPTS="--skip-grant-tables"
systemctl start mysqld.service

# 4. DBに接続
mysql -u root mysql

# 5. [MySQL 5.6.6以下] パスワードを更新
mysqld> update user set password=PASSWORD('newpassword') where User='root';

# 5. [MySQL 5.6.7以上] パスワードを更新
mysqld> ALTER USER 'root'@'%' IDENTIFIED BY 'newpassword';

# 6. セーフモードを終了
systemctl stop mysqld.service

# 7. 通常モードで起動
systemctl set-environment MYSQLD_OPTS=""
systemctl start mysqld.service

# 8. 通常モードでの起動確認(ログインできなければOK)
mysql -u root mysql

大まかな流れ

ざっくりとした流れは下記の通り

  1. 念のためDBの起動確認
  2. DBを停止
  3. セーフモードでDBを起動
  4. DBに接続
  5. パスワードを更新
  6. セーフモードを終了
  7. 通常モードで起動
  8. 通常モードでの起動確認

作業ログ

1. 念のためDBの起動確認

systemctl status mariadb.service

[Active: active (running)] みたいなのが出てれば起動中

2. DBを停止

systemctl stop mariadb.service

CentOS7系のsystemctlになってから、CentOS6系の起動シェルと違って[OK]とかでないのが好きくない・・・

まぁ、statusで確認すればよいのだけどさ

3. セーフモードでDBを起動

mysqld_safe --skip-grant-tables &

一応、Linux初心者向けにちょっと解説入れると、最後の [&] をつけてバックグランドで実行するのがミソっすね。

今回はMariaDBで作業したからmysqld_safeを直接実行しているけど、MySQLを利用している人は、下記のほうがスマート。

# 起動オプションを設定
systemctl set-environment MYSQLD_OPTS="--skip-grant-tables"
systemctl start mysqld.service

この方法を採用した人は、終了時に起動オプションをクリアするのを忘れずに。(後述)

MariaDBでも起動オプションを指定する方法があるかもしれないけど、散々探しても見つからず・・・

4. DBに接続

mysql -u root mysql

mysqlデータベースに対してDB接続。
セーフモードで起動済みのため、パスワードは不要。

5. パスワードを更新

さて、いよいよパスワードの更新・・・の前に、念のため影響範囲を確認しましょう。
エンジニアたるもの作業の前に、影響範囲の確認を怠るのはアカンです。

MariaDB [mysql]> select Host, User from user where User = 'root';
+-----------------------+------+
| Host                  | User |
+-----------------------+------+
| 127.0.0.1             | root |
| ::1                   | root |
| localhost             | root |
| localhost.localdomain | root |
+-----------------------+------+
4 rows in set (0.00 sec)

影響範囲も確認出来たらいよいよ更新

MariaDB [mysql]> update user set password=PASSWORD('newpassword') where User='root';

MySQL5.6.7以上を利用の方は下記のほうがスマートっぽい。

mysql> ALTER USER 'root'@'%' IDENTIFIED BY 'newpassword';

*参考:[MySQL5.6公式Document] 13.7.1.1 ALTER USER 構文

6. セーフモードを終了

pkill -TERM -P $(pgrep mysqld_safe)

MariaDBで作業しており、systemctl経由で起動していないためpkillコマンドで強制終了。

うーん、DBの場合は終了時にいろいろとゴニョゴニョしている記憶があるので、強制終了するとよろしくないはず・・・なんかほかに手はないのかな?
(あんまり詳しくない)

7. 通常モードで起動

systemctl start mariadb.service

DBを通常モードで起動。

MySQL環境の人で、MYSQLD_OPTSを使って起動した人は下記のようにMYSQLD_OPTSをクリアする必要がある。

systemctl set-environment MYSQLD_OPTS=""
systemctl start mariadb.service

8. 通常モードでの起動確認

mysql -u root mysql

念のため、パスワードなしでログインできないことを確認しましょう。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする