macで異なるバージョンのmysqlを同時に動かす(自分メモ）

#異なるバージョンのmysqlを同時に動かしたい
開発に携わっていると複数のバージョンのmysqlが必要になる。ほんとはdockerとか使いたいけど旧石器時代のソースなのでそんなおしゃれなことできない。

##環境
```
Homebrew 2.2.10
Homebrew/homebrew-core (git revision 9dfa9; last commit 2020-03-11)
```

##既に入っているmysqlはuninstallします
**バックアップをとっておくこと**

```
$ brew uninstall mysql@8.0
$ brew uninstall mysql@5.7
$ rm -rf /usr/local/var/mysql
```
##とりあえず古いバージョンのmysqlをインストールそして一旦起動

```
$ brew install mysql@5.7
$ /usr/local/opt/mysql@5.7/bin/mysql.server start
```

起動後確認後、
/usr/local/var/mysql フォルダができるのでmysqlを一度 stop

```
$ /usr/local/opt/mysql@5.7/bin/mysql.server stop
#datadirのコピー後でmy.cnfに使用
$ cp /usr/local/var/mysql /usr/local/var/mysql@5.7
```
フォルダのオーナーが/usr/local/va/mysqlと同じか確認しておく。
違うのであればchownで揃えておく。

##古いバージョン用のmy.cnfを作成
portとsocketを変更（デフォルトは3306なのでそれ以外)

```
# my.cnf を確認
$ mysql --help | grep my.cnf
order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf 

$ cp /usr/local/etc/my.cnf /usr/local/etc/my@5.7.cnf
$ vi /usr/local/etc/my@5.7.cnf

[mysqld]
sql_mode="NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES"
# Only allow connections from localhost
bind-address = 127.0.0.1
port=3307
socket = /tmp/mysql2.sock
pid-file = /usr/local/var/mysql/mysql.local.2.pid
log-error =  /usr/local/var/mysql/mysql.local.2.err
datadir = /usr/local/var/mysql@5.7
```

##configファイルを指定して古いバージョンのmysqlを立ち上げてみる
```
/usr/local/opt/mysql@5.7/bin/mysqld_safe --defaults-file=/usr/local/etc/my@5.7.cnf&
```

##mysqlに接続してみる

```
$ mysql -uroot  -S /tmp/mysql2.sock -P3307 -h127.0.0.1
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 57
Server version: 5.7.29 Homebrew

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

```
5.7起動完了！！
パスワードなどは後で適宜変える。
止めるときはプロセスをkillする。

 ````
$ ps aux | grep mysql
powari         70919   0.0  1.5  4764772 244664 s000  S     6:05PM   0:04.35 /usr/local/opt/mysql@5.7/bin/mysqld --defaults-file=/usr/local/etc/my@5.7.cnf --basedir=/usr/local/opt/mysql@5.7 --datadir=/usr/local/var/mysql@5.7 --plugin-dir=/usr/local/opt/mysql@5.7/lib/plugin --log-error=/usr/local/var/mysql/mysql.local.2.err --pid-file=/usr/local/var/mysql/mysql.local.2.pid --socket=/tmp/mysql2.sock --port=3307
powari         70765   0.0  0.0  4292424   1120 s000  S     6:05PM   0:00.04 /bin/sh /usr/local/opt/mysql@5.7/bin/mysqld_safe --defaults-file=/usr/local/etc/my@5.7.cnf

$sudo kill -9 70919
```

##次に新しいバージョンのmysqlインストール
mysql5.7のほうは一旦プロセスをkillして止めておいたほうが良いかも。

```
# データ削除
$ rm -rf /usr/local/var/mysql

# インストール
$ brew install mysql@8.0

# my.cnf編集
$ vi /usr/local/etc/my.cf
[mysqld]
bind-address = 127.0.0.1
port=3306
socket = /tmp/mysql.sock
pid-file = /usr/local/var/mysql/mysql.local.1.pid
log-error =  /usr/local/var/mysql/mysql.local.1.err
datadir = /usr/local/var/mysql


# サーバー起動
$ /usr/local/opt/mysql@8.0/bin/mysql.server start
```

8.0起動完了！！

##もう一度古いバージョン起動してみる

```
/usr/local/opt/mysql@5.7/bin/mysqld_safe --defaults-file=/usr/local/etc/my@5.7.cnf&
```

これで同時に２つのバージョンのmysqlが動いていることになります。