mysql2をbundle installするとエラーになる（AWS cloud9 Ubuntu18.04)

railsのDBをdevelopment, production環境共にMySQLに変えるため
Gemfileにmysql2を記述してbundle installしたらエラーが出たので色々調べてみた。

# 環境
・Rails 6.0.3
・Ubuntu 18.04
・MySQL 8.0.25 

# エラー内容

```
 $ bundle install
The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32, java. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32 java`.
.
.
.
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/mysql2-0.5.3/ext/mysql2
/home/ubuntu/.rvm/rubies/ruby-2.6.3/bin/ruby -I /home/ubuntu/.rvm/rubies/ruby-2.6.3/lib/ruby/2.6.0 -r ./siteconf20210512-4404-8ubcpu.rb extconf.rb
checking for rb_absint_size()... yes
checking for rb_absint_singlebit_p()... yes
checking for rb_wait_for_single_fd()... yes
checking for -lmysqlclient... no
-----
mysql client is missing. You may need to 'sudo apt-get install libmariadb-dev', 'sudo apt-get install libmysqlclient-dev' or 'sudo yum install mysql-devel',
and try again.
-----
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
        --with-opt-dir
        --without-opt-dir
        --with-opt-include
        --without-opt-include=${opt-dir}/include
        --with-opt-lib
        --without-opt-lib=${opt-dir}/lib
        --with-make-prog
        --without-make-prog
        --srcdir=.
        --curdir
        --ruby=/home/ubuntu/.rvm/rubies/ruby-2.6.3/bin/$(RUBY_BASE_NAME)
        --with-mysql-dir
        --without-mysql-dir
        --with-mysql-include
        --without-mysql-include=${mysql-dir}/include
        --with-mysql-lib
        --without-mysql-lib=${mysql-dir}/lib
        --with-mysql-config
        --without-mysql-config
        --with-mysql-dir
        --without-mysql-dir
        --with-mysql-include
        --without-mysql-include=${mysql-dir}/include
        --with-mysql-lib
        --without-mysql-lib=${mysql-dir}/lib
        --with-mysqlclientlib
        --without-mysqlclientlib

To see why this extension failed to compile, please check the mkmf.log which can be found here:

  /home/ubuntu/.rvm/gems/ruby-2.6.3/extensions/x86_64-linux/2.6.0/mysql2-0.5.3/mkmf.log

extconf failed, exit code 1

Gem files will remain installed in /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/mysql2-0.5.3 for inspection.
Results logged to /home/ubuntu/.rvm/gems/ruby-2.6.3/extensions/x86_64-linux/2.6.0/mysql2-0.5.3/gem_make.out

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

In Gemfile:
  mysql2
```

bundle installをしてみると、上のようなエラーが出てきたので
とりあえずググってみると参考になる記事がいくつかヒットしたので
これらを参考にさせて頂き色々試してみた。

・[【Rails】MySQL2がbundle installできない時の対応方法](https://qiita.com/fukuda_fu/items/463a39406ce713396403)
・[Cloud9でRailsプロジェクトを作成しよう](https://qiita.com/kumas/items/e2c647dca08fd46b5c7a)
・[【備忘録】ubuntuでbundle installするとmysqlでこける](http://smot93516.hatenablog.jp/entry/2018/05/30/131842)


# やってみたこと
### ①LDFLAGSやCPPFLAGSの設定を変えてみる
１つ目の記事を参考に下のコードをそのまま実行して、
その後bundle installをしてみた。

```
$ bundle config --local build.mysql2 "--with-cppflags=-I/usr/local/opt/openssl/include"
$ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib"
```

しかし、最初のbundle installと同じエラーメッセージが出てしまった。
おそらく１つ目の記事はmac OSの場合、有効な方法だったのかもしれない

### ②sudo yum install mysql-develを実行してみる

次に２つ目の記事を参考に
こちらのコードを実行してみると

```
$ sudo yum install mysql-devel
sudo: yum: command not found
```

yumコマンドが見つからないとなったので、
これについても色々と調べると
それっぽいコマンドが見つかったが

そもそもyumはRedhat系のlinuxで使われるパッケージ管理システムで

Debian系のubuntuではaptやapt-getを使うのが普通なので
apt-getで解決できる方法を探すことにした。


### ③sudo apt-get install libmariadb-dev と libmysqlclient-devを実行してみる

３つ目の記事では

```
$ sudo apt install libmysqlclient-dev
```
というコマンドが用いられていたが
Ubuntuのバージョンが違かったので

これを参考にしつつ最初のエラーメッセージにあったヒントを用いることにした。
用いたエラーメッセージを抜粋

```
-----
mysql client is missing. You may need to 'sudo apt-get install libmariadb-dev', 'sudo apt-get install libmysqlclient-dev' or 'sudo yum install mysql-devel',
and try again.
-----
```

このメッセージには３つのコマンドが書いてあり
３つ目は既に試してある。

残った２つを見てみると参考にした記事にあったコードと似たものがあった。

apt-getから始まるコマンド２つ or yumから始まるコマンド
を実行してみる必要があるとのことだったので

そこで
２つのコマンドを試してみることにした。

```
$ sudo apt-get install libmariadb-dev
Reading package lists... Done
Building dependency tree       
Reading state information... Done
.
.
.
(たくさんコードがあって）
.
.
.
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...
Processing triggers for libc-bin (2.27-3ubuntu1.4) ...

```


```
$ sudo apt-get install libmysqlclient-dev
Reading package lists... Done
Building dependency tree
Reading state information... Done
.
.
.
(たくさんコードがあって）
.
.
.
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...
Processing triggers for libc-bin (2.27-3ubuntu1.4) ...
```

特にエラーメッセージは発生せず
「これは行けそう！」と思いながら

そのままbundle installを実行

```
$ bundle install
（色々コードが出てきて）
.
.
.

Bundle complete! 17 Gemfile dependencies, 76 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
```

「いけたー！」
これにて無事にインストールができた。


#結論

Ubuntu18.04の場合は

```
$ sudo apt-get install libmariadb-dev
$ sudo apt-get install libmysqlclient-dev
```

を実行すればbundle installができるようになる。


とりあえず解決はできたが
yumやapt-getの知識が全然ないので調べておく必要があるなと思った。


# 余談

```
-----
mysql client is missing. You may need to 'sudo apt-get install libmariadb-dev', 'sudo apt-get install libmysqlclient-dev' or 'sudo yum install mysql-devel',
and try again.
-----
```

最初にこのエラーメッセージを「どれか１つ選んで実行すれば良い」と勘違いして
`$ sudo apt-get install libmysqlclient-dev`だけを実行してしまい
`$ bundle exec rails db:create`を実行する時に

```
rails aborted!
LoadError: libmysqlclient.so.20: cannot open shared object file: No such file or directory - /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/mysql2-0.5.3/lib/mysql2/mysql2.so
```


というエラーが起きてしまったので
2つのコマンドを実行しないといけないということが分かりました。