今日はなにの日。

気になったこと勉強になったことのメモ。

今日は、MariaDBでroot のパスワードをリセットしようとしたの日。

目次

とある日

MySQL5系の環境で検証したいことがあったので過去の仮想環境を探しててあったので、MySQLをrootで接続しようとしたら...

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

違うパスワードだった。

これはrootのパスワードがわからないのでパスワードリセットしようとした男の物語である。

※初めの方はMySQLだと思って触ってたのでMySQLと表記しています。

MySQL存在確認

上記では、いきなりMySQLに接続しようとしているがそもそもはMySQLの環境を探していたのでその経緯から記述していく。

[root@localhost ~]# mysql --version
mysql  Ver 15.1 Distrib 5.5.60-MariaDB, for Linux (x86_64) using readline 5.1

基礎的だが、MySQLを起動する前にバージョンを確認することが久しぶりで忘れていたオプション。

ここで、MariaDBだと気づく。

だが、MySQLMariaDBはあまり違いがないのでそのまま進めます。

サービス確認

systemctlコマンドで確認可能。

MariaDBのためサービス名をmariadbにする必要ありけり。

[root@localhost ~]# systemctl status mariadb
● mariadb.service - MariaDB database server
   Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2021-03-26 10:27:14 JST; 1h 12min ago
  Process: 5273 ExecStartPost=/usr/libexec/mariadb-wait-ready $MAINPID (code=exited, status=0/SUCCESS)
  Process: 5242 ExecStartPre=/usr/libexec/mariadb-prepare-db-dir %n (code=exited, status=0/SUCCESS)
 Main PID: 5272 (mysqld_safe)
   CGroup: /system.slice/mariadb.service
           tq5272 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
           mq5436 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/ma...

Mar 26 10:27:12 localhost.localdomain systemd[1]: Starting MariaDB database server...
Mar 26 10:27:12 localhost.localdomain mariadb-prepare-db-dir[5242]: Database MariaDB is probably initialized in /var/lib/mysql already, nothing is done.
Mar 26 10:27:12 localhost.localdomain mysqld_safe[5272]: 210326 10:27:12 mysqld_safe Logging to '/var/log/mariadb/mariadb.log'.
Mar 26 10:27:12 localhost.localdomain mysqld_safe[5272]: 210326 10:27:12 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
Mar 26 10:27:14 localhost.localdomain systemd[1]: Started MariaDB database server.

ちなみに、サービス名をmysqlで指定するとエラーになります。

[root@localhost ~]# systemctl status mysql
Unit mysql.service could not be found.

root password 初期化

www.virment.com

この記事を参考に進めました。

サービス停止

サービスをどれを停止するのかわからないので全部試した。

mariadbが正解でした。

[root@localhost ~]# systemctl stop mysql
Failed to stop mysql.service: Unit mysql.service not loaded.
[root@localhost ~]# systemctl stop mysqld
Failed to stop mysqld.service: Unit mysqld.service not loaded.
[root@localhost ~]# systemctl stop mariadb

セーフティーモード起動

B.5.4.1.3 root のパスワードのリセット: 一般的な手順

mysqld を停止し、--skip-grant-tables オプションを指定して再起動します。これにより、だれでもパスワードなしで接続できるようになり、すべての権限が付与されます。これはセキュアではないため、リモートクライアントによる接続を回避するために、--skip-networking と組み合わせて --skip-grant-tables を使用する必要がある場合もあります。

公式には、オプション指定と書かれてあったがどうやって指定するかわからなかったので、調べて上記の記事がヒットした。

軽く調べたら、my.cnfに追加しても行けるっぽい。

今回はオプション指定の方法を試しました。

root@localhost ~]#  mysqld_safe --skip-grant-tables &
[1] 3894
[root@localhost ~]# 210326 09:32:53 mysqld_safe Logging to '/var/log/mariadb/mariadb.log'.
210326 09:32:53 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql

[root@localhost ~]#  mysqld_safe --skip-grant-tables &
[2] 4088
[root@localhost ~]# 210326 09:35:08 mysqld_safe Logging to '/var/log/mariadb/mariadb.log'.
210326 09:35:09 mysqld_safe A mysqld process already exists

[2]+  Exit 1                  mysqld_safe --skip-grant-tables

mysqld_safe --skip-grant-tables &を一回実行したら、固まったのでもう一度実行した。

already exists(既にある)って言われたので、「あぁ、成功してたんだ」ってなりました。

MariaDB起動

接続完了した。

[root@localhost ~]# mysql -u root
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 1
Server version: 5.5.60-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

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

