KAEDE Hack blog

JavaScript 中心に ライブラリなどの使い方を解説する技術ブログ。

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 ファイルを作成してみる

qiita.com

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 に 所有権を与える

qiita.com

数字が増えたパターンのも網羅されていた

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 フォルダの場所が違うので、それを考慮してコマンドを打てていなかっただけだった。

動いているプロセスを潰す

qiita.com

プロセスを見ても今の grep 以外動いていない。

tmux が原因かも?

tmux を全て切ってアプリを再起動する

:tmux kill-server
[server exited]

cmd q

しかしこれでも変わらなかった

mysql.server を start する

https://skill-up-engineering.com/2018/06/27/pid%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E9%96%A2%E3%81%97%E3%81%A6/

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 を設定してみる

rooter.jp

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 に所有を与える

ithack.y-canvas.com

 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 の知識を思い出した

eng-entrance.com

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 のフォルダに権限を与えることで解決した。

ただのユーザーだからシステムに変更を加えるような権限は最初はないから開発の時は与える動作を明示的にしなくてはいけない場合があると解釈した。