eureka

HomebrewでインストールしたMySQLが停止しない

1
mysql

MySQLを止めても止めても止まらなくて一人で解決できなかったので、プロセスの調べ方とかも書いた備忘録だよ。次に同じようなことが起きたら自力で解決するマン。

環境

  • MacOS Catalina 10.15.7
  • MySQL 5.6.51

なぜか止まらないローカルのマイMySQL

MySQLを停止させるコマンドを入力してSUCCESS!するのに起動し続ける。まるでゾンビ(本来のゾンビプロセスとは違うけど笑)。

$ mysql.server stop
Shutting down MySQL
.. SUCCESS!

$ mysql.server status
SUCCESS! MySQL running (16081)

嬉しくないSUCCESS

何回stopしても生きている。強い。

$ sudo mysql.server stop
Password:
Shutting down MySQL
.. SUCCESS!

$ mysql.server status
SUCCESS! MySQL running (17194)

brewを使ってストップ

結論はこれでした。Homebrewでインストールしていたのでbrewでストップ。

$ brew services stop mysql@5.6
Stopping `mysql@5.6`... (might take a while)
==> Successfully stopped `mysql@5.6` (label: homebrew.mxcl.mysql@5.6)

下記の記事の引用によると・・

macにはlaunchctlという仕組みがあり,plist定義を作っておくと,自動でデーモンを起動してくれる.これにmysqlが定義されていた.

brewでインストールしたmysqlが勝手に再起動するのを直す

そういえばbrew installした際にbrew services startしたかもしれない、、DockerとかでMySQLを使う可能性があるときはこれやんないようにしようと思ったのでした。

勉強になった・・

おまけ・プロセスからの調べ方

背景としてDockerのMySQLを動かしたかったのに、ローカルのMySQLを参照していそう。競合しているのでは?という推定で調査したメモ。

ポート番号からプロセスを確認する

通常MySQLのポート番号は3306なのでポート番号からプロセスを調べてみる

$ lsof -i:3306
COMMAND     PID   USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
com.docke  1560   user   46u  IPv6 0x83e72043e4f42cff      0t0  TCP *:mysql (LISTEN)
mysqld    16081   user   16u  IPv4 0x83e720440b4ccc0f      0t0  TCP localhost:mysql (LISTEN)

すると3306のポートでdockerのMySQLとローカルのmysqlが競合しているのがわかる。

pstreeコマンドでプロセスの関係を調べてみる

stopしているのにまた起動しているので親プロセスがMySQLを起動しているのでは?と仮説を立てる。

pstreeコマンドを使用するとプロセスの親子関係をツリー状で表示してくれる。

// pstreeが入ってなければインストール
$ brew install pstree

// ローカルMySQLのプロセスの親子関係を調べる
$ pstree 16081
--- 16081 pt1971 /usr/local/opt/mysql@5.6/bin/mysqld (省略)

$ pstree -s 16081
// 出力なし

親プロセスはなかったということになる。
ここでbrew services stopにたどり着いたので終わったが、もし親プロセスがあったらその親プロセスと停止すれば良い(と思う。)

pstreeの使い方は下記の記事が分かりやすそう。
pstree – プロセスをツリー表示 – Linuxコマンド

おまけ・エラー

.. ERROR! The server quit without updating PID file

stopすると下記のようにエラーが出た。

$ mysql.server stop
Shutting down MySQL
.. ERROR! The server quit without updating PID file (/usr/local/var/mysql/ip-192-168-3-5.ap-northeast-1.compute.internal.pid).

この場合はプロセスを削除することで解決した。

// mysqldのプロセスを確認
$ ps -e | grep mysqld
13195 ??    0:00.03 /bin/sh /usr/local/Cellar/mysql@5.6/5.6.51/bin/mysqld_safe (省略)
13292 ??    0:00.51 /usr/local/Cellar/mysql@5.6/5.6.51/bin/mysqld (省略)
15036 ttys000    0:00.00 grep mysqld

// プロセス削除
$ kill 13195
$ kill 13292

$ mysql.server stop
Shutting down MySQL
.. SUCCESS!

参考にしたサイト

1