LoginSignup
35
32

More than 5 years have passed since last update.

MacのMySQL環境を整理した

Last updated at Posted at 2018-09-12

TL;DR

とりとめのない纏め。

MySQL 8.xと5.6のRailsプロジェクトが混在することになって、切替の必要がでてきた。
いろいろ試したけど、うまくできなかったので、一旦綺麗にすることにした。
ぶっちゃけ面倒なのでdocker-compose.yml書いた方が良さげ。

症状など

  • (過去うまくいかなかった時に)コピペsudoしたりchownしたりで権限がよくわからなくなっていた
  • ERROR! The server quit without updating PID file みたいな、Macだと良くあるMySQLエラーから脱却できないくなった
  • $ xcode-select --install しても直らなかった
  • $ ps aux | grep mysql するとゾンビ化したプロセスが幾つかあったが、killしても蘇って殺せなかった(再起動で直った)

brew upgradeしただけで、ローカルに旧verのformulaが残っている場合、brew switchで切り替えることができる。現在どのverを使っているかは、brew infoで確認することができる。とはいえ後から狙ったversionを追加していくのは面倒そうだったので、brew serviceで切り替える方法がマシっぽい。

つまりmysql.server startでなくbrew services start mysql@5.6で起動する方法をとる。

綺麗にする

brew services start mysql で mysql デーモンが起動しないと思ったら datadir が古かった
↑を参考にスパッと消したらスッキリした。

# 古いやつは消す
$ brew uninstall mysql@5.6
$ brew uninstall mysql
# 残ってるdatadirをきれいにする
$ rm -rf /usr/local/var/mysql
$ rm -rf /usr/local/var/mysql56/
# 入れ直し
$ brew install mysql@5.6
# brew infoでecho文が提示されているので、必要ならパスを通しておく
$ 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

定期実行の登録

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

plistの作成とload/unloadを同時に行うのがbrew service

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

MySQL 8.xも共存させる

2018-09時点では、普通に入れると8系が入る。

  • brew install mysql # <- 8.x
  • brew install mysql@5.6
  • brew install mysql@5.7
$ brew install mysql
$ brew info mysql
# ...(前略)
# usr/local/Cellar/mysql/8.0.12 (255 files, 233.0MB) *
# (後略)...

問題は、ローカルに複数のバージョンのMySQLを入れた場合、mysql2 gemがLibrary not loadedエラーを吐いてRailsが起動できなくなってしまう。どうもmysql2 gemはインストール時点のMySQLクライントに依存するようで、いったんuninstallして入れ直す必要が生じるようだった。

$ bundle exec gem uninstall mysql2
$ bundle install

方法1: localに入れた複数Verを切り替える

Multiple MySQL Versions with Homebrew

毎回unlink -> switchを打つ。

# Unlink current mysql version
brew unlink mysql 

# Check older mysql version
ls /usr/local/Cellar/mysql56 # => 5.6.27

# Link the older version
brew switch mysql56 5.6.27

メンドくさいし、すぐ忘れそう。

DockerのMySQLを参照する

docker run -d --restart always --name mysql57 -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 mysql:5.7

任意のverのMySQLコンテナを立ち上げて、環境変数でRailsのMySQL接続先を127.0.0.1 に向けて接続する(localhost127.0.0.1は違う挙動をする。socketを探すかどうかなど)。変数名は環境によって異なるため、/config/database.yml等の設定を確認すること。

## MySQLの設定
DATABASE_HOST="127.0.0.1"
DATABASE_USER="root"
DATABASE_PASSWORD="password"
DATABASE_NAME="hogehoge_development"

動いたが、ローカルのMySQL無しでは動作しなかった。ローカルのMySQLクライアントに依存しているっぽいが、8.xと5.6を同居させたい場合、どちらを入れるか葛藤が招じるため微妙感ある。

5.7で統一する

8系でガラっと認証周りが変わったっぽく、5.6で作った環境を8系で動かすとかその逆とか無理っぽかった。
5.7なら両方とりあえず動きはした。無理矢理感。

5.6だけを入れる

rm -rf /usr/local/var/mysql
brew remove --force mysql
brew remove --force mysql@5.6
brew install mysql@5.6
mysql.server start

docker-compose.yml書く

もう諦めて半端なことはせず、Railsもコンテナで動かしてdocker composeで繋いでやる。
最初が多少めんどいが、これが一番良さそう。WordPressでやったことあるし。
暇になったらやる。やったら追記する。

参考

35
32
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
35
32