XAMPPのMySQLデータベースを起動させるまでの闘いの記録

## 背景
これはとある夜下がりにとある人間がとある技術書を読みながら手を動かしていくぜと意気込んで読みすすめて行ったところ、序盤のXAMPPを使おうという何気ない記事の所で、全く予想だにしていなかったエラーの波に飲み込まれ、XAMPPのMySQLをRunningにするまでに何時間も悪戦苦闘した闘いの記録である:crossed_swords:

## 概要
**注）・XAMPPのインストールの部分は省略しています。**
　　**・環境はMacです。**

まずはApacheを起動しよう！となってたのでStartをクリックすると簡単に起動。よしよし。
次はMySQLを起動しよう！となってたのでStartをクリックすると簡単に起動・・・・・・しない！！！
何度やっても赤いランプのStoppedになってしまう。
ということで速攻で検索して調べてみました。

はじめに`xampp mysql 起動しない`で検索したらほとんどがWindowsの場合のページばかりヒットしたので、検索ワードに「mac」を入れることにしました。（自分はMacを使用しています）

そしてteratailのこちらのページが役に立ちそうと思って記事の内容を読みながら試してみました。


https://teratail.com/questions/110459

#### そしてとりあえずlogを見てみる事にしました。
・XAMPPのMySQL起動時のエラーログの確認コマンド
`$ sudo tail /Applications/XAMPP/xamppfiles/var/mysql/自分のMacの名前.local.err`

```zsh
/Applications/XAMPP ❯ sudo tail xamppfiles/var/mysql/~Mac.local.err
Password:
2021-04-13 22:21:53 0 [Note] InnoDB: Waiting for purge to start
2021-04-13 22:21:53 0 [Note] InnoDB: 10.4.18 started; log sequence number 1764329; transaction id 2369
2021-04-13 22:21:53 0 [Note] InnoDB: Loading buffer pool(s) from /Applications/XAMPP/xamppfiles/var/mysql/ib_buffer_pool
2021-04-13 22:21:53 0 [Note] Plugin 'FEEDBACK' is disabled.
2021-04-13 22:21:53 0 [Note] InnoDB: Buffer pool(s) load completed at 210413 22:21:53
2021-04-13 22:21:53 0 [Note] Server socket created on IP: '::'.
2021-04-13 22:21:53 0 [ERROR] Can't start server: Bind on TCP/IP port. Got error: 48: Address already in use
2021-04-13 22:21:53 0 [ERROR] Do you already have another mysqld server running on port: 3306 ?
2021-04-13 22:21:53 0 [ERROR] Aborting
2021-04-13 22:21:55 16635 mysqld_safe mysqld from pid file /Applications/XAMPP/xamppfiles/var/mysql/~Mac.local.pid ended

```


`Can't start server: Bind on TCP/IP port. Got error: 48: Address already in use`
`Do you already have another mysqld server running on port: 3306 ?`

上記のエラーログから他のどこかでMySQLのポート番号【3306】が使われていて起動出来ないのだと仮定しました。

#### そして調べていた所ポート番号の競合を確認出来るコマンドを発見したので使用してみた

使用中のすべてのポートを確認する場合
`netstat -an`
特定のポートを確認する場合
`netstat -an | find ":＜ポート番号＞"`

