MySQL start しない PID ファイルがないエラーを socket ファイルが入っている /tmp の所有者とグループを _mysql に変えることで解決した
マシン
2020 M1 Mac
状況
brew install mysql ==> Installing mysql ==> Pouring mysql--8.0.26.arm64_big_sur.bottle.1.tar.gz ==> /opt/homebrew/Cellar/mysql/8.0.26/bin/mysqld --initialize-insecure --user=ka ==> Caveats We've installed your MySQL database without a root password. To secure it run: mysql_secure_installation MySQL is configured to only allow connections from localhost by default To connect run: mysql -uroot To start mysql: brew services start mysql
brew install で入れた直後
mysql -uroot ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
それを通して接続できないと言われている socket ファイルを作成してみる
sudo touch /tmp/mysql.sock mysql -uroot ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)
数が増えただけで動かない...
restart してみる
sudo mysql.server restart ERROR! MySQL server PID file could not be found! Starting MySQL .Logging to '/opt/homebrew/var/mysql/kaede0902s-Air.err'. ERROR! The server quit without updating PID file (/opt/homebrew/var/mysql/kaede0902s-Air.pid).
再起動もできない
今度は mysql の server pid が見つからないとエラーが出ている
/tmp に 所有権を与える
数字が増えたパターンのも網羅されていた
sudo chown mysql:mysql /tmp kaede0902@kaede0902s-Air ~ % sudo mysql.server restart ERROR! MySQL server PID file could not be found! Starting MySQL .Logging to '/opt/homebrew/var/mysql/kaede0902s-Air.err'. ERROR! The server quit without updating PID file (/opt/homebrew/var/mysql/kaede0902s-Air.pid).
しかし PID の問題なのでダメだった。
かのように思われたが、Qiita の記事とは mysql フォルダの場所が違うので、それを考慮してコマンドを打てていなかっただけだった。
動いているプロセスを潰す
プロセスを見ても今の grep 以外動いていない。
tmux が原因かも?
tmux を全て切ってアプリを再起動する
:tmux kill-server [server exited] cmd q
しかしこれでも変わらなかった
mysql.server を start する
Linux上ではあるサービスが起動するとプロセス番号を振ってテキストファイルとして保存します。これがpidファイルと呼ばれるもので、これがあるときは基本的にはあるサービスが動いているよ!という目印になります。
pid ファイルとは、サービス起動時に作成されるらしい。つまり restart の前に start をすれば作成されるのではないかと予想する
sudo mysql.server start Password: Starting MySQL .Logging to '/opt/homebrew/var/mysql/kaede0902s-Air.err'. ERROR! The server quit without updating PID file (/opt/homebrew/var/mysql/kaede0902s-Air.pid).
start しようとしても PID ファイルを更新せずに終了してしまいましたというエラーが出る
mysql/kaede0902s-Air.err ファイルを見てみる
log を見てみる
/opt/homebrew/var/mysql/kaede0902s-Air.err
にログを書いているはずなので中身をみるが
ls /opt/homebrew/var/mysql/ #ib_16384_0.dblwr ib_buffer_pool public_key.pem #ib_16384_1.dblwr ib_logfile0 server-cert.pem #innodb_temp ib_logfile1 server-key.pem auto.cnf ibdata1 sys ca-key.pem mysql undo_001 ca.pem mysql.ibd undo_002 client-cert.pem performance_schema client-key.pem private_key.pem
.err ファイルも .pid ファイルもない
Hostname を設定してみる
Macのホスト名は ComputerName,HostName,LocalHostName があります。これらが設定されていないと、自動でホスト名を割り当てられてしまう可能性があります。つまり、あるネットワークでmysqlサーバを起動し、別のネットワークでサーバを終了させようとすると、起動した時のPIDファイルが必要になるため、エラーが起きてしまいます。
sudo scutil --get ComputerName kaede0902’s MacBook Air sudo scutil --get HostName HostName: not set sudo scutil --get LocalHostName kaede0902s-MacBook-Air
コンピュータの名前が空白付きで
ローカルホストの名前がハイフンで繋げたもの
ホスト名がセットされていなかった
sudo scutil --set HostName rooter sudo scutil --get HostName rooter
記事の通りに rooter で設定する
sudo mysql.server start Starting MySQL .Logging to '/opt/homebrew/var/mysql/rooter.err'. ERROR! The server quit without updating PID file (/opt/homebrew/var/mysql/rooter.pid).
それでもダメだった。x86 と arm64 を切り替えてもダメ。
mysql ディレクトリに _mysql に所有を与える
sudo chown -R _mysql:_mysql /opt/homebrew/var/mysql kaede0902@rooter ~ % sudo mysql.server restart ERROR! MySQL server PID file could not be found! Starting MySQL .Logging to '/opt/homebrew/var/mysql/rooter.err'. SUCCESS! kaede0902@rooter ~ % sudo mysql.server restart Shutting down MySQL . SUCCESS! Starting MySQL . SUCCESS! kaede0902@rooter ~
所有者と所有グループを変更したら成功という表示が出た
この _mysql:_mysql
は user と usergroup だ
Lpic 101 の知識を思い出した
chown は所有グループを変更するコマンド。権限ではなかった
kaede0902@rooter ~ % sudo mysql.server start Starting MySQL . SUCCESS! kaede0902@rooter ~ % mysql -u root Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 10 Server version: 8.0.26 Homebrew Copyright (c) 2000, 2021, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
接続成功!
まとめ
PID ファイルがなくて mysql が動かせないエラーは、その実行している mysql のフォルダに権限を与えることで解決した。
ただのユーザーだからシステムに変更を加えるような権限は最初はないから開発の時は与える動作を明示的にしなくてはいけない場合があると解釈した。