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

## 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サーバーは起動しておらず、接続できない。

## どうしたら解決したか

- 原因としてはこれだった。
  - [Can't start/stop MySQL 5.6 after install using `brew services start|stop mysql56` scripts. · Issue #1419 · Homebrew/homebrew-versions](https://github.com/Homebrew/homebrew-versions/issues/1419)

`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
# ５．６も仕切り直そう
$ 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
```

## 解決した

以上。