😹

MySQLが起動しない(The server quit without updating PID file ~~~)

2021/01/17に公開

はじめに

MySQLのバージョンを8系から5系に落とした時に起きた一連の流れの備忘録です。

環境

  • Max OSX
  • mysql --version
    • mysql Ver 14.14 Distrib 5.7.32, for osx10.16 (x86_64) using EditLine wrapper

対象者

  • mysql起動時にThe server quit without updating PID file ~~~というエラーが出た方
  • $ touch /usr/local/var/mysql/*****.local.pidと打ってPIDファイルを作成してもダメだった方
  • brew uninstall mysqlbrew install mysqlをしても直らなかった方
  • rmコマンドでlocal配下のmysql関連ファイルを全て削除したけどそれでもダメだった方

結論

プロセス周りの以下のことを行ったら解決した。

# mysql関係の動いているプロセスを確認
ps aux | grep mysql

# grep以外のプロセスをkillする
sudo kill -TERM 11111

# 接続できるか確認する
mysql -uroot

色々なことを試してみたが効果なく心が折れそうになるまで

8系から5系へのダウングレード

以下の記事などを参考にMySQLのバージョンを8系から5系に落とす作業をしていました。

その中で、MySQL@5.7のインストールの成功までは辿り着いたのですが、確りとパスも通して起動確認をしようとしたところ、以下のエラーが発生し、このエラーの解決に2時間近く悩まされました。

mysql.server start

Starting MySQL
... ERROR! The server quit without updating PID file (/usr/local/var/mysql/*****.local.pid).

# *****の部分は自分のパソコンのホスト名(「uname -n」コマンドで確認可)

実行しても解決しなかった方法

このエラーの解決のために様々な記事やサイトを探し色々な方法を試しましたが、あえなく失敗に終わりました。以下は実行したものの効果がなかったことの一覧です。

これだけ色々なことをやってるのにどれも解決には至らなくて、もう諦めて日を改めようと思っていました。

解決した方法(プロセス周りを確認する)

半ば諦めていた中で以下の記事を見つけました。

これらの記事(特に1つ目)の中で書かれていたことが先程までの自分と全く同じ状況で、「これはもしかしたら!」と思っていたら案の定自分の知らない方法が載っていました。それが「プロセス周りを見る」という方法です。

以下のようなコマンドです。

$ ps aux | grep mysql

この時自分は「プロセス?なにそれ美味しいの?」というレベルでプロセスについては無知でした。
一応自分の勉強がてら、ここから出てくる用語について調べてまとめてみたので興味のある方は下の方を見てみてください(プロセス、pid、psコマンドなどなど)。

mysql関係で動いているプロセスを確認する

ではここからが具体的な解決方法です(コマンドの解説は下に譲ります)。
まずは先程も出てきたコマンドを打って現在mysql関係で動いているプロセスを確認します。
(因みに、プロセスIDは「67190」の列に書いてあるやつです)。

$ ps aux | grep mysql

# 実行結果
[ユーザー名]        67190   2.4  1.0  4714368 168472   ??  S     1:25PM   0:00.36 /usr/local/opt/mysql@5.7/bin/mysqld --basedir=/usr/local/opt/mysql@5.7 --datadir=/usr/local/var/mysql --plugin-dir=/usr/local/opt/mysql@5.7/lib/plugin --log-error=[マシン名].local.err --pid-file=[マシン名].local.pid
_mysql            5690   0.0  0.1  4896376  24236   ??  S    月11AM   4:42.62 /usr/local/Cellar/mysql/8.0.22/bin/mysqld --basedir=/usr/local/Cellar/mysql/8.0.22 --datadir=/usr/local/var/mysql --plugin-dir=/usr/local/Cellar/mysql/8.0.22/lib/plugin --user=mysql --log-error=[マシン名].local.err --pid-file=/usr/local/var/mysql/[マシン名].local.pid
root              5578   0.0  0.0  4281288    128   ??  S    月11AM   0:00.03 /bin/sh /usr/local/Cellar/mysql/8.0.22/bin/mysqld_safe --datadir=/usr/local/var/mysql --pid-file=/usr/local/var/mysql/[マシン名].local.pid
[ユーザー名]        67192   0.0  0.0  4268424    696 s004  S+    1:25PM   0:00.00 grep --color=auto mysql
[ユーザー名]        67103   0.0  0.0  4284252   1180   ??  S     1:25PM   0:00.03 /bin/sh /usr/local/opt/mysql@5.7/bin/mysqld_safe --datadir=/usr/local/var/mysql

この時初めて気が付きました。mysql8系のプロセスが動いていることに…(2行目と3行目のやつです)。これまでの試行錯誤の中で8系のファイルなどは完全に消し去ったと思っていたのでとても驚きました。

不要なプロセスを落とす

少なくともこれが原因であろうことはなんとなく理解できました。ただ、参考にした記事では「grep」が付いているプロセス以外を落としていたので、自分もその方法を取ってみることにしました。

不要なプロセスは以下のコマンドで落としました(上の4行目のgrepという文字列が入っているもの以外に実行)

$ sudo kill -TERM 5690
$ sudo kill -TERM 5578
$ sudo kill -TERM 67190
$ sudo kill -TERM 67103

すると、プロセスIDは変わっていますが、mysql8系のプロセスを落とすことに成功しました!

$ ps aux | grep mysql

[ユーザー名]         1565   0.0  0.0  4719156   2156   ??  S    木12PM   0:36.99 /usr/local/opt/mysql@5.7/bin/mysqld --basedir=/usr/local/opt/mysql@5.7 --datadir=/usr/local/var/mysql --plugin-dir=/usr/local/opt/mysql@5.7/lib/plugin --log-error=[マシン名].local.err --pid-file=[マシン名].local.pid
[ユーザー名]         1437   0.0  0.0  4300636    136   ??  S    木12PM   0:00.09 /bin/sh /usr/local/opt/mysql@5.7/bin/mysqld_safe --datadir=/usr/local/var/mysql
[ユーザー名]        43344   0.0  0.0  4295048    740 s002  S+    6:47PM   0:00.01 grep --color=auto mysql

このあと何回かやってもこの3つ以下になることはなかったので、これは憶測ですがこの3つは最低限必要なんだろうなと解釈しました。

一番最初に試してみて上手く行かなかった/usr/local/var/mysql/フォルダ内の*****.local.pidファイルを見てみると、「1565」とだけ書いてあって、ちゃんとpidファイル自身も消えることなく存在していることを確認しました!
mysqlは起動する時にこのpidファイルを参照して起動しているんでしょうかね(?)

mysqlの起動確認をする

というわけで起動確認です。2時間近くにわたるmysqlとの死闘に終止符を!

$ mysql -uroot

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.32 Homebrew

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

やったああああああああああああああああああああああああああああああああああああああああ!!!!!!!!!!!!!!!
…泣いた。泣いてはないけど心では泣いてる。。

先人に感謝…先人に感謝!!

おわりに

エラーを通して人は強くなっていくのだなと身を持って体感した1日でした…()
これ書くのにもう2時間ほど取られてるのでmysql本当に時間泥棒…
この投稿がまた、同じような状況に陥ってしまった人の助けになればとても嬉しく思います。

一緒に頑張りましょう:-)

今回出てきた用語

プロセスとは

そもそも今回の解決の鍵となったプロセスとは一体何なのか。
プロセスとは、実行中のプログラム1つ1つのことだそうです(正確には"メモリを使用して"実行中のプログラム)。
通常パソコンがなにか作業をする時は、メモリと呼ばれる作業机の上にプログラム(プロセス)を置くようで、今回の場合、mysqlに関わるプログラム(プロセス)がたくさん作業机の上に載ってしまっていたため(特にmysql8系に関わるプロセスが載っていたため?)、その幾つかを作業机の上からなくすことで正常に起動するようにした、そんな感じでしょうかね。

プロセスはプログラム1つにつき1個だけと言うわけではないらしい?(Excelファイルを2つ開いていたら2つのプロセスが実行中みたいな)ので、今回はmysqlに関わるプロセスがたくさん動いていてごっちゃごっちゃしていたんでしょうか。

pidとは

最初に出てきたpidファイルとは何なのか。
pidとは、プロセスIDのこと(Process ID)だそうです。「プロセスに割り振られた管理者用の番号」らしいですね。
プロセスIDが被っていると1つ消そうとしたのに同時に2つ消えちゃうなんてことがありそうですから、管理しやすいようにプロセスごとに一意のIDが付けられているんでしょうね。

psコマンド

psコマンドとは、現在実行されているプロセスを表示するコマンドだそうです。
現在実行されているアクティブなプロセスのID(PID)、状態(STAT)、コマンド、経過時間などを出力してくれる便利なやつらしいですね。Linuxコマンドの中でも相当使用頻度が高いものなのだとか…(初めて使った…)

psコマンドには幾つかのオプションがあって、その中でもよく使うものがps auxという組み合わせだそう。
auxはそれぞれ独立した意味を持っていて、以下のような意味合いのようですよ。

  • aは、端末操作のプロセスを表示する
  • uは、CPUやメモリの使用率などを表示する
  • xは。端末操作以外のプロセスを表示する

まあ、そうは言われても難しいですね。以下参考記事の3つ目により詳しく書いてあったので是非見てみてください。

grepコマンド

grepコマンドとは、指定したパターンにマッチする行を表示するコマンドだそうです。
Macでよく画面内検索をする時にとかに「command + F」を押すような感覚でしょうかね?条件に一致した文字列を探すみたいな?

今回のgrep mysqlでは、mysqlという文字列を含むものを条件検索しているということのようですね。
このgrepコマンドは、先程のpsコマンドとよく一緒に使われることが多いようです。

killコマンド

killコマンドとは、実行しているプロセスを終了するコマンドだそうです。
このkillコマンドも、先程のpsコマンドとよく一緒に使われるコマンドですね。

-TERMオプションは、「終了」という意味のTerminateから来ているようです。わざわざ書かなくてもデフォルトでこの設定になっているようですよ。

参考:kill - 指定したプロセスを強制終了 - Linuxコマンド
参考:プロセスを終了するkillコマンドの使い方まとめ!【Linuxコマンド集】

参考

GitHubで編集を提案

Discussion