参加するプロジェクトのリポジトリクローンしてDB接続するのにハマったお話

# ハマるまでの概要と流れ
新しく参加するプロジェクト(PHP/Laravel10)のリポジトリをクローン→.envファイルに必要事項記載してDB接続しようとした際にmysqlが立ち上がらない沼り事案(MacbookM1使用)

# 結論と実施したこと
いろいろ細かな権限だの設定ファイルの修正だの必要な場合はあるのですが、**「結果的にこうやれば一発で行けたのか」** という流れが以下

1. mysqlアンインストール
`brew uninstall mysql`
2. mysqlインストール
`brew install mysql`
3. mysql接続
`brew services start mysql` ←これがポイント

### 失敗パターン
#### アンインストール→再インストール→`mysql.server start`で接続
![スクリーンショット 2024-06-17 15.33.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492127/929d6842-e49a-cf75-0f96-7d52787e1302.png)


### 成功パターン
#### アンインストール→再インストール→`brew services start mysql`で接続


![スクリーンショット 2024-06-17 15.29.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492127/6243a120-4cef-9dc1-cb70-961838b2e11d.png)


アンインストール→再インストール→`mysql.server start`で接続しようとしていて色々問題が発生していたので以下解説。

# では何が起こっていたのかを解説 
## `mysql.server start`と`brew services start mysql`の違いと問題点

### `mysql.server start`

- **概要**: `mysql.server`はMySQLの公式のスクリプトで、MySQLサーバーの起動や停止を管理します。通常、手動でインストールしたMySQLインスタンスを管理するために使用します。
- **動作**: 直接MySQLサーバープロセスを起動し、設定ファイル（通常は`/etc/my.cnf`）を読み込んで設定に従って起動します。

### `brew services start mysql`

- **概要**: Homebrewが提供するサービス管理ツールで、`launchctl`（macOSのサービス管理デーモン）を使ってサービスを管理します。`brew install`を使ってインストールしたMySQLを起動するために使用します。
- **動作**: MySQLをmacOSのシステムサービスとして登録し、システムが自動的に管理できるようにします。この方法で起動すると、MySQLはシステム再起動後も自動的に再起動されます。

## 今回の問題点の解説
長い説明になりますので、めんどくさいひとは最後の結論まで飛んじゃってください🚀

### 権限の問題

- **原因**: `mysql.server start`を実行した際に、エラーメッセージに「Permission denied」と表示されました。これは、MySQLサーバーのログファイルやPIDファイルに対する読み書き権限が正しく設定されていないためです。
- **対策**:
    - 正しい権限を持つユーザー（通常は`_mysql`ユーザー）にファイルやディレクトリの所有権を変更する必要があります。
    - `sudo chown -R _mysql:_mysql /opt/homebrew/var/mysql`を実行して所有権を変更しましたが、何度か試行錯誤が必要でした。

### 設定ファイルの問題

- **原因**: `/etc/my.cnf`ファイルが存在しないため、`mysql.server`が正しい設定を読み込めない可能性があります。
- **対策**: 設定ファイルを手動で作成し、適切な設定を行う必要があります。ただし、HomebrewでインストールされたMySQLはデフォルトの設定で動作するように設計されています。

## ポイントはコレ
### Homebrewのサービス管理
初心者用にはしょって解説すると、こいつは**権限の自動設定**をやってくれるらしい

- **利点**:
    - `brew services start mysql`は`launchctl`を使用してMySQLをサービスとして管理します。これにより、システム起動時に自動的にMySQLが起動するようになります。
    - Homebrew経由でインストールされた他の依存関係（libevent、libcborなど）も適切に設定されます。

### なぜ`mysql.server start`が失敗したのか

1. **権限の問題**: MySQLのログファイルやPIDファイルに対する読み書き権限が適切に設定されていなかった。
2. **設定ファイルの問題**: `/etc/my.cnf`ファイルが存在しないため、正しい設定が読み込めなかった。
3. **プロセス管理の問題**: 手動でプロセスを管理する際の不整合や競合が発生した。

### 解決策

- **権限を修正する**: 適切な権限を設定するために、`sudo chown -R _mysql:_mysql /opt/homebrew/var/mysql`や`sudo chmod -R 755 /opt/homebrew/var/mysql`を実行しました。
- **設定ファイルを確認する**: 必要に応じて`/etc/my.cnf`ファイルを作成し、適切な設定を追加します。
- **Homebrewのサービス管理を使用する**: `brew services start mysql`を使用して、Homebrew経由でMySQLを起動し、システム管理下に置きます。

これにより、MySQLの起動が安定し、システム再起動時にも自動的に起動されるようになります。


### 権限の自動設定

`brew services start mysql` は macOS の `launchctl` サービスを利用して MySQL を起動します。この方法では、Homebrew によってインストールされた MySQL の設定が自動的に行われ、適切なユーザーと権限で実行されるように調整されます。

### `Homebrew` 管理の場合
Homebrew は、ソフトウェアをインストールする際に、適切な所有権と権限を設定します。
    `brew services start` コマンドは、`launchctl` を使用してサービスを起動するため、macOS のシステムサービスとして扱われ、必要な権限で実行されます。
    Homebrew サービスは、ユーザーが適切な権限を持つ状態でサービスを起動します。例えば、`/usr/local/var/mysql`ディレクトリや関連するファイルの権限を正しく設定します。

### `mysql.server start` の場合

`mysql.server start` は手動でインストールされた MySQL インスタンスを起動するためのスクリプトです。この場合、MySQL のデータディレクトリやログファイルに対する権限設定が手動で行われるため、適切な権限が設定されていない場合に問題が発生します。

### 権限の具体的な違い

- **`brew services start mysql`**:
    - Homebrew が MySQL をインストールし、適切な権限を自動的に設定します。
    - `launchctl` サービスとして MySQL を管理するため、必要な権限が確保されます。
    - 権限設定のミスが少なく、サービスの管理が簡単です。
- **`mysql.server start`**:
    - 手動でインストールされた MySQL の権限設定をユーザーが行う必要があります。
    - データディレクトリやログファイルに対する適切な権限が設定されていない場合、起動時にエラーが発生します。
    - 権限の問題を解決するために、`chown` や `chmod` コマンドを手動で使用する必要があります。

# 結論

`brew services start mysql` を使用すると、Homebrew が適切な権限を自動的に設定し、サービスを起動するため、権限の問題が発生しにくくなります。一方、`mysql.server start` を使用する場合は、手動で権限を設定する必要があり、設定ミスによる問題が発生する可能性があります。

そもそもの自分のmysqlの設定状態が悪かったというのもあるので、一概に`mysql.server start`コマンドが原因とはならないですが参考になれば幸いです！