MySQLが起動しない(The server quit without updating PID file ~~~)
はじめに
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 mysql
→brew 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」コマンドで確認可)
実行しても解決しなかった方法
このエラーの解決のために様々な記事やサイトを探し色々な方法を試しましたが、あえなく失敗に終わりました。以下は実行したものの効果がなかったことの一覧です。
-
brew uninstall mysql
→brew install mysql
を繰り返す → 効果なし -
touch /usr/local/var/mysql/*****.local.pid
でpidファイル
を作成しようと試みる → 作成自体は出来るがなぜか一定時間経つと作成したpidファイルが消える -
sudo rm -rf /usr/local/var/mysql
でpidファイル
が入っていたフォルダごと削除する(DBのテーブル等のファイルも消えるのでやる場合はバックアップを取りましょう) → 効果なし -
brew uninstall mysql
するだけでは消えない、mysql関連ファイルを全て削除する → 効果なし
これだけ色々なことをやってるのにどれも解決には至らなくて、もう諦めて日を改めようと思っていました。
解決した方法(プロセス周りを確認する)
半ば諦めていた中で以下の記事を見つけました。
これらの記事(特に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が付けられているんでしょうね。
- 参考:プロセスID (PID)
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コマンド集】
参考
- homebrewで入れたmysqlを8系から5系にダウングレードする
- homebrewでmysqlを8から5.7にバージョンを落としたときの対応
- MySQL5.7をHomebrewでmacOSにインストールする手順
- mysql 起動時のThe server quit without updating PID file エラーの回避法
- ERROR! The server quit without updating PID file (/usr/local/var/mysql/mba.pid).の解決策
- The server quit without updating PID file mysqlエラー解決方法
- macでmysqlが立ち上がらなくなったときの対応メモ
- mySqlサーバを止められなくなったとき
- ps - 現在実行されているプロセスを表示 - Linuxコマンド
- kill -9 PID値でOperation not permittedってなった時の対処法
- プロセスを終了するkillコマンドの使い方まとめ!【Linuxコマンド集】
- 【kill】Linuxでプロセスを終了させるコマンド
- プロセス (process)
- プロセスID (PID)
Discussion