どうしよう！困った時のMac上のMySQLのアンインストール＆再インストール、動作確認手順

## 20190404 追記

この記事は、MacOS High Sierraの環境での記事になります。
Mojaveでも brewでインストールした場合は /usr/local/Cellar/ 以下に入るようですが、念のためご注意ください。
末尾に、参考までにわたしの追記時点での情報を記載します。

## はじめに / このメモについて

表題の通り、前提としている環境はMacになります。
こちらの記事は、

- Mac上にHomebrewでMySQLを入れた
- 同じくMySQL公式のパッケージを使ってMySQLをインストールした
 - 前提は[Community Edition](https://dev.mysql.com/downloads/mysql/)
- コマンドがよくわからず、なんだか環境がごちゃごちゃになってしまった
- いったん綺麗に消してやりなおしたい...

という時に、あれこれと試した際のメモになります。
あまり良い記事ではないかもしれませんが、同じようにどちらも一緒にいれてしまって、扱いに困ってしまった方のお役に立てましたら幸いです。

## とにかく今入っているMySQLを消したい

データはまだ何も登録していないので、とにかく消してしまいたい、という場合の手順を載せてみます。homebrewで入れた場合、Communitiy Editionで入れた場合双方を消す手順になります。

### MySQLの確認

#### インストールされていない状態

ターミナルを起動して、which mysql や which mysqld と入力してください。

```
$ which mysql
mysql not found
```

mysql not found だと、MySQL関連のコマンドがインストールされていないか、パス（コマンドを見つける対象の場所）にmysqlが入っていない可能性があります。
Finderから、「検索」メニューを選択し、mysqlと入力して確認してみてください。

上記では、mysqlがインストールされていない状態です。


#### brew doctorでチェック

homebrewでのインストールに問題がないかをチェックしてくれるコマンドです。
いったん削除してから再インストールする際にも、状態に問題があるとうまくいかない場合があります。
パッケージの依存関係や権限に問題が無いか、念のため、時々確認してみるとよいと思います。

```
$ brew doctor
Your system is ready to brew.
```

上記の通り、エラーやワーニングがでなければOKです。


### Homebrewを利用している場合の確認

- homebrew (brew install ...) でインストールしたものは、基本的に brew list コマンドで表示できます。
- brew でインストールしたものは、 /usr/local/Cellar というディレクトリの下に配置されます。
- which xxx として /usr/local/bin/xxx という具合に配置されていても、シンボリックリンクのみで、実体は /usr/local/Cellar 以下にあります。

以下は、ansible というコマンドの例です。

- which ansibleとすると、/usr/local/bin/ という標準的なコマンド用のディレクトリにあるとのメッセージが出ます。
- ls -la で、シンボリックリンクかどうか（実体が別にあるかどうか）チェックすると、"Cellar" という文字列が見えますので、homebrewで入れていることがわかります。

```
$ which ansible
/usr/local/bin/ansible

$ ls -la /usr/local/bin/ansible
lrwxr-xr-x  1 hogeo  admin  39 11 19  2016 /usr/local/bin/ansible -> ../Cellar/ansible/2.2.0.0_1/bin/ansible

# brewで入れたMySQLの場合
# 実体は/usr/local/Cellar/ 以下にある
$ ls -la /usr/local/bin/mysql
lrwxr-xr-x  1 hogeo  admin  32  1 28 11:59 /usr/local/bin/mysql -> ../Cellar/mysql/5.7.21/bin/mysql
```

参考: [homebrewとは何者か。仕組みについて調べてみた](https://qiita.com/omega999/items/6f65217b81ad3fffe7e6)

## Community Editionを削除する

ここからが、実際に削除を行う手順になります。
まずはCommunity Editionを削除する手順です。

- ターミナルに貼り付けて実行してください。
- sudo コマンドを使うので、途中でパスワードを聞かれますので、その際はご自身のパスワードを入力します。
- 一旦中断してしまったら、もういっかい実行してみてください。

```
rm -rf ~/Library/PreferencePanes/My*
sudo rm /usr/local/mysql
sudo rm -rf /usr/local/mysql*
sudo rm -rf /Library/StartupItems/MySQLCOM
sudo rm -rf /Library/PreferencePanes/My*
sudo rm -rf /Library/Receipts/mysql*
sudo rm -rf /Library/Receipts/MySQL*
sudo rm -rf /private/var/db/receipts/*mysql*
sudo rm /Library/LaunchDaemons/com.oracle.oss.mysql.mysqld.plist
```

Community Editionでは、MySQLのバイナリのほかに、起動スクリプトなどもインストールされますので、こちらを一式削除になります。

## brew で入れたものを削除する

つぎに、brewでインストールしたものも削除します。
/usr/local/var/mysql, /usr/local/share/mysql, /usr/local/opt/mysql は、/usr/local/Cellar/mysql/バージョン番号 以下へのシンボリックリンクになっています。

```
$ brew uninstall mysql

# 以前の不要なファイルも作する

sudo rm -rf /usr/local/Cellar/mysql*
sudo rm -rf /usr/local/bin/mysql*
sudo rm -rf /usr/local/var/mysql*
sudo rm -rf /usr/local/etc/my.cnf
sudo rm -rf /usr/local/share/mysql*
sudo rm -rf /usr/local/opt/mysql*
sudo rm -rf /etc/my.cnf
```

MySQLのパラメータを設定するmy.cnf （オプションファイル）も、1箇所だけではなくいくつかあちこちに点在している可能性もあります。
その場合は、mysql --help | grep my.cnf で表示される箇所にmy.cnfがあれば、合わせて削除します。

## homebrewでインストール（再インストール）する

上記の手順でスッキリお掃除ができたら、改めて homebrewでインストールします。

- brew install mysql を実行します
- Summaryが表示されればOkです

Community Editionでのインストールとの違いの1つは、brewでのインストールでは、rootはパスワードが設定「なし」になります。
（Community Editionでのインストールの場合は、インストール途中でポップアップで「rootパスワードはxxxxです」といった形で自動で設定されます）

また、インストール時のメッセージの通り、brewでインストールの場合は、「only allow connections from localhost by default」となり、「localhost」からの接続のみに限定されます。
（ホスト指定のない場合はドメインソケットでの接続か、TCPでlocalhost / 127.0.0.1での接続）
外部のサーバやPCからアクセスできるようにしたい場合は、あとで設定の変更が必要になります。

```
$ brew install mysql
==> Downloading https://homebrew.bintray.com/bottles/mysql-5.7.21.high_sierra.bottle.tar.gz
Already downloaded: /Users/akiko/Library/Caches/Homebrew/mysql-5.7.21.high_sierra.bottle.tar.gz
==> Pouring mysql-5.7.21.high_sierra.bottle.tar.gz

We've installed your MySQL database without a root password. To secure it run:
    mysql_secure_installation

MySQL is configured to only allow connections from localhost by default

To connect run:
    mysql -uroot

A "/etc/my.cnf" from another install may interfere with a Homebrew-built
server starting up correctly.

To have launchd start mysql now and restart at login:
  brew services start mysql
Or, if you don't want/need a background service you can just run:
  mysql.server start
==> Summary
🍺  /usr/local/Cellar/mysql/5.7.21: 323 files, 233.9MB
```

### 起動の確認をする

MacOS High Sierraではrootでなくても実行できるはずですので、mysql.server start を実行してみてください。

```
$ mysql.server start
Starting MySQL
. SUCCESS! 
```

- うまく起動しなかった場合は、/usr/local/var/mysql/マシン名.err というファイルがあるので、そちらのファイルにエラーの原因が出ていますので、チェックしてみてください
- ロックファイルでエラーが出ている場合は、sudo rm /tmp/mysql.sock.lock　（もしくはエラーに提示されているロックファイルの削除）が有効かもしれません


### rootユーザで接続をためす

homebrewでのインストールの場合は、rootユーザにはパスワードなしでlocalhostのMySQLに接続ができます。

```
mysql -u root

# うまくいくとこんなメッセージ
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.21 Homebrew

Copyright (c) 2000, 2018, 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> 
```

### 接続できたら情報をチェック

以下でユーザを確認します。

- use mysql;
- select user, host from user;

```
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select user, host from user;
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost |
+---------------+-----------+
3 rows in set (0.00 sec)
```

### TCP接続可能かチェック

mysqlを起動している状態で、以下のコマンドでport: 3306 が利用できるか確認します。
ncコマンドに -v オプションをつけると、詳細が表示されます。

```
$ nc -z -w1 -v 127.0.0.1 3306

# うまくいった場合
found 0 associations
found 1 connections:
     1:	flags=82<CONNECTED,PREFERRED>
	outif lo0
	src 127.0.0.1 port 52766
	dst 127.0.0.1 port 3306
	rank info not available
	TCP aux info available

Connection to 127.0.0.1 port 3306 [tcp/mysql] succeeded!

# うまくいかない場合

$ nc -z -w1 -v 127.0.0.1 3306
nc: connectx to 127.0.0.1 port 3306 (tcp) failed: Connection refused
```

### my.cnf の確認

ncコマンドは成功したら、こちらも確認してみてください。

```
mysql -u root -h 127.0.0.1
```

上記で接続できた場合、次はMySQL WorkbenchやJDBC(Eclipse) などのMySQL接続用のクライアントツールから確認してみてください。
ユーザはrootで、パスワードは指定なしです。
うまく行かない場合は、mysqlの設定ファイルを確認します。

#### my.cnfがどこにあるかチェック

以下のコマンドを実行してください。
（mysqld --help --verbose | grep my.cnf）

結果、my.cnf というファイルが列挙されます。

順番に、その場所にファイルがあるか確認してください。
この順番で my.cnf が優先されます。

```
$ mysqld --help --verbose | grep my.cnf
/etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf 
                      my.cnf, $MYSQL_TCP_PORT, /etc/services, built-in default
```

### my.cnf の中のbind-address を確認する

bind-address は、そのホストからしか接続できないようにする設定です。
うまくMySQLに接続できない場合は、いったんこの設定をコメントアウト（先頭に #をつける）で、無効にします。

その上で、mysql.server stop -> mysql.server start で再起動してください。

```
# Default Homebrew MySQL server config
[mysqld]
# Only allow connections from localhost
bind-address = 127.0.0.1
```

## まとめ

以上、「MySQLをインストールしている最中に、コマンドがよくわからず、なんだか環境がごちゃごちゃになってしまった、なのでいったん綺麗に消してやりなおしたい...」という場合のお掃除の方法と、再インストール、確認の方法となります。

個人メモなので、この方法がズバリ正解とは断言できず、たまたまうまくいったという可能性もありますので、試される場合は十分にご注意ください...。
また、お掃除をする前に、brew doctorでのチェックやMySQLのエラーのチェックも合わせて試してみてください。

## 参考1：20190404時点 / 実はクライアントだけ欲しかった場合！

参考までに、現在brewで入っているmysqlの確認を載せてみます。
ただし、入れてしまったMySQLのバージョンの違いでうまくローカル開発環境で動かせないといったことも起こりがちです。

OSに直にインストールするよりは、DBに関してはDockerを使うといったほうが扱いやすいなと最近は感じています！
ただ、どうしてもMySQL ServerではなくMySQLのクライアントが必要、といった場合はこちらを使うと良いかと思います。

- https://formulae.brew.sh/formula/mysql-client (MySQLのクライアントのみ）

### どんなケースでMacにMySQLのクライアントが必要？

- DBはMacには直にインストールせず、VagrantやDocker、あるいはリモートのMySQLサーバを利用する
- ただし、Macのローカル開発環境で直にRailsアプリケーションを操作したいので、MySQLのクライアントだけは欲しい

こんな場合です。


## 参考2：20190404時点 / MacOSのバージョン確認

```bash
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.14.4
BuildVersion:	18E226
```

#### brew list

```bash
% brew list
azure-cli	forego		gnu-sed		hugo		libyaml		newt		popt		ruby		tree
byobu		gdbm		go		jq		mysql		oniguruma	python		s-lang		xz
cmake		gettext		heroku		libevent	mysql@5.7	openssl		readline	sqlite		zsh
coreutils	git-lfs		heroku-node	libpng		ncurses		pkg-config	redis		tmux
```

mysqlとmysql@5.7 の両方がありますね、
ここでは、一部の開発プログラムがMySQL5.7でないといけないので、両方入れている感じ）


#### brew info [FORMULA...] で詳細表示

```bash
% brew info mysql
mysql: stable 8.0.13 (bottled)
Open source relational database management system
https://dev.mysql.com/doc/refman/8.0/en/
Conflicts with:
  mariadb (because mysql, mariadb, and percona install the same binaries.)
  mariadb-connector-c (because both install plugins)
  mysql-cluster (because mysql, mariadb, and percona install the same binaries.)
  mysql-connector-c (because both install MySQL client libraries)
  percona-server (because mysql, mariadb, and percona install the same binaries.)
/usr/local/Cellar/mysql/8.0.12 (257 files, 233.1MB) *
  Poured from bottle on 2018-12-26 at 11:23:19
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/mysql.rb
==> Dependencies
Build: cmake ✘
Required: openssl ✔
==> Requirements
Required: macOS >= 10.10 ✔
==> Caveats
We've installed your MySQL database without a root password. To secure it run:
    mysql_secure_installation

MySQL is configured to only allow connections from localhost by default

To connect run:
    mysql -uroot

To have launchd start mysql now and restart at login:
  brew services start mysql
Or, if you don't want/need a background service you can just run:
  mysql.server start
==> Analytics
install: 66,492 (30 days), 214,105 (90 days), 888,762 (365 days)
install_on_request: 62,394 (30 days), 196,507 (90 days), 806,734 (365 days)
build_error: 0 (30 days)
```