AWS EC2 AmazonLinux2の中にMySQLを入れたがすんなり起動してくれず、いろいろやってターミナルからMySQLにログインできるようにした話(駄々流し)

## 〜宣伝〜

:::note info
個人開発でエンジニア専門マッチングサービスを開発しましたので、是非未経験からエンジニア目指している人！現役エンジニアで教えたい人！使ってみてください！

β版リリース記念キャンペーン中です！

10名様限定、抽選でお好きな技術本1冊プレゼント！
🎉当選者にはメッセージ差し上げます(送付の際に住所はお聞きしません)
詳しくはこちらから↓

https://x.com/dokupro01/status/1796837336145436846
:::
https://dokupro.dev/

# 目的

- 記事名の問題が発生し非常に時間が取られたため解決までの経緯を簡単にまとめる

# 実施環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.5) |
| ハードウェア | MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) |
| プロセッサ | 2 GHz クアッドコアIntel Core i5 |
| メモリ | 32 GB 3733 MHz LPDDR4 |
| グラフィックス | Intel Iris Plus Graphics 1536 MB |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| AWS EC2 AmazonLinux2 | WSA12ヶ月の無料枠のスペックで作成した | こちらの方法と同じ方法で作成→[AWS EC2 をMacで使ってみよう!]() |

# 前提情報

- EC2にてインスタンスを作成し、httpd(Apache)のドキュメントルート直下にindex.htmlを設置しブラウザからindex.htmlが表示されていることを確認した。

# すいません

- 解決までの経緯の途中まで`$ sudo service mysqld start`のコマンドを`$ sudo service mysql start`と勘違いしています。筆者が問題解決に至った道のりとしては下記に記載されている物が正しいですが、解決まで非常に遠回りをしてしまっています。申し訳ありません。
- 問題解決を第1に考え実施したため、本来推奨されないコマンドを実行している可能性があります。ご了承ください。

# 問題発生までの作業

1. EC2のAmazonLinux2(無料枠)のインスタンスを作成してSSHを用いて自分のMacのターミナルからログインした。
1. AmazonLinux2の中で下記コマンドを実行して(後述するコマンドは全てAmazonLinux2の中で実行する)httpd(Apache)とmysqld(MySQL)をインストールした。

    ```terminal
    $ sudo yum install -y httpd mysql
    ```
1. AmazonLinux2の中のhttpdのドキュメントルートにindex.htmlを設置してブラウザ側で表示を行い、httpd(Apache)の動作を確認した。
1. 下記コマンドを実行してysqld(mysqlデーモン)を起動させた。

    ```terminal
    $ sudo service mysqld start
    ```

# 問題

1. mysqldの起動コマンドを実行した際に下記が出力された。

    ```terminal
    $ sudo service mysqld start
    >Redirecting to /bin/systemctl start mysqld.service
    >Failed to start mysqld.service: Unit not found.
    ```

# 解決までの経緯

1. MySQLではなくMariaDBが入ってしまっている様なのでMariaDBを取り除く。下記コマンドを実行してMariadbがyumでインストールされているか確認する。

    ```terminal
    $ yum list installed | grep mariadb
    ```
1. 先のコマンドで下記の様な出力が得られたのでMariaDBがインストールされてしまっている。

    ```terminal
    >mariadb.x86_64                        1:5.5.64-1.amzn2                 @amzn2-core
    >mariadb-libs.x86_64                   1:5.5.64-1.amzn2                 installed
    ```
1. 下記コマンドを実行してMariaDBとMySQLに関連する物を削除する。（MySQLも削除しているのは深い意味はなく、これからしっかりとした方法でMySQLをインストールするので現時点で余計なものが入っていたらいやなのでまっさらな状態にしたかったから）

    ```terminal
    $ sudo yum remove mariadb-libs
    $ sudo yum remove mysql*
    ```
1. 下記を実行しても何も出力されないことを確認する。

    ```terminal
    $ yum list installed | grep mariadb
    ```
1. 下記コマンドを実行してMySQL 8.0 のリポジトリをyumに追加する。

    ```terminal
    $ sudo yum localinstall -y https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
    ```
1. 下記コマンドを実行してMySQL 5.7のリポジトリを無効にする。

    ```terminal
    $ sudo yum-config-manager --disable mysql57-community
    ```
1. 下記コマンドを実行してMySQL 8.0のリポジトリを有効にする。

    ```terminal
    $ sudo yum-config-manager --enable mysql80-community
    ```
1. 下記コマンドを実行してMySQLをインストールする。

    ```terminal
    $ sudo yum install -y mysql
    ```
1. 下記コマンドを実行してMySQLのバージョンを確認する。

    ```terminal
    $ mysql --version
    ```
