【MacOS - Homebrew版】MySQLの設定方法（インストール→MySQLサーバー立ち上げ→パスワード設定等）

# はじめに

## 注意点

- 本格的に勉強し出して２ヶ月半ほどの初学者が書いてます
- とりあえず、MySQLを動かしたい初学者向けの記事です
- 書いたことについては動作確認をしています
    - 2020年6月28日時点
    - 導入環境等は以下のとおり

## 導入環境

- MacOS X 10.15.5 （Catalina） 
- Homebrew を使用
- MySQL Version 8.0.19

## 結論  

身も蓋もないですが、LGTMが多いQiitaの記事を参照するのが確実です！
これを読めば、大体分かります。

> [Mac へ MySQL を Homebrew でインストールする手順 \- Qiita](https://qiita.com/hkusu/items/cda3e8461e7a46ecf25d)  

ただ、出てくる英文メッセージについて逐一解説すれば差別化 ＋ 補足ができるのでは
ないかと思い、この記事を書くこととしました。

また、実際に直面したトラブルについてもまとめてみました。
記事が冗長になってしまいましたが、MySQL導入が上手くいかない方の参考になれば幸いです。

# 導入手順

## 概要

取り扱う内容は以下のとおりです。
あと、ターミナル上に出てくる英語はしっかり読みましょう！

1. Homebrewをアップデートし、MySQLをインストールする
2. MySQLサーバーを立ち上げて、停止してみる
3. MySQLのパスワード設定等を行う
4. 設定したパスワードで接続する
5. もうよく分からんけど上手くいかないから再設定する（該当の方のみ）

## 1. Homebrewをアップデートし、MySQLをインストールする

### a. Homebrewのアップデートを行う

```
$ brew update
```

### b. Homebrew で MySQL をインストールする

```
$ brew install mysql
```

### c. Homebrewインストール後のメッセージについて

実行するであろうコマンドが、一通り解説されます。
ざっと理解した方が、今後の作業が結果としてスムーズにいくような気がします。

```
# パスワードを設定せず、インストールしました。
# セキュリティを高めるためには、以下のコマンドを入力してください。
We've installed your MySQL database without a root password. To secure it run:
    mysql_secure_installation

# MySQLは、デフォルトではローカルからしか接続できない設定となっています。
# （デプロイする際には設定が必要になる、ということだと思われます。。。）
MySQL is configured to only allow connections from localhost by default

# ログインするには以下のコマンドを実行
To connect run:
    mysql -uroot

# サーバーを立ち上げる（+ Macの再起動後に自動的にMySQLを再起動したい）には以下を実行
To have launchd start mysql now and restart at login:
  brew services start mysql

# サーバーを立ち上げる（+ Macの再起動後に自動的にMySQLを再起動しない）には以下を実行
Or, if you don't want/need a background service you can just run:
  mysql.server start
==> Summary
🍺  /usr/local/Cellar/mysql/8.0.19_1: 286 files, 288.8MB
```

## 2. MySQLサーバーを立ち上げて、停止してみる

### a. MySQLサーバーの立ち上げ

まずMySQLサーバーが立ち上がるか確認しましょう。

```
mysql.server start
```

なお、Macの再起動後に自動的にMySQLサーバーを立ち上げたい人は、
以下のコマンドでもよいかと思います。（ここだけ、試せていません。。。）

```
brew services start mysql
```

立ち上がると、以下のとおりになるかと思います。

```
Starting MySQL
 SUCCESS! 
```

### b. MySQLサーバーを停止する

以下を入力します。

```
mysql.server stop
```

すると、以下のとおり成功するはずです。

```
Shutting down MySQL
.. SUCCESS!
```

### c. MySQLサーバーの状態を確認する

以下を入力します。
MySQLサーバーが動いているのか、停止しているのか分かります。

```
mysql.server status
```

動いている場合は、以下のとおり。

```
# XXXXX に５桁の番号が入る
SUCCESS! MySQL running (XXXXX)
```

停止している場合は、以下のとおり。

```
ERROR! MySQL is not running
```

### d. 停止しているサーバーを停止しようとすると

以下のメッセージが出てきます。

```
ERROR! MySQL server PID file could not be found!
```

ちなみに、この一文でググると、今回のケースにおいては明後日の方向の情報が出てきます。
（サーバーの立ち上げも停止もできない方向けの情報が主にヒットするかと思います）

まず、サーバーの状態を確認して、サーバーの立ち上げがやっぱりできない場合に、
「MySQL server PID file could not be found!」でググってみましょう！

## 3. MySQLのパスワード設定等を行う
 
### a. パスワード等の初期設定

Homebrew経由でインストールをすると、rootパスワードは設定されていません。
よって、パスワード等を設定します。

MySQLサーバーが立ち上がった状態で行いましょう。
以下を入力します。

```
mysql_secure_installation
```

続いて、以下のコマンド入力画面を参照してください。
英文をかなり雑に意訳しましたので、参考までにご覧ください。

なお、場合によっては、このとおりメッセージが出ないかもしれないです。
ただ、基本的な内容は変わらないかと思います。

```
# SQLサーバーのセキュリティ設定を行います。
Securing the MySQL server deployment.

# パスワードなしの状態でログインしています。
Connecting to MySQL using a blank password.

# パスワードを強固なものとするため、「VALIDATE PASSWORD component」を設定したいか訊かれます。
VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

# YESにすると、パスワードのレベルをどれぐらい厳しくするか求められます。
# NOにすると、１２３のような簡単なパスワードに設定できます（セキュリティ上よろしくないですが）。
# ここでは`y`を選びました。
Press y|Y for Yes, any other key for No: y

# 私は、LOWにしたいので、0を入力しました（パスワードは８文字以上にすること）
# 厳しくしたい人は、1 や 2 にしてください
There are three levels of password validation policy:

LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 0     
Using existing password for root.

# パスワードがどれくらい破られにくいか表示してくれています。
# 100点満点中、25点でした 笑
Estimated strength of the password: 25

# 先ほど設定したパスワードに変更してよければ、`y`を入力。
# パスワードがどれくらい強固か示した上で、改めてユーザーに確認させるためにわざわざ聞いているのかと思われます。
Change the password for root ? ((Press y|Y for Yes, any other key for No) : 入力したパスワードが表示されている

 ... skipping.

# アノニマス（匿名）ユーザーというのがあるらしく、それを使うとユーザーアカウントがなくとも、
# 誰でもMySQLにログインできてしまうようです。これは、インストールなどを円滑にするためにある
# ユーザーです。デプロイする前には、絶対にアノニマスユーザーを削除してください！

By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

# さて、あなたはアノニマスユーザーを削除しますよね？
# 私は、アノニマスユーザーを大人しく消しました 笑
Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.

# 普通は、ルートユーザーはローカルからしかアクセスできない設定にするものです。
# だって、誰かがルートユーザーにログインして、色々悪さしたら困るでしょ？
Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

# ルートユーザーにリモートログインできない設定にしますよね？
# 私は、大人しくリモートログインできない設定にしました 笑
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.

# デフォルトの設定では、誰でもアクセスできる「test」というデータベースが生成されています。
# これも、デプロイする前には、絶対に削除してください！！！
By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.

# ということで「test」のデータベース、削除しといていいですよね？
# 大人しく、削除することにしました 笑
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

# これまでの設定を即反映しますか？
# 「privilege table ~」 と書いてますが、先ほど削除したばっかりなのでリロードはされないかと思います
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

# 反映したいので、`y`を選択しました
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done! 
```

### b. その他の設定方法

先ほど書いたとおり、Homebrew経由でインストールした場合、
rootパスワードは設定されていない状態です。

なので、`mysql -uroot`にてとりあえずMySQLにログインしてしまい、
そこからパスワードを設定する方法もあるようです。  

その場合、おそらく以下のコマンドを入力することになるかと思います。  

```
mysql> USE mysql;
mysql> ALTER USER 'root'@'localhost' identified BY '任意のパスワード';
```

ここでは細かく触れませんが、何も知らない状態で2つの方法を見るとどちらが正しいのか
混乱しそうだと思ったので、一応、触れておきました。

ちなみに、この方法だとセキュリティ上の設定ができず、アノニマスユーザーが残ってしまうので、
あまりよろしくないのかなと思います。（実際のところはよく分かっていませんが。。。）

## 4. 設定したパスワードで接続する

### a. 接続方法

さて、MySQLに接続しましょう！

```
mysql -uroot -p
```

すると、以下が表示されます。
パスワードを入力しましょう！

```
Enter password: 
```

成功すると、以下のとおり表示されるはずです。
おつかれさまでした！！！

```
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.19 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> 

```

ちなみに、`exit`と入力すると、MySQLを終えることができます。

```
mysql> exit
Bye
```

### b. パスワードを間違えた場合

以下のとおり表示されるはずです。
なお、これはMySQLサーバーが起動している場合です。

```
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
```


### c. MySQLサーバーが起動していない場合

以下のとおり表示されます。
パスワードが合っていようとも、以下のとおりエラーになります。

```
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
```

ちなみに、安易にこのメッセージでググり始めてしまうと不幸の始まりです笑

mysql.sockファイルがないのか、再作成が必要なのかと考え出してしまうかもしれませんが、
単純にサーバーが停止しているだけではないか、まず疑いましょう。

### d. パスワードを忘れた残念な方へ

おつかれさまです。
奇遇ですね、友達になりたいです 笑

この記事を参照しましょう 笑

> [Mac ローカル環境の MySQL 8\.0 のrootパスワードを忘れた時のリセット方法 \- Qiita](https://qiita.com/miriwo/items/1880e9d2ebcfd3c0e60d)  

### 5. もうよく分からんけど上手くいかないから再設定する方へ

変な設定をしてしまった場合、作業が上手くいかない可能性があります。
心当たりがある場合、素直に再設定する方が早いかと思います。

> [MySQLをHomebrewでインストールして初期設定まで行ったけど、MySQLがどうしても起動しなかったときの対応 \- Qiita](https://qiita.com/ryuichi44/items/bd3462137ce4467695e3#%E3%83%88%E3%83%A9%E3%82%A43mysql%E3%81%AE%E5%86%8D%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)

なお、案内のとおり、再起動はしましょう！
再起動しないと、エラーになります！

## その他で参考にしたもの

その他、参考にさせていただいたものを以下に記します。

- [【公式】 MySQL :: MySQL 8\.0 Reference Manual :: 2\.10\.4 Securing the Initial MySQL Account](https://dev.mysql.com/doc/refman/8.0/en/default-privileges.html)  
    - 英語ですが、日本語翻訳するとなんとなく分かることもあるかと
- [「brew services start mysql」と「mysql\.server start」の違い \- Qiita](https://qiita.com/yamayamasou/items/3f54afad6448a3ddb652) 
    - タイトルの通り、違いが分からなかったので参考にさせていただきました 
- [Mysql 5\.7\* パスワードをPolicyに合わせるとめんどくさい件について \- Qiita](https://qiita.com/keisukeYamagishi/items/d897e5c52fe9fd8d9273)
    - ゴニョゴニョやっていたら、パスワードレベルがmediumになってしまったため参考にしました