MariaDB [(none)]> 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
MariaDB [mysql]> show tables;
+---------------------------+
| Tables_in_mysql           |
+---------------------------+
| columns_priv              |
| db                        |
| event                     |
| func                      |
| general_log               |
| help_category             |
| help_keyword              |
| help_relation             |
| help_topic                |
| host                      |
| ndb_binlog_index          |
| plugin                    |
| proc                      |
| procs_priv                |
| proxies_priv              |
| servers                   |
| slow_log                  |
| tables_priv               |
| time_zone                 |
| time_zone_leap_second     |
| time_zone_name            |
| time_zone_transition      |
| time_zone_transition_type |
| user                      |
+---------------------------+
24 rows in set (0.00 sec)

root password 特定(寄り道)

あとは、セーフティーモードのままrootのパスワード変更のSQLを実行するだけで問題は解決するのですが...

ここで、rootパスワードが気になった。

”調べたい”と思い、一旦my.cnfとか見ようと思いMariaDBを切断した。

セーフティーモードも解除しようと思い、参考にした記事通り進めようとした。

MariaDBのプロセスIDを特定してkillする手順を取る。

psコマンドでプロセス確認。

mysqlのプロセスID4040をkill

2回killコマンド実行している理由といて、killしたあと確認のために行ったpsコマンドだが、mysqld_safeがある。

killできてないのかと思ってもう一度実行した。

[root@localhost ~]# ps aux | grep mariadb
mysql     4040  0.0 12.3 980820 93756 pts/0    Sl   09:32   0:00 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --skip-grant-tables --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/mariadb.pid --socket=/var/lib/mysql/mysql.sock
root      4215  0.0  0.1 112708   976 pts/0    R+   09:43   0:00 grep --color=auto mariadb
[root@localhost ~]# kill -9 4040
[root@localhost ~]# ps
  PID TTY          TIME CMD
 3787 pts/0    00:00:00 bash
 3894 pts/0    00:00:00 mysqld_safe
 4288 pts/0    00:00:00 ps
[root@localhost ~]# kill -9 4040
-bash: kill: (4040) - No such process

セーフティーモード解除されない問題

別のプロセスIDでmysqlが実行されている。

変だと思ったので、mariadbに接続できるかを確認した。

[root@localhost ~]# ps aux | grep mariadb
mysql     4263  0.2 11.4 914988 86536 pts/0    Sl   09:43   0:00 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --skip-grant-tables --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/mariadb.pid --socket=/var/lib/mysql/mysql.sock
root      4290  0.0  0.1 112708   976 pts/0    R+   09:43   0:00 grep --color=auto mariadb
[root@localhost ~]# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 1
Server version: 5.5.60-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

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

MariaDB [(none)]> exit
Bye
[root@localhost ~]# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 5.5.60-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

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

MariaDB [(none)]> exit
Bye

適当なパスワードで接続可能だった。

セーフティーモードが解除されていない。

ps aux | grep mariadbコマンドで、確認しつつkillしてを5回ぐらい繰り返した。

systemctlで確認したり起動したがうまくいかず。

[root@localhost ~]# systemctl start mariadb
[root@localhost ~]# systemctl status mariadb
● mariadb.service - MariaDB database server
   Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Fri 2021-03-26 09:45:21 JST; 1s ago
  Process: 4345 ExecStartPost=/usr/libexec/mariadb-wait-ready $MAINPID (code=exited, status=0/SUCCESS)
  Process: 4344 ExecStart=/usr/bin/mysqld_safe --basedir=/usr (code=exited, status=1/FAILURE)
  Process: 4314 ExecStartPre=/usr/libexec/mariadb-prepare-db-dir %n (code=exited, status=0/SUCCESS)
 Main PID: 4344 (code=exited, status=1/FAILURE)

Mar 26 09:45:21 localhost.localdomain systemd[1]: Starting MariaDB database server...
Mar 26 09:45:21 localhost.localdomain mariadb-prepare-db-dir[4314]: Database MariaDB is probably initialized in /var/lib/mysql already, nothing is done.
Mar 26 09:45:21 localhost.localdomain systemd[1]: Started MariaDB database server.
Mar 26 09:45:21 localhost.localdomain mysqld_safe[4344]: 210326 09:45:21 mysqld_safe Logging to '/var/log/mariadb/mariadb.log'.
Mar 26 09:45:21 localhost.localdomain mysqld_safe[4344]: 210326 09:45:21 mysqld_safe A mysqld process already exists
Mar 26 09:45:21 localhost.localdomain systemd[1]: mariadb.service: main process exited, code=exited, status=1/FAILURE
Mar 26 09:45:21 localhost.localdomain systemd[1]: Unit mariadb.service entered failed state.
Mar 26 09:45:21 localhost.localdomain systemd[1]: mariadb.service failed.

