MySQL $ mysql.server startコマンドと$ systemctl start mysqldコマンドの違いを調べてみた

## 目的

- 記事名に記載したMySQLを起動するコマンドの違いが分からずモヤモヤ認め簡単に調べてまとめる。

## 実施環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| 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 |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| MySQLバージョン | 8.0.19 for osx10.15 on x86_64 (Homebrew) | Homwbrewを用いて導入 |

## この記事より詳しくてわかりやすい参考文献

- [MySQL公式ドキュメント 2.10.5 MySQLの自動起動と停止](https://dev.mysql.com/doc/refman/8.0/en/automatic-start.html)

## ことの発端

- AWS EC2 AmazonLinux2 インスタンスにて`$ mysql.server start`コマンドを実行したがMySQLを起動することができなかった。
- MySQLのサーバを起動するコマンドを探していたところ技術ブログやQiitaなどで複数のコマンドでMySQLは起動できることがわかった。
- 同じMySQLの起動なのにどうしていろいろなコマンドで起動できるのか気になった。

## `$ mysql.server start`コマンド

- 筆者がMacのローカル環境にあるMySQLを起動する際に最もよく使用するコマンドである。
- `$ mysql.server オプション`のコマンドに関しては下記の様な記載があった。(先に記載した参考文献のページより抜粋)

    ```text
    On systems that use System V-style run directories (that is, /etc/init.d and 
    run-level specific directories), invoke mysql.server. 
    This script is used primarily at system startup and shutdown. 
    It usually is installed under the name mysql. 
    The mysql.server script starts the server by invoking mysqld_safe. See Section 4.3.3, “mysql.server — MySQL Server Startup Script”.
    ```
- 先の内容の訳を下記に記載する。

    ```text
    System Vスタイルの実行ディレクトリ（つまり、/ etc / init.dおよび実行レベル固有のディレクトリ）を使用するシステムでは、mysql.serverを呼び出します。 
    このスクリプトは、主にシステムの起動時とシャットダウン時に使用されます。 
    通常、mysqlという名前でインストールされます。 
    mysql.serverスクリプトは、mysqld_safeを呼び出してサーバーを起動します。
    セクション4.3.3「mysql.server — MySQLサーバー起動スクリプト」を参照してください。
    ```
- まとめると「とある実行ディレクトリ(/etc/init.d)を使用するシステム上では`$ mysql.server`コマンドを使用してMySQLの起動、停止を行うことができる。」と言った感じである。
- `/etc/init.d`のディレクトリの実行ファイルを使用して動いているシステム上では`$ mysql.server オプション`コマンドを使用することができる様だ。(おそらく)
- さらに詳しく記載された公式ドキュメント→[4.3.3 mysql.server — MySQL Server Startup Script](https://dev.mysql.com/doc/refman/8.0/en/mysql-server.html)

## `$ sudo systemctl start mysqld`コマンド

- AWS EC2 AmazonLinux2のインスタンスの中でMySQLを起動する際に使用するコマンドである。
- `$ systemctl start mysqld`コマンドに関しては下記の様な記載があった。

    ```text
    Invoke mysqld directly. This works on any platform.
    ```
- 先の内容の訳を下記に記載する。

    ```text
    mysqldを直接 呼び出します。これはどのプラットフォームでも機能します。
    ```
- まとめると「mysqldと直接起動、停止することができ、環境に依存することなく実行することができる。」と行った感じである。
- mysqldはMySQLサーバとも呼ばれており、これはMySQLのメインプログラムと行っても過言ではないほど多くの仕事をしている。
- MySQL内に`create database`で作成されたDBやそのテーブへのアクセス管理などもmysqldが実施している。
- よって本コマンドはMySQLの中核的なメインプログラムを直接起動、停止するコマンドということになる(おそらく)
- さらに詳しく記載されたドキュメント群
    - [4.3.1 mysqld — The MySQL Server](https://dev.mysql.com/doc/refman/8.0/en/mysqld.html)
    - [「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典 mysqld](https://wa3.i-3-i.info/word13578.html)

## まとめ

- 下記にMySQLの起動、停止を行うコマンドで自分に関係しそうな物の使用条件を表でまとめる。

    | コマンド | 使用システムの実行ディレクトリ`/etc/init.d`の環境 | 使用システムの実行ディレクトリ`/etc/init.d`以外の環境 |
    | --- | --- | --- |
    | `$ mysql.server start`コマンド | 実行できる | 実行できる |
    | `$ sudo systemctl start mysqld`コマンド | 実行できる | 実行できる |
- `$ sudo systemctl start mysqld`コマンドなら環境に依存せずにMySQLの起動を行うことが可能であるので、MySQLの起動は`$ sudo systemctl start mysqld`コマンドを一つだけ覚えておくことで事足りそうである。

## 余談

- 先の情報からMacのローカルのMySQLの起動は`$ mysql.server start`でよくて、AWS EC2 AmazonLinux2インスタンス内のMySQLの起動が`$ mysql.server start`でダメな理由は「AmazonLinux2インスタンスのシステムサービスの起動がSystem V スタイルの実行ディレクトリを使用していないため」である。
- 下記に先の結論に至ったリンクを記載する。
    - [4.3.3 mysql.server — MySQL Server Startup Script](https://dev.mysql.com/doc/refman/8.0/en/mysql-server.html)