【88日目】AWS Cloud9でMySQLで新規Railsアプリを立ち上げる際のエラー

つい先日までパーフェクトPHPガーなどと言っていたのに突然のRailsで申し訳ありません。
実は神里さん（@yoshito410kam）という方のオンラインサロンで[「チーム開発が経験できる」プログラミング初学者向けの企画](https://note.mu/yoshitokamizato/n/ne9fb7cd06b46)がある（現在は募集中断？）とのことで、言語は違ったのですが、思い切って参加しました。

チームでgitのブランチを切ってプルリクやマージを活用する経験は一人ではなかなかできないため、自分の学習を中断してでも参加する価値があると考えたからです。

まずチーム開発を開始する前に課題があるとのことで、その課題をやる必要があるため、パーフェクトPHPは一旦中断となります。

==================================================================================
# MySQLのインストールのエラー
さて、早速環境構築でつまづきました。
Cloud9でMySQLを使ってRailsアプリを新規作成して、Hello Worldを表示するアプリを作成する内容です。
実は私もRailsで簡単な掲示板は作成した経験があるので、簡単簡単と思ったのですが、初手で沼りました。

```
# MySQLを指定してrailsアプリを新規作成
$ rails new hello_sample -d mysql
```

はい早速エラーです。

```
An error occurred while installing mysql2 (0.5.2), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.5.2' --source 'https://rubygems.org/'` succeeds before bundling.
```

どうもgemの`mysql2`のインストールに何かエラーが起きた模様。

yumでパッケージをインストールしてみます。

```
$ sudo yum install mysql-devel
Loaded plugins: priorities, update-motd, upgrade-helper
# 中略
Complete!
```

うまく言ったようです。
もう1度`rails new`を試してみると、今度はうまく通りました。

# ソケットがないよのエラー
やったできたと思って今度はデータベースを作成

```
$ bundle exec rails db:create
#<Mysql2::Error::ConnectionError: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)>
Couldn't create database for {"adapter"=>"mysql2", "encoding"=>"utf8", "pool"=>5, "username"=>"root", "password"=>nil, "host"=>"localhost", "database"=>"hello_sample_development"}, {:charset=>"utf8"}
(If you set the charset manually, make sure you have a matching collation)
Created database 'hello_sample_development'
#<Mysql2::Error::ConnectionError: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)>
Couldn't create database for {"adapter"=>"mysql2", "encoding"=>"utf8", "pool"=>5, "username"=>"root", "password"=>nil, "host"=>"localhost", "database"=>"hello_sample_test"}, {:charset=>"utf8"}
(If you set the charset manually, make sure you have a matching collation)
Created database 'hello_sample_test'
```

はいエラーですorz

まず現在のソケットは`socket '/var/lib/mysql/mysql.sock'`になっている模様。
※後からでも`mysql_config --socket`で確認できます。
しかし、こんなファイルは存在していない(と思う)。

- つまり、ソケットを作るか？
- それともソケットの場所を変えるか？

どちらかが必要になろうと仮説を立てた。

が、データベースはいじったら再起動が基本らしい。まずは試してみる。

```
$ sudo /etc/init.d/mysqld restart
Stopping mysqld:                                           [  OK  ]
Initializing MySQL database:  Installing MySQL system tables...
191117  8:11:45 [Note] Ignoring --secure-file-priv value as server is running with --bootstrap.
191117  8:11:45 [Note] /usr/libexec/mysql55/mysqld (mysqld 5.5.62) starting as process 15545 ...
OK
Filling help tables...
191117  8:11:45 [Note] Ignoring --secure-file-priv value as server is running with --bootstrap.
191117  8:11:45 [Note] /usr/libexec/mysql55/mysqld (mysqld 5.5.62) starting as process 15552 ...
OK

To start mysqld at boot time you have to copy
support-files/mysql.server to the right place for your system

PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:

/usr/libexec/mysql55/mysqladmin -u root password 'new-password'
/usr/libexec/mysql55/mysqladmin -u root -h ip-172-31-31-51 password 'new-password'

Alternatively you can run:
/usr/libexec/mysql55/mysql_secure_installation

which will also give you the option of removing the test
databases and anonymous user created by default.  This is
strongly recommended for production servers.

See the manual for more instructions.

You can start the MySQL daemon with:
cd /usr ; /usr/libexec/mysql55/mysqld_safe &

You can test the MySQL daemon with mysql-test-run.pl

cd /usr/mysql-test ; perl mysql-test-run.pl

Please report any problems at http://bugs.mysql.com/

                                                           [  OK  ]
Starting mysqld:                                           [  OK  ]
```

再起動ができました。
再起動したら、改めてデータベースを作成する。

```
$ bundle exec rails db:create
Created database 'hello_sample_development'
Created database 'hello_sample_test'
```

できました。

# そんなディレクトリ見当たらないんだけど・・・？　→`/`はルートディレクトリ
めでたしめでたし、ちゃんとデータベースは作成できました。

それはいいけど
`/etc/init.d/mysqld`とか、`/var/lib/mysql/mysql.sock`ってどこにあるのって思う人も多いと思います。
多分今いるディレクトリで`ls -a`とか試しても出てこないんだが？　と言う方もいるかと。

例えば/etc/init.d/mysqld`の先頭の`/`はルートディレクトリと言って、一番根元のディレクトリのことです。
なので

```
$ cd /
$ ls -a
.   .autofsck     bin   cgroup  etc   lib    local       media  nvm-install.txt  proc  run   selinux  sys  usr
..  .autorelabel  boot  dev     home  lib64  lost+found  mnt    opt              root  sbin  srv      tmp  var
```

とすれば`/etc`も`/var`も見つかるので安心してください。

# Rails起動時にまたエラー
では早速`rails s`しようと思ったところ、またブラウザにエラー画面が・・・

```
Mysql2::Error::ConnectionError
Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
```

どうもローカルのサーバーのソケットに接続できない模様。
パッと思いついたのは権限がないのかな、と。

### 権限を付与してみる

所有権を付与するchownと言うのがありますね。これで権限を付与できるようです。

```
$ sudo chown mysql:mysql /var/lib/mysql/mysql.sock
```

その後再起動
データベースいじったら必ず再起動です。

```
$ sudo /etc/init.d/mysqld restart
```

改めて`rails s`

# Yay! You're in Rails!

繋がりました