セーフティーモード解除成功

複数回繰り返した結果。

mysqlの行がなくなった。

[root@localhost ~]#  ps aux | grep mysql
mysql     5035  0.0 11.7 914988 89036 pts/0    Sl   09:48   0:00 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --skip-grant-tables --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/mariadb.pid --socket=/var/lib/mysql/mysql.sock
root      5200  0.0  0.1 112708   980 pts/0    R+   10:26   0:00 grep --color=auto mysql
[root@localhost ~]# kill -9 5035
[root@localhost ~]#  ps aux | grep mysql
root      5202  0.0  0.1 112708   980 pts/0    R+   10:27   0:00 grep --color=auto mysql

サービス再起動

複数プロセスが起動していたのか削除しても起動するようになっていたのか、詳しくはわかりません。

[root@localhost ~]# systemctl start mariadb
[root@localhost ~]# systemctl status mariadb
● mariadb.service - MariaDB database server
   Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2021-03-26 10:27:14 JST; 19s ago
  Process: 5273 ExecStartPost=/usr/libexec/mariadb-wait-ready $MAINPID (code=exited, status=0/SUCCESS)
  Process: 5242 ExecStartPre=/usr/libexec/mariadb-prepare-db-dir %n (code=exited, status=0/SUCCESS)
 Main PID: 5272 (mysqld_safe)
   CGroup: /system.slice/mariadb.service
           tq5272 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
           mq5436 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/ma...

Mar 26 10:27:12 localhost.localdomain systemd[1]: Starting MariaDB database server...
Mar 26 10:27:12 localhost.localdomain mariadb-prepare-db-dir[5242]: Database MariaDB is probably initialized in /var/lib/mysql already, nothing is done.
Mar 26 10:27:12 localhost.localdomain mysqld_safe[5272]: 210326 10:27:12 mysqld_safe Logging to '/var/log/mariadb/mariadb.log'.
Mar 26 10:27:12 localhost.localdomain mysqld_safe[5272]: 210326 10:27:12 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
Mar 26 10:27:14 localhost.localdomain systemd[1]: Started MariaDB database server.

MariaDB root 初期パスワード探索の旅

とりあえずスタートラインに戻ったので、MySQLとは初期パスワードの調べる手順が違う可能性があるので調べてみた。

そしたら、MariaDBのroot初期パスワードは、「入力無し」と書いてある記事を見つけた。

そんなまさか...と思いやってみた。

[root@localhost ~]# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 5
Server version: 5.5.60-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

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

MariaDB [(none)]>

Enterを押すだけなので見てもわからないと思いますが、初期パスワードが”入力なし”で合ってたみたいです。

rootでMariaDBにログインできたので、

パスワードを変更する必要性がなかったというオチです。

おまけ

MySQLでは、初期パスワードが/var/log/mysqld.logにあるので調べてみたがそんなものはなかった。

[root@localhost ~]# ls -l /var/log/
anaconda/           boot.log-20190726   cron-20190530       grubby              maillog-20190805    messages-20210326   secure-20210326     tuned/
audit/              boot.log-20190805   cron-20190726       grubby_prune_debug  maillog-20210326    qemu-ga/            spooler             wtmp
boot.log            boot.log-20210326   cron-20190805       httpd/              mariadb/            rhsm/               spooler-20190530    xferlog
boot.log-20190523   btmp                cron-20210326       lastlog             messages            secure              spooler-20190726    xferlog-20190805
boot.log-20190524   btmp-20210326       dmesg               maillog             messages-20190530   secure-20190530     spooler-20190805    xferlog-20210326
boot.log-20190529   chrony/             dmesg.old           maillog-20190530    messages-20190726   secure-20190726     spooler-20210326    yum.log
boot.log-20190530   cron                firewalld           maillog-20190726    messages-20190805   secure-20190805     tallylog            yum.log-20210326
[root@localhost ~]# ls -l /var/log/mysqld
ls: cannot access /var/log/mysqld: No such file or directory

mariadbのフォルダもあったので探したがそれらしい記述はなかった。

[root@localhost ~]# cat /var/log/mariadb/mariadb.log  | grep root
[root@localhost ~]# cat /var/log/mariadb/mariadb.log  | grep @
[root@localhost ~]# cat /var/log/mariadb/mariadb.log  | grep password

必死でrootのパスワードを変更しようとしたが、パスワードがわかったので変更する必要がなかったという記録です。