フルスタックエンジニアのノウハウ
2020.04.25    2020.11.01

XAMPPでMySQLがStart出来ない場合の対処方法

プログラミングやサーバー構築を行っていると、思うように動かずエラーが発生してしまうことがよくありますよね。


こういったエラーは、初心者の頃だけでなく、実際にエンジニアとして独り立ちして仕事をしていく中でも日常茶飯事です。


以下の記事でも書きましたが、エラーの原因を調べたり、解決策を試したりする時間は、実際に物を作っている時間と同じくらい多かったりします。


関連記事

プログラマーはデバッグスキルを磨け!



 よって、エラーの原因をいち早く調べて解決できる能力は、エンジニアにとって非常に重要なスキルなんです。



でも、実際どのように調べて解決していけばいいのか...?



最初のうちは、なかなか分からないことも多いと思います。


そこで今回は、実際に起こったエラーを題材にして、僕が「どんな思考、どんな手順で調査していくのか?」ということを実演してみたいと思います。


プログラミングを学んでいる方のご参考になれば幸いです。



今回の題材「XAMPPのMySQLが起動しない」


先日、講座の受講生さんで「XAMPPのMySQLが突然起動しなくなってしまった」という問題が発生し、その解決をサポートすることがありました。


今回はこちらを題材にして、この時に僕が行った調査手順」を見ていきましょう。



エラーの現象


まず、今回のエラーの現象としては、


XAMPP Control Panelで、MySQLの「Start」ボタンを押してもMySQLが正常に起動しない(ボタンがすぐ「Start」に戻ってしまう)


という状況でした。



調査開始!


ということで調査開始です。


問題が起きたとき、最初に見るべきは「画面上に表示されているエラーメッセージ」です。




赤字でこのように表示されています。


Error: MySQL shutdown unexpectedly.
This may be due to a blocked port, missing dependencies, improper privileges, a chash, or a shutdown by another method.
Press the Logs button to view error logs and check the Windows Event Viewer for more clues


ちなみに、これを全文コピーしてGoogle翻訳で訳してみると...




エラー:MySQLが予期せずシャットダウンしました。
これは、ポートのブロック、依存関係の欠落、不適切な特権、chash、または別の方法によるシャットダウンが原因である可能性があります。[ログ]ボタンを押してエラーログを表示し、Windowsイベントビューアでその他の手がかりを確認します



実は、XAMPPを使っているとこのメッセージはよく遭遇するんですが、これはApacheやMySQLが起動に失敗した場合に表示される「テンプレのエラーメッセージ」なので、残念ながらこれだけでは今回のエラーの原因までは特定出来ません。


 ただ、このメッセージが出ていることで、起動しようとしたものの何らかのエラーが発生して、すぐに落ちて(シャットダウンして)しまっていることが分かりました。



エラーメッセージの中にも一部書かれていますが、XAMPPでサービスが起動しない場合「真っ先に調べるべきチェックポイント」は以下の3つです。


①ポート競合をチェック
②前回クラッシュした際の破損ファイルなどが邪魔していないかチェック
③設定ファイルの間違え(ログファイルをチェック)


これらを上から順番に調べて、潰していきます。



①ポート競合をチェック


MySQLが使うポート番号「3306番」が他で使われていないか(競合していないか)確認します。


XAMPP Control Panelで「Netstat」ボタンをクリックし、表示されるリストの中で3306を使っているものが無いかどうかチェックします。




 3306番の行が存在しないため、ポート競合は起きていないようですね。



②プロセスファイルのチェック


次は、クラッシュした際の「破損ファイル」などが邪魔していないかチェックしてみます。


XAMPPで、MySQLの「Config」ボタンをクリックし、<Browse>をクリックします。

表示された画面のフォルダ一覧の中から「data」フォルダをダブルクリックします。


dataフォルダの中にある以下のファイルをデスクトップに退避します。


・ib_logfileという名前で始まる全ファイル
・iddata1




退避したら、MySQLの起動を試してみます。


前回起動時にMySQLが強制終了してしまった場合などに、これらのファイルが破損ファイルとして残ってしまう場合があり、退避することでMySQLが正常に起動するケースがあります。


 しかし、今回はこれでもMySQLは起動しませんでした。



③ログファイルをチェック


では次に、MySQLのログファイルをチェックしていきます。

もしかすると何か手掛かりが残っているかもしれません。


XAMPPで、MySQLの「Logs」>「mysql_error.log」をクリックします。


すると、ログの最下段にはこのように[ERROR]が出ていました。




 おそらくこれが原因ですね。



ログを読んでみると、unknown option(オプションが正しくない)と言っているようですが、一見するとどこが間違っているのか分かりません。


そんな時は、とりあえずエラーメッセージをそのままコピーしてGoogleで検索しましょう。


エラーメッセージをそのまま検索する時は、環境によって変わるパス名などは除外して検索するのがコツです(上記の場合は、C:\xampp\mysql\bin\mysql.exeの部分)



すると、こんな感じで色々出てきます。




上からページを見ていってみましょう。


 POINT
ページを見ていくときは、同じようなエラーメッセージで悩んでいる人がいないかどうかを重点的に見ています。



いくつか見ていくと、こんなページがありました。


MYSQLのエラーからの復活・・・ いきなりはじめるPHP完了
http://tech-life.hateblo.jp/entry/2016/02/14/193414



このページの著者の方は、以下のようにスペルミスが原因だったみたいです。


誤)cliant
正)client



あれ?こっちは大丈夫かな?と、先程のログと見比べてみると・・・


誤)--skip-character-client-handshake
正)--skip-character-set-client-handshake


やはりスペルミスがありました。

どうやらこちらは「-set」という記述が抜けていたようですね。



 POINT
ちなみに、こういった長い文字列同士を見比べるときは、2つの文字列をATOMなどのエディタに貼り付けて、片方を選んで「Ctl+D」を押すと一目瞭然です。
目視だと見逃してしまうようなタイプミスも気づくことが出来るので活用してみてください。





解決!今回の原因は・・・


原因が分かったので、XAMPPで、MySQLの「Config」>「my.ini」をクリックして設定ファイルを開き、該当部分を正しく記載してMySQLのStartボタンを押したところ・・・


 正常に起動しました!




今回、受講生さんは、MySQLの文字化け対策でmy.iniの設定をカスタマイズしており、その時に一部入力ミスがあったことが今回の原因だったようです。



まとめ


今回は、経験則から可能性の高そうな順番にチェックしていきましたが、結果的にはログファイルを先に確認した方が早かったですね(これもまた経験です)


このように、問題が発生した場合は、


①まず可能性を仮説として洗い出し
②それを1つずつ消去法でつぶしていく


という手順で解決していきます。


洗い出した仮説を全て試しても解決しないこともありますが、諦めずに「新しい仮説」を立て、それを試します。エラーが解決するまでこれを根気強く繰り返します。


また、上記でも行ったように、エラーが出たらエラーメッセージをそのままGoogleで検索するのもおすすめです。同じようなエラーに悩み、解決した人は案外いるものですので、解決策がそのまま見つかることも多いです。


エラー解決は、作業が思うように進まない焦りの中、根気強く取り組んでいかなければならない大変な作業ですが、やればやるほど自分の中に経験が蓄積されいき、同じエラーに直面した時に、2回目はもっと早く解決出来るようになります。


エラーを恐れず「謎解き」感覚でポジティブに取り組んでいきましょう!


おすすめ記事