LoginSignup
41
25

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-04-05

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

解決した

以上。

41
25
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
41
25