ハマるまでの概要と流れ
新しく参加するプロジェクト(PHP/Laravel10)のリポジトリをクローン→.envファイルに必要事項記載してDB接続しようとした際にmysqlが立ち上がらない沼り事案(MacbookM1使用)
結論と実施したこと
いろいろ細かな権限だの設定ファイルの修正だの必要な場合はあるのですが、「結果的にこうやれば一発で行けたのか」 という流れが以下
- mysqlアンインストール
brew uninstall mysql
- mysqlインストール
brew install mysql
- mysql接続
brew services start mysql
←これがポイント
失敗パターン
アンインストール→再インストール→mysql.server start
で接続
成功パターン
アンインストール→再インストール→brew services start mysql
で接続
アンインストール→再インストール→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
が失敗したのか
- 権限の問題: MySQLのログファイルやPIDファイルに対する読み書き権限が適切に設定されていなかった。
-
設定ファイルの問題:
/etc/my.cnf
ファイルが存在しないため、正しい設定が読み込めなかった。 - プロセス管理の問題: 手動でプロセスを管理する際の不整合や競合が発生した。
解決策
-
権限を修正する: 適切な権限を設定するために、
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
コマンドが原因とはならないですが参考になれば幸いです!