RailsにMySQLを導入する

Railsアプリを作っていて、DBは何にしよう？
MySQLかな(使い慣れているし)と思い、導入することにしました。

##MySQLのインストール
Homebrewを使ってインストールします

```
 $ brew update
 $ brew install mysql
```

```shell:バージョン確認(接続前)
$ mysql --version
mysql  Ver 8.0.19 for osx10.14 on x86_64 (Homebrew)
```

```shell:バージョン確認(接続後)
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.19    |
+-----------+
1 row in set (0.00 sec)
```

##MySQL起動
インストールが成功したら起動してみましょう

```shell:MySQL起動、接続
$ mysql.server start

$ mysql -u root 
```

##セキュリティ設定

接続できたらセキュリティ設定を行います

```shell:セキュリティ設定
$ mysql_secure_installation
```

下記4つの項目を聞かれます。

###1.rootのパスワードの変更
まずは、rootユーザーのパシワード変更です。

```shell:パスワードの変更
VALIDATE PASSWORD PLUGIN 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 plugin?

Press y|Y for Yes, any other key for No: y
```
パスワードの強度は3種類あるようです。

```shell:パスワードの変更
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: 2
```

・LOW：8文字以上
・MEDIUM：8文字以上 ＋ 数字・アルファベットの大文字と小文字・特殊文字を含む
・STRONG：8文字以上 ＋ 数字・アルファベットの大文字と小文字・特殊文字を含む ＋ 辞書ファイルでのチェック

ご自身にあったものを選んで変更してください

###2.匿名ユーザの削除

匿名ユーザーを削除するか聞かれるので、削除します

```shell:anonymousユーザーの削除
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
```

###3.リモートからのrootユーザでのログイン禁止
リモートから root ユーザでログインできるかの設定を求められます。
`y`を入力してログインできないようにします。

```shell:リモートからのrootユーザでのログイン禁止
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
```

###4.testデータベースの削除
最後にデフォルトで作成されている`test`という名前のデータベースを削除するか聞かれるので、`y`を入力します。

```shell:リモートからのrootユーザでのログイン禁止
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.

Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
```

これで、データベースと権限が削除されます。
ここまでで、セキュリティ設定が完了しました。

##MySQLへ接続し新しいユーザーの作成

基本的にローカル開発でrootユーザーは使いたくないので、新しいユーザーを作成します。
先ほど設定した新しいrootユーザーのパスワードでログインし、作成します。

```shell:ユーザー作成
mysql> create user 'local-user'@'localhost' identified by '○○○○○○(設定したいパスワード)';
 Query OK, 0 rows affected (0.06 sec)
```

```shell:ユーザー確認
mysql> select User,Host from mysql.user;
 +------------------+-----------+
 | User             | Host      |
 +------------------+-----------+
 | local-user       | localhost |
 | mysql.infoschema | localhost |
 | mysql.session    | localhost |
 | mysql.sys        | localhost |
 | root             | localhost |
 +------------------+-----------+
 5 rows in set (0.00 sec)
```

```shell:権限設定
mysql> grant all on *.* to 'local-user'@'localhost';
 Query OK, 0 rows affected (0.06 sec)
```

###Railsに導入

ここまでMySQLの設定が完了したら、Railsで使えるように設定します。
新規で作る場合は、下記コマンドでMySQLを使うように設定できます。

```shell:プロジェクト作成
$ rails new アプリケーション名 --database=mysql
```

`config/database.yml`を確認すると以下のようになっています。

```Rails:database.yml
default: &default
   adapter: mysql2
   encoding: utf8
   pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
   username: root
   password:
   host: localhost

 development:
   <<: *default
   database: アプリケーション名_development

 test:
   <<: *default
   database: アプリケーション名_test

 production:
   <<: *default
   database: アプリケーション名_production
   username: アプリケーション名
   password: <%= ENV['アプリケーション名_DATABASE_PASSWORD'] %>
```

そして、`GemFile`を修正します。(既存プロジェクトに組み込む場合はここからです)
下記を追加、もしくは`sqlLite`がある場合はそれを削除してください。

```Rails:GemFile
gem mysql2
```
`bundle install`を実行します。

```Rails:database.yml
development:
   adapter: mysql2
   encoding: utf8
   database: <%= ENV['DATABASE_NAME'] %>
   pool: 5
   username: <%= ENV['DATABASE_USER'] %>
   password: <%= ENV['DATABASE_PASSWORD'] %>
   host: <%= ENV['DATABASE_HOST'] %>
```

上記のように環境変数を使えるようになるので、パスワード等が外部に漏れずにすみます。

環境変数は`.env`ファイルを作成し、記入します。
※`.env`ファイルは`.ignore`に設定しないと公開する可能性があるので注意してください！

```shell:.env作成
vi .env
```

```shell:.env
DATABASE_PASSWORD = '設定したパスワードを記入'
DATABASE_USER = '作成したMySQLユーザー名を記入'
DATABASE_HOST = 'localhostなど(MySQLのユーザーを確認)'
```

ここまで完了したら、`$ rails db:create`でDBを作成します。
完了したら、MySQLが使えるようになっているはずです。

###【補足】
[Sequel Pro](https://www.sequelpro.com/)を使いたい場合は、下記コマンドでインストールできます。
`Sequel Pro`とはDBを管理するGUIツールです。

```shell:SequelProのインストール
$ brew cask install sequel-pro
```

また、`Sequel Pro`でログインできない場合があります。
下記のようなエラーが発生したら、認証プラグインを変更してください。

`Authentication plugin 'caching_sha2_password' cannot be loaded: dlopen(/usr/local/lib/plugin/caching_sha2_password.so, 2): image not found`

```shell:pluginの確認
mysql> SELECT host, user, plugin FROM mysql.user;
+-----------+------------------+-----------------------+
| host      | user             | plugin                |
+-----------+------------------+-----------------------+
| localhost | local-user       | caching_sha2_password |
+-----------+------------------+-----------------------+
5 rows in set (0.03 sec)
```

```shell:認証プラグインの変更
mysql> ALTER USER 'local-user'@"localhost" IDENTIFIED WITH mysql_native_password BY '{password}';
```

[公式](https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password)によると、MySQL8.0からデフォルトの認証プラグインが`caching_sha2_password`に変更されたようです。(以前は`mysql_native_password`)

ただ、`Sequel Pro`等のツールはまだ新しい認証プラグインに対応していない場合があるようです。
なので、`mysql_native_password`に戻す必要があるようです。

####参照
[【Rails/MySQL】RailsにMySQLを導入する方法【プログラミング学習149日目】](https://qiita.com/fuku_tech/items/a380ebb1fd156c14c25b)