Edited at

brew services start mysql で mysql デーモンが起動しないと思ったら datadir が古かった

More than 1 year has passed since last update.


MacでMySQLサーバーをデーモン起動したい

Macで起動時からプロセスを動かしたりするにはlaunchctlという仕組みがある。plist定義を作っておくと、それに従ってデーモン起動してくれる。LinuxでApacheやMySQLを起動する場合に使う chkconfig 的なやつのMac版。


使い方

こんな感じ

$ launchctl load 設定.plist # 登録

$ launchctl unload 設定.plist # 解除
$ launchctl list # 登録状況とそのPID一覧

homebrewではplistの作成とlaunchctlへのload/unloadを brew services コマンドでやってくれる。

$ brew services start mysql@5.6 # MySQLを常時起動する

$ brew services stop mysql@5.6 # MySQLの常時起動をやめる
$ launchctl list | grep mysql # MySQLが登録されていて動いていることを確認する


まず brew services start mysql がうく行かなかった

launchctl load (homebrewを介して行うなら brew services start ) されると、sudoを付けるか付けないかで以下のどちらかにplistがコピーされる。

/Library/LaunchDaemons/

~/Library/LaunchAgents/

ところが、ここに古いやつ(mysql55)がシンボリックリンクで残っていて、シンボリックリンク先はもう消えていて、新しく brew services start mysql@5.6 しても launchctl list | grep mysqlmysql@5.6が出てこない問題が起きた。代わりに homebrew.mxcl.mysql55 というのがいる。

homebrew.mxcl.mysql55はリンク切れなのでまずそいつを消した。どういう経緯かわからないがhomebrew管轄外のようで brew service stop mysql@5.5 しても消えなかった。無理やり消す。

$ ls /Library/LaunchDaemons/ | grep mysql # いない

$ ls ~/Library/LaunchAgents/ | grep mysql
homebrew.mxcl.mysql55.plist # いた
$ ls -al ~/Library/LaunchAgents/homebrew.mxcl.mysql55.plist
# 出力をコピーしておかなかったけど、リンク先のファイルが実在していないことがわかった
$ rm ~/Library/LaunchAgents/homebrew.mxcl.mysql55.plist # 消す


でも起動しない

上記の後、

brew services start mysql@5.6 すると、無事 mysql@5.6 がlistに出てくるようになった。

launchctl list | grep mysql

- 0 homebrew.mxcl.mysql@5.6

しかし、一番左のPID欄が - になっていて、MySQLサーバーは起動しておらず、接続できない。


どうしたら解決したか

homebrew.mxcl.mysql@5.6.plist<key>ProgramArguments</key> 定義で渡している --datadir=/usr/local/var/mysql というのが有るが、このディレクトリ /usr/local/var/mysql が古いMySQLに作られたものだった。


homebrew.mxcl.mysql@5.6.plist の様子

$ cat ~/Library/LaunchAgents/homebrew.mxcl.mysql\@5.6.plist 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>KeepAlive</key>
<true/>
<key>Label</key>
<string>homebrew.mxcl.mysql@5.6</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/opt/mysql@5.6/bin/mysqld_safe</string>
<string>--bind-address=127.0.0.1</string>
<string>--datadir=/usr/local/var/mysql</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>WorkingDirectory</key>
<string>/usr/local/var/mysql</string>
</dict>
</plist>


掃除する

というわけで一回、古いMySQLを消したりdatadirをきれいにしたりする。

# 古いやつは消す

$ brew uninstall mysql@5.5
# 5.6も仕切り直そう
$ brew services stop mysql@5.6
$ brew uninstall mysql@5.6
# 残ってるdatadirをきれいにする
$ rm -rf /usr/local/var/mysql
$ rm -rf /usr/local/var/mysql55/
# 入れ直し
$ brew install mysql@5.6
# 今は `mysql` コマンドで5.7が提供されていて、mysql@5.6にはパスが通らないので自分で
$ echo 'export PATH="/usr/local/opt/mysql@5.6/bin:$PATH"' >> ~/.bash_profile
$ . ~/.bash_profile
# 一回起動させる
$ mysql.server start
$ mysql.server stop
# launchctlに登録
$ brew services start mysql@5.6
# 動いていることを確認
$ launchctl list | grep mysql
10694 0 homebrew.mxcl.mysql@5.6


解決した

以上。