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 mysql
にmysql@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
解決した
以上。