1. 先のコマンドの出力でMySQL 8.0.XXが入っていることが確認できた。筆者の環境の出力の例を下記に記載する。

    ```terminal
    >mysql  Ver 8.0.20 for Linux on x86_64 (MySQL Community Server - GPL)
    ```
1. 下記コマンドを実行してみてmysqldの起動を試してみる。

    ```terminal
    $ sudo service mysqld start
    ```
1. 問題は解決していない。先のコマンドの出力を下記に記載する。

    ```terminal
    >Redirecting to /bin/systemctl start mysqld.service
    >Failed to start mysqld.service: Unit not found.
    ```
1. 下記コマンドを実行してMySQLにログインできるか試してみた。

    ```terminal
    $ mysql -u root -p
    ```
1. MySQLのrootユーザのパスワードは未設定のため、パスワードは未入力でEnterを押下するとかきのエラーが得られた。

    ```terminal
    >ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
    ```
1. エラーコード(2)はディレクトリかファイルが存在しないエラーである。したがって下記コマンドを実行して`/var/lib/mysql/mysql.sock`を作成する。(エラーコードは本来`$ perror エラーコードの数字`で内容を出力できるがcommand not foundになったためこちらのサイトを参考にさせていただいた→[ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'(2)→(13)→(111)→起動](https://saton2.hatenablog.com/entry/2018/10/16/200616))

    ```terminal
    $ sudo mkdir -p /var/lib/mysql
    $ sudo touch /var/lib/mysql/mysql.sock 
    ```
1. 下記コマンドを実行してMySQLにログインできるか試してみた。

    ```terminal
    $ mysql -u root -p
    ```
1. MySQLのrootユーザのパスワードは未設定のため、パスワードは未入力でEnterを押下するとかきのエラーが得られた。エラーコードの内容が変化したことがわかった。エラーコード13は読み込み先のファイルの権限のエラーである。sudoを用いて作成したため権限がrootのみになっている様である。

    ```terminal
    >ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (13)
    ```
1. 下記コマンドを実行してファイルの先に作成したファイルの権限を修正した。

    ```terminal
    $ sudo chmod 777 /var/lib/mysql/mysql.sock
    ```
1. 下記コマンドを実行してMySQLにログインできるか試してみた。

    ```terminal
    $ mysql -u root -p
    ```
1. MySQLのrootユーザのパスワードは未設定のため、パスワードは未入力でEnterを押下するとかきのエラーが得られた。エラーコード111はMySQLのサービスそのものが存在しないか、アクセスすることができないエラーである。

    ```terminal
    >ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (111)
    ```
1. 下記コマンドを実行してMySQLのステータスを確認した

    ```terminal
    $ sudo systemctl status mysql
    ```
1. MySQLのサービスが存在しない旨が出力された。下記に先のコマンドの出力を記載する。

    ```terminal
    >Unit mysql.service could not be found.
    ```

1. 下記コマンドを実行して現在インストールされているMySQL関連のリストを出力する。

    ```terminal
    $ yum list installed mysql*
    ```

1. 先のコマンドで現在インストールされているMySQL関連のリストが出力された。

    ```terminal
    mysql-community-client.x86_64                                               8.0.20-1.el7                                           @mysql80-community
    mysql-community-common.x86_64                                               8.0.20-1.el7                                            @mysql80-community
    mysql-community-libs.x86_64                                                 8.0.20-1.el7                                            @mysql80-community
    mysql80-community-release.noarch                                            el7-3                                                   installed
    ```

1. 正常にMySQLにログインできる環境の`$ yum list installed mysql*`の実行例が下記になる。

    ```terminal
    mysql-community-client.x86_64                                               8.0.20-1.el7                                            @mysql80-community
    mysql-community-common.x86_64                                               8.0.20-1.el7                                            @mysql80-community
    mysql-community-devel.x86_64                                                8.0.20-1.el7                                            @mysql80-community
    mysql-community-libs.x86_64                                                 8.0.20-1.el7                                            @mysql80-community
    mysql-community-server.x86_64                                               8.0.20-1.el7                                            @mysql80-community
    mysql80-community-release.noarch                                            el7-3                                                   installed
    ```
1. 比較すると「mysql-community-devel.x86_64」と「mysql-community-server.x86_64」が足りていないことがわかったので下記コマンドを実行してインストールを行う。

    ```terminal
    $ sudo yum install mysql-community-devel
    $ sudo yum install mysql-community-server
    ```
1. 下記コマンドを実行してMySQLのステータスを確認した

    ```terminal
    $ sudo systemctl status mysql
    ```
1. MySQLのサービスが存在しない旨が出力された。下記に先のコマンドの出力を記載する。

    ```terminal
    >Unit mysql.service could not be found.
    ```
1. 下記コマンドを実行してMySQLのステータスを確認した

    ```terminal
    $ sudo systemctl status mysqld
    ```
1. mysqldのステータスが出力された。

    ```terminal
    >● mysqld.service - MySQL Server
    >   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
    >   Active: inactive (dead)
    >     Docs: man:mysqld(8)
    >           http://dev.mysql.com/doc/refman/en/using-systemd.html
    ```
1. 下記コマンドを実行してmysqldをスタートさせた。

    ```terminal
    $ sudo service mysqld start
    ```
1. mysqldをスタートできないエラーが出力された。

    ```terminal
    >Redirecting to /bin/systemctl start mysqld.service
    >Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe" for details.
    ```
1. 先のエラーの指示通り下記コマンドを実行した。

    ```terminal
    $ systemctl status mysqld.service
    ```
1. mysqldの起動時のログが出力された。

    ```terminal
    >Jun 04 05:47:33 ip-172-31-6-249.ap-northeast-1.compute.internal systemd[1]: Starting MySQL Server...
    >Jun 04 05:47:34 ip-172-31-6-249.ap-northeast-1.compute.internal systemd[1]: mysqld.service: main process exited, code=exited, status=1/FAILURE
    >Jun 04 05:47:34 ip-172-31-6-249.ap-northeast-1.compute.internal systemd[1]: Failed to start MySQL Server.
    >Jun 04 05:47:34 ip-172-31-6-249.ap-northeast-1.compute.internal systemd[1]: Unit mysqld.service entered failed state.
    >Jun 04 05:47:34 ip-172-31-6-249.ap-northeast-1.compute.internal systemd[1]: mysqld.service failed.
    ```
1. 先のmysqld起動時のログを訳してみた。

    ```terminal
    >MySQLサーバーを起動しています...
    >mysqld.service：メインプロセスが終了しました、コード=終了、ステータス= 1 / FAILURE
    >MySQLサーバーの起動に失敗しました。
    >ユニットmysqld.serviceが障害状態に入りました。
    >mysqld.serviceが失敗しました。
    ```
1. mysqldが起動時に終了コード1を返して終了してしまっていることがわかった。
1. mysqldの詳細な起動ログを確認するために、下記コマンドを実行してログ出力ファイルを作成する。

    ```terminal
    $ sudo touch /var/log/mysqld.log
    ```

1. 下記コマンドを実行してmysqldの起動を試してみる。

    ```terminal
    $ sudo service mysqld start
    ```
1. 下記コマンドを実行してmysqldの起動ログを確認する。
    
    ```terminal
    $ sudo vi /var/log/mysqld.log
    ```
1. 下記に起動に失敗したmysqldの関係ありそうな部分を記載する。

    ```terminal
    Running transaction check
    2020-06-04T05:47:33.304921Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.20) initializing of server in progress as process 12912
    2020-06-04T05:47:33.331054Z 0 [ERROR] [MY-010457] [Server] --initialize specified but the data directory has files in it. Aborting.
    2020-06-04T05:47:33.331093Z 0 [ERROR] [MY-013236] [Server] The designated data directory /var/lib/mysql/ is unusable. You can remove all files that the server added to it.
    2020-06-04T05:47:33.332223Z 0 [ERROR] [MY-010119] [Server] Aborting
    2020-06-04T05:47:33.348660Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.20)  MySQL Community Server - GPL.
    2020-06-04T05:47:34.325780Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.20) starting as process 12938
    2020-06-04T05:47:34.366139Z 1 [ERROR] [MY-011011] [Server] Failed to find valid data directory.
    2020-06-04T05:47:34.366277Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
    2020-06-04T05:47:34.366342Z 0 [ERROR] [MY-010119] [Server] Aborting
    2020-06-04T05:47:34.367195Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.20)  MySQL Community Server - GPL.
    2020-06-04T05:59:09.959372Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.20) initializing of server in progress as process 13025
    2020-06-04T05:59:09.961002Z 0 [ERROR] [MY-010457] [Server] --initialize specified but the data directory has files in it. Aborting.
    2020-06-04T05:59:09.961028Z 0 [ERROR] [MY-013236] [Server] The designated data directory /var/lib/mysql/ is unusable. You can remove all files that the server added to it.
    2020-06-04T05:59:09.961080Z 0 [ERROR] [MY-010119] [Server] Aborting
    2020-06-04T05:59:09.961198Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.20)  MySQL Community Server - GPL.
    2020-06-04T05:59:10.251551Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.20) starting as process 13027
    2020-06-04T05:59:10.259980Z 1 [ERROR] [MY-011011] [Server] Failed to find valid data directory.
    2020-06-04T05:59:10.260116Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
    2020-06-04T05:59:10.260165Z 0 [ERROR] [MY-010119] [Server] Aborting
    2020-06-04T05:59:10.260743Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.20)  MySQL Community Server - GPL.
    ```
1. エラー内容を日本語に訳した物を下記に記載する。

    ```terminal
    トランザクションチェックの実行
     / usr / sbin / mysqld（mysqld 8.0.20）プロセス12912として進行中のサーバーの初期化
    --initializeが指定されていますが、データディレクトリにファイルがあります。中止しています。
    指定されたデータディレクトリ/ var / lib / mysql /は使用できません。サーバーが追加したすべてのファイルを削除できます。
    中止しています
     / usr / sbin / mysqld：シャットダウン完了（mysqld 8.0.20）MySQL Community Server-GPL。
     / usr / sbin / mysqld（mysqld 8.0.20）プロセス12938として開始
    有効なデータディレクトリが見つかりませんでした。
    データディクショナリの初期化に失敗しました。
    中止しています
     / usr / sbin / mysqld：シャットダウン完了（mysqld 8.0.20）MySQL Community Server-GPL。
     / usr / sbin / mysqld（mysqld 8.0.20）サーバーの初期化をプロセス13025として進行中
    --initializeが指定されていますが、データディレクトリにファイルがあります。中止しています。
    指定されたデータディレクトリ/ var / lib / mysql /は使用できません。サーバーが追加したすべてのファイルを削除できます。
    中止しています
     / usr / sbin / mysqld：シャットダウン完了（mysqld 8.0.20）MySQL Community Server-GPL。
     / usr / sbin / mysqld（mysqld 8.0.20）プロセス13027として開始
    有効なデータディレクトリが見つかりませんでした。
    データディクショナリの初期化に失敗しました。
    中止しています
     / usr / sbin / mysqld：シャットダウン完了（mysqld 8.0.20）MySQL Community Server-GPL。
    ```
1. /var/lib/mysql/ディレクトリ直下にディレクトリやファイルが存在しているため起動ができていないとエラーが出ている。
1. 下記コマンドを実行して/var/lib/mysqlディレクトリから削除する。

    ```terminal
    $ sudo rm -rf /var/lib/mysql
    ```
1. 下記コマンドを実行してmysqldの起動を試してみる。

    ```terminal
    $ sudo service mysqld start
    ```
1. エラーが出ずに正常にmysqldが起動できた。
1. 下記コマンドを実行してmysqldのステータスを確認する。

    ```terminal
    $ systemctl status mysqld.service
    ```
1. 下記の様に出力されたため正常なmysqldの起動を確認できた。

    ```terminal
    ● mysqld.service - MySQL Server
       Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
       Active: active (running) since Thu 2020-06-04 06:12:59 UTC; 6min ago
         Docs: man:mysqld(8)
               http://dev.mysql.com/doc/refman/en/using-systemd.html
      Process: 11780 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
     Main PID: 11854 (mysqld)
       Status: "Server is operational"
       CGroup: /system.slice/mysqld.service
               └─11854 /usr/sbin/mysqld
    ```
1. 下記の方法を実施してMySQLのrootパスワードを変更した。
    - [MySQL 8.0.18 のrootパスワードを忘れた時のリセット方法](https://qiita.com/miriwo/items/1880e9d2ebcfd3c0e60d)
1. 下記コマンドを実行してMySQLにログインする。

    ```terminal
    $ mysql -u root -p
    ```


# 参考文献

- [ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'(2)→(13)→(111)→起動](https://saton2.hatenablog.com/entry/2018/10/16/200616)
- [AWSのEC2で行うAmazon Linux2（MySQL5.7）環境構築](https://qiita.com/2no553/items/952dbb8df9a228195189)
- [EC2にMySQLインストールと設定確認](https://qiita.com/toshihirock/items/c5933d3628c7d4e81ffa)
- [【AWS EC2】Amazon Linux2にMySQLのclientだけをインストールしてRDSに接続する方法](https://qiita.com/tamorieeeen/items/d9b2af588f1dfd43120d)
- [MySQLが動かない場合にまずログを確認できるようにしよう](https://www.techry.net/blogs/2971)
- [「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典 mysqld](https://wa3.i-3-i.info/word13578.html)
- [--initialize specified but the data directory has files in it. Aborting.](https://qiita.com/ksilverwall/items/2efa8d787e8e02714ea4)
- [2.5.1 MySQL Yum リポジトリを使用して MySQL を Linux にインストールする](https://dev.mysql.com/doc/refman/5.6/ja/linux-installation-yum-repo.html)