環境
os: centos7
RailsApp on Vagrant
mysql: 5.7.32
結論
ローカル環境だけならこの3ステップでOK
ユーザー作成
create user 'myapp'@'localhost' IDENTIFIED BY 'password'`;
権限設定
grant all on *.* to my_app@localhost;
設定反映
flush privileges;
概要
Vagrant上にRails環境を作り
db:create:all(開発用のデータベース作成)したところ
権限エラーで弾かれた、、、
確認したところ
VagrantFileで指定したホスト名 がMySQLのユーザー名として使われている
なので
同じ名前のMySQLユーザーを作成する必要がありそう
コマンド実行した際のログが以下
[vagrant@my_app app]$ bundle exec rake db:create:all
Start creating production like data
This task only modifies local databases. my_app_development is on a remote host.
This task only modifies local databases. my_app_development is on a remote host.
This task only modifies local databases. my_app_test is on a remote host.
Access denied for user 'my_app'@'localhost' (using password: NO)
Couldn't create 'my_app_production' database. Please check your configuration.
rake aborted!
Mysql2::Error: Access denied for user 'my_app'@'localhost' (using password: NO)
/home/vagrant/.rbenv/versions/2.5.5/bin/bundle:23:in `load'
/home/vagrant/.rbenv/versions/2.5.5/bin/bundle:23:in `<main>'
Tasks: TOP => db:create:all
(See full trace by running task with --trace)
ユーザーを作成する
ますは、MySQLにログインして新しくユーザーを作成します
Vagrant上でのユーザー名は、`my_app` になっているので
my_app@localhost というユーザーを新しく作成します!
MySQLにログイン
今回はrootユーザーでログインします。
mysql -u root -p
dbでmysqlを指定
ログインしたら、使用するデータベースを宣言します。
MySQLのユーザー情報は
mysqlという名前のデータベースに格納されています。
use mysql
ユーザーを作成
userテーブルが、MySQLのユーザー情報を管理しているテーブルなので
そこに新しいユーザーのレコードを作成します。
CREATE user 'myapp'@'localhost' IDENTIFIED BY 'password';
ユーザー名は、’ユーザー名’@’ホスト名’ の形で記述します。
@の前後をシングルコロンで囲んであげます。
IDENTIFIED BY でパスワードを指定できるので
こちらもシングルコロンで囲み、設定したいパスワードを入力します。
今回は、自分のローカルマシンでしか使わないので、passwordにしました。
ユーザーに権限を設定する
作成したばかりのユーザーは
dbを操作する権限を持っていないので
権限を与えてあげる必要があります。
権限を確認
このコマンドで、ユーザーに与えられている権限を確認することができます。
SHOW GRANTS FOR my_app@localhost;
初期の権限はこんな感じ
mysql> SHOW GRANTS FOR my_app@localhost;
+----------------------------------------------+
| Grants for my_app@localhost |
+----------------------------------------------+
| GRANT USAGE ON *.* TO 'my_app'@'localhost' |
+----------------------------------------------+
1 row in set (0.00 sec)
GRANT USAGE ON *.* TO ‘my_app’@’localhost’
となっていて、USAGE は何も権限を持っていない状態です。
ON *.* の *.* はスコープを表していて
これ(*.*)はグローバルレベルになります
スコープは
・グローバルレベル
・データベースレベル
・テーブルレベル
・カラムレベル
から選ぶことができます
今回はローカルでしか使わないため、グローバルですべての権限を設定します。
本番環境や、ステージング環境でユーザーを作成する場合には
適切な権限設定をしましょう。
グローバルの権限を与える
このコマンドで、グローバルの権限を付与します
GRANT all ON *.* TO my_app@localhost;
再度権限を確認してみます
SHOW GRANTS FOR my_app@localhost;
mysql> SHOW GRANTS FOR my_app@localhost;
+-------------------------------------------------------+
| Grants for my_app@localhost |
+-------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'my_app'@'localhost' |
+-------------------------------------------------------+
1 row in set (0.00 sec)
GRANT ALL PRIVILEGES ON *.* となっているので
ちゃんと設定されましたね!
設定を反映
権限を設定したら、FLUSH PRIVILEGES で権限設定をDBに反映します。
もしくは、MySQLを再起動させてもOKです。
FLUSH PRIVILEGES;
MySQLを再起動
設定の反映も行いましたが、念のためMySQLを再起動しておきましょう。
sudo は管理者権限でコマンドを実行する時に使います。
もし、管理者アカウントでOSを操作している場合は、sudoはつけなくて大丈夫です。
sudo systemctl restart mysqld.service
以上の手順でユーザーを作成し
再度 rake db:create を実行したところ、上手くデータベースを作成することができました!
こういった環境構築に付随してくる部分は
たまに抜け落ちてしまうので、今回の記事を備忘録代わりに
また環境構築を行う時に嵌らないようにしたいと思います。
同じような人にとって少しでも参考になりますように!