Railsアプリを作っていて、DBは何にしよう?
MySQLかな(使い慣れているし)と思い、導入することにしました。
##MySQLのインストール
Homebrewを使ってインストールします
$ brew update
$ brew install mysql
$ mysql --version
mysql Ver 8.0.19 for osx10.14 on x86_64 (Homebrew)
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.19 |
+-----------+
1 row in set (0.00 sec)
##MySQL起動
インストールが成功したら起動してみましょう
$ mysql.server start
$ mysql -u root
##セキュリティ設定
接続できたらセキュリティ設定を行います
$ mysql_secure_installation
下記4つの項目を聞かれます。
###1.rootのパスワードの変更
まずは、rootユーザーのパシワード変更です。
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種類あるようです。
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.匿名ユーザの削除
匿名ユーザーを削除するか聞かれるので、削除します
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
を入力してログインできないようにします。
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
を入力します。
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ユーザーのパスワードでログインし、作成します。
mysql> create user 'local-user'@'localhost' identified by '○○○○○○(設定したいパスワード)';
Query OK, 0 rows affected (0.06 sec)
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)
mysql> grant all on *.* to 'local-user'@'localhost';
Query OK, 0 rows affected (0.06 sec)
###Railsに導入
ここまでMySQLの設定が完了したら、Railsで使えるように設定します。
新規で作る場合は、下記コマンドでMySQLを使うように設定できます。
$ rails new アプリケーション名 --database=mysql
config/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
がある場合はそれを削除してください。
gem mysql2
bundle install
を実行します。
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
に設定しないと公開する可能性があるので注意してください!
vi .env
DATABASE_PASSWORD = '設定したパスワードを記入'
DATABASE_USER = '作成したMySQLユーザー名を記入'
DATABASE_HOST = 'localhostなど(MySQLのユーザーを確認)'
ここまで完了したら、$ rails db:create
でDBを作成します。
完了したら、MySQLが使えるようになっているはずです。
###【補足】
Sequel Proを使いたい場合は、下記コマンドでインストールできます。
Sequel Pro
とはDBを管理するGUIツールです。
$ 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
mysql> SELECT host, user, plugin FROM mysql.user;
+-----------+------------------+-----------------------+
| host | user | plugin |
+-----------+------------------+-----------------------+
| localhost | local-user | caching_sha2_password |
+-----------+------------------+-----------------------+
5 rows in set (0.03 sec)
mysql> ALTER USER 'local-user'@"localhost" IDENTIFIED WITH mysql_native_password BY '{password}';
公式によると、MySQL8.0からデフォルトの認証プラグインがcaching_sha2_password
に変更されたようです。(以前はmysql_native_password
)
ただ、Sequel Pro
等のツールはまだ新しい認証プラグインに対応していない場合があるようです。
なので、mysql_native_password
に戻す必要があるようです。