参考サイト：[2.1.3 ポート番号が競合していないことを確認する](http://itdoc.hitachi.co.jp/manuals/3021/3021900100/CWCJ0041.HTM)

#### コマンド実行して検証

```zsh
$ netstat -an | find "3306"                                              
find: 3306: No such file or directory
```
＞そんなファイルは無いよと言われてしまいました。
残念ながらこのコマンドでは思った結果が得られませんでした:disappointed_relieved:

#### 別のコマンドを見つけたので実行して再度検証

```zsh
/Applications/XAMPP ❯ netstat -na | grep LISTEN                                              
tcp6       0      0  *.64279                *.*                    LISTEN
tcp4       0      0  *.64279                *.*                    LISTEN
tcp46      0      0  *.3306                 *.*                    LISTEN
・・・以下略
```

＞ここでようやくMySQLのポート番号【3306】がどうやらなにかに使われていることが分かりました。

#### さらに検証を進める

`$ ps aux | grep mysql`
このコマンドを打つと【mysql】という検索キーワードでプロセスの一覧を取得出来る。
だが何行にも渡って【mysql】関連のプロセスが出てるのでこのどれが原因なのかよく分からない💧


#### ついに起死回生のコマンド見つけた
原因となるmysqlのプロセスを見つけるコマンドを探し回ること数時間、ついにあるコマンドをstack overflowで見つけた！
それがこのコマンド`lsof -nP -i4TCP:3306`である。 ＞ (3306はMySQLのポート番号)

#### さっそく実行
```zsh
$ lsof -nP -i4TCP:3306

COMMAND   PID          USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
mysqld  16496  user  17u  IPv6 0xdaf9973c9634bf6b      0t0  TCP *:3306 (LISTEN)
```

<font color="red">**ここでついに`プロセスID【16496】`が現在MySQLが動いているプロセスであることが判明した。**</font>

※余談だが、上記のコマンドと似たようなコマンドで`lsof -i -P | grep 3306`というのもあって実行した所、結果は同じだったが結果が返るまでの時間が結構遅かったので自分は前述のコマンドのがオススメ。

#### killコマンドでプロセスを終了させる

ここまでに調べた内容でプロセスを終了する`kill`コマンドについてはすでに知っていた為、早速該当のプロセスに実行する。

**killコマンドの実行**
`$ kill 16496` (オプションで`-9`を入れると強制終了になるらしいが今回は使わない。)

#### ようやくXAMPPのMySQLを起動してみるが・・・

これで完全に緑ランプが点くだろうと確信してXAMPPのStartを意気揚々と押してから待つこと数秒。
無慈悲にもstopped（赤いランプ）の状態になり、再び絶望に落とされる。
「そんな・・・、バカな・・・。一体何が悪かったんだ・・・。頭か・・？？？」と意気消沈してしばらく現実逃避してました。（腕立て:bow:とかスクワットとか:lifter:）

#### 再度MySQLのプロセスを確認

気を取り直して、とりあえずもう一度プロセスを確認することに。

```zsh
$ lsof -nP -i4TCP:3306

COMMAND   PID          USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
mysqld  16496  user  17u  IPv6 0xdaf9973c9634bf6b      0t0  TCP *:3306 (LISTEN)
```

「なに！？復活してる！？」
「確かに貴様はさっきkillったはずなのに！！！？」

ですが、このことから全てが分かりました。
そう、`このMySQLは自動復活のスキルを保有しているということに！！！！`

#### MySQLの自動機能について調べる

早速`mysql 自動起動`で調べた所、答えが全て載っている最高なこちらのサイトを見つけました。

https://qiita.com/s_tatsuki/items/52314f1eada0a4bab716

まずはこちらのサイト内から得た知識で、下記のコマンドで自動機能が設定されているかを調べます。


```zsh
$ brew services list
Name          Status  User          Plist
mysql@5.6     started user /Users/user/Library/LaunchAgents/homebrew.mxcl.mysql@5.6.plist
```

**完全に自動機能が設定されていました。**


#### というわけで自動機能を停止するコマンドを実行

```zsh
$ brew services stop mysql@5.6
Stopping `mysql@5.6`... (might take a while)
==> Successfully stopped `mysql@5.6` (label: homebrew.mxcl.mysql@5.6)
```

#### 念の為MySQLが動いているかを下記コマンドにて確認

```zsh
$ mysql.server status
 ERROR! MySQL is not running
```

ちゃんとMySQLが止まっていることが確認出来ました。

#### 再度killコマンドを実行
`$ kill 16496`

もう一度確認
`lsof -nP -i4TCP:3306`
→なにも表示されなかった為MySQLが停止していることが分かる。

## 決着

全ての闘いが終わり、XAMPPのMySQLのStartをクリック。数秒待った後に無事にRunningの緑のランプの点灯に変わることが確認出来ました。嘘ではありません。

#### これが証拠です！！
[![Image from Gyazo](https://i.gyazo.com/be3933e20f964ff4786896923a85f41a.png)](https://gyazo.com/be3933e20f964ff4786896923a85f41a)

## おわりに
この件は冒頭でも述べた通り、昨晩と今日にかけて数時間色々と試行錯誤した結果ようやく解決出来ましたので、緑のランプが点いた時は本当に嬉しかったです:raised_hands:
また今回の件で自分がMySQLの自動起動の設定をしていたことをすっかり忘れていたことや、起動しているプロセスのポート番号を調べるコマンドを知らなかったりなど多くの事を学習することが出来ました😥
今回の学んだ内容を落とし込む意味と他の人への共有のために~~面倒でしたが~~今回の記事を書きました。
もしこの記事を見ることで、同じように困っている人達のお役に立つことが出来たならとても光栄です。
この度はこの拙い記事にお付き合いくださり誠にありがとうございました！！:blush:

## 今回の内容をまとめると
・まずはXAMPPのMySQL起動時のエラーログの確認
`$ sudo tail /Applications/XAMPP/xamppfiles/var/mysql/自分のMacの名前.local.err`
→「3306」がすでに使用中なことを確認

・MySQLのポート番号「3306」の確認
`$ lsof -nP -i4TCP:3306`
→該当のプロセスIDを確認：今回は「16496」

・killコマンドの前に自動起動されていないかの確認
`$ brew services list`
→ここで自動起動設定されていたらkillしてもすぐに復活するので止める

・自動起動の停止
`$ brew services stop mysql(@~)`
（なお、自動起動の再開コマンド：`brew services start mysql`）

・念の為MySQLが停止されていることを確認
`$ mysql.server status`
→「ERROR! MySQL is not running」止まっていることを確認
（`$ lsof -nP -i4TCP:3306`こちらのコマンドで確認してもよい）

・killコマンドの実行
``$ kill (16496)``

**・これでXAMPPのMySQLが起動出来ます:blush:**


## 参考サイト
- [MacOS XAMPP MySQLがStopped](https://teratail.com/questions/110459)
- [2.1.3 ポート番号が競合していないことを確認する](http://itdoc.hitachi.co.jp/manuals/3021/3021900100/CWCJ0041.HTM)
- [【MySQL】自動起動の意外な落とし穴](https://qiita.com/s_tatsuki/items/52314f1eada0a4bab716)