Mysql ユーザー作成についてメモ。

## 経緯など

Ruby / Rails で作られたとあるアプリをローカル環境で動かそうとした際、rails s するまでに躓いた（そもそもマイグレーションなどがエラー）ので、その時の内容についてメモしておく。

結論を言うと、MySQL内で利用する「テストユーザー情報が存在していない」ことが原因だった。

恥ずかしながらMySQLにユーザーを追加するなど、生まれてこの方やったことがなかったので、先輩に相談して「そのテストユーザー作った？」から解消にこぎつけることができた。

こんな私に優しく教えてくれた先輩には感謝しかない。ざす！

### db:migrate を実行するも失敗

色々省略するが、マイグレーションを実行したがエラーが出ていた。なぜdenied されるんだ！と思いながらググりまくっていた。（今思えばtestuser が、denied されている〜というのも納得。。）

```
$ bundle exec rake db:migrate
ruby/2.6.0 isn't supported by this pry-doc version
rake aborted!
Mysql2::Error: Access denied for user 'testuser'@'localhost' (using password: YES)
〜省略〜
```

### ユーザーの一覧を確認
※`$ mysql -u root -p` ＋`PW聞かれたら未入力のままEnter` によりMysqlの起動が必要。

```
mysql> select user, host from mysql.user;
```

### database.yml の記載内容

ちなみにdatabase.yml の設定内容は以下の通り。一部抜粋。


```:database.yml
  default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: testuser
  password: testpassword
```

### MySQLのバージョンを確認

これは解消法を進める際に確認した部分だが、ここに記載しておく。

```
$ mysqld --version
/usr/local/Cellar/mysql/8.0.18/bin/mysqld  Ver 8.0.18 for osx10.14 on x86_64 (Homebrew)
```



## 解消法

### ユーザーを追加するべし

今回、DBへの接続がdenied  されている原因は「ユーザーが作成されていないこと」だったので、ユーザーを追加することで解消できた。

ただし、MySQLのバージョンによって操作するコマンドが若干異なるようなのでメモる。
※`$ mysql -u root -p` ＋`PW聞かれたら未入力のままEnter` によりMysqlの起動が必要。


#### MySQL5.7 まで

```
# ユーザーの作成
mysql> create user 'testuser'@'localhost' identified by 'testpassword';

# 権限の付与（ユーザー作成も兼ねているので、create user は省略可能）
mysql> grant all on *.* to 'testuser'@'localhost' identified by 'testpassword';
```

- all：権限付与以外、全ての操作を許可する。
- \*.*：全DBへのアクセスを許可する。（[適用対象のデータベース].[適用対象のテーブル]）
- 'ユーザ名'@'ホスト名'：左記項目の指定。ホスト名の代わりにIPアドレスやlocalhost も指定可能。
- identified by 'パスワード'：任意のパスワードを設定。

#### MySQL8.0 以降

```
# ユーザーの作成
mysql> create user 'testuser'@'localhost' identified by 'testpassword';

# 権限の付与
mysql> grant all on *.* to 'testuser'@'localhost';
```

権限の付与を行う際、末尾に「with grant option」をつけることでGRANT権限（何でも出来る権限）を付与し、他のユーザに対して権限を付与することが可能となる。通常これは管理者用ユーザーにしか付与しない。



### 改めてmigrate (create)

```
$ bundle exec rake db:migrate
ruby/2.6.0 isn't supported by this pry-doc version
rake aborted!
ActiveRecord::NoDatabaseError: Unknown database 'es_development'
〜省略〜
```

実行してみたが、「DB無いよ」という事態に。（恥ずい。）

db:create をやってからmigrate 実行。

```
$ bundle exec rake db:create
Created database 'es_development'
Created database 'es_test'
〜省略〜
```

→create 完了。

```
$ bundle exec rake db:migrate
ruby/2.6.0 isn't supported by this pry-doc version
== 2018XXXXXXXXX CreateConstracts: migrating =================================
〜省略〜
== 2018XXXXXXXXX CreateConstracts: migrated (0.1449s) ========================
```

→migrate 完了。

### その他エラーの解消


この状態で```rails s```してみたものの、ここまで華麗にスルーしてきた下記エラーメッセージが表示されている状況。

```
ruby/2.6.0 isn't supported by this pry-doc version
〜省略〜
/home/money/.anyenv/envs/rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/puma-3.11.3/lib/puma/launcher.rb:130:in `initialize': No such file or directory @ rb_sysopen - /home/money/rails_projects/es_sample/tmp/pids/es_sample.pid (Errno::ENOENT)
```
※これについては先輩からのアドバイスにより、下記ファイルを修正することで解消できた。

```config/puma.rb
pidfile "#{_home}/rails_projects/#{_proj_name}/tmp/pids/#{_proj_name}.pid" #修正前
pidfile "#{_home}/Desktop/rails_projects/#{_proj_name}/tmp/pids/#{_proj_name}.pid" #修正後
```
→該当ファイルを格納しているフォルダのパスに合わせて修正。

```
rails s
```
→起動できた。







## おまけ

関連コマンドのメモ。


### 特定ユーザーの権限を確認

```
mysql> show grants for 'ユーザ名'@'ホスト名';
```