ローカル開発環境として数年間XAMPPを利用しています。
しかし、最近パソコンを新調したため、新しいパソコンでもXAMPPで環境を組み、開発していたところMySQL shutdown unexpectedly
というエラーが頻発するようになりました。
エラーが発生するとMySQLが起動しなくなり、非常に焦ったので解決方法をまとめます。
Contents
MySQL shutdown unexpectedlyというエラー
エラーが発生した際、XAMPPのコントロールパネルには以下のようなメッセージが表示されます。
Error: MySQL shutdown unexpectedly.
This may be due to a blocked port, missing dependencies,
improper privileges, a crash, or a shutdown by another method.
Press the Logs button to view error logs and check
the Windows Event Viewer for more clues
If you need more help, copy and post this
entire log window on the forums
内容としてはポートの重複やファイルの破損などが原因である可能性があると書かれています。
念のため、ポートの重複を確認します。
XAMPPのコントロールパネル右上にNetstat
ボタンがあり、クリックするとポートの確認ができます。
MySQLのポートである3306
が使用されていなければ、ポート重複が原因ではありません。
MySQLのエラーログを確認
XAMPPのコントロールパネルに表示されているメッセージには、エラーログを見るようにと書かれているため、指示に従います。
コントロールパネルのMySQLの列にあるLogs
ボタンをクリックし、表示されるドロップダウンからmysql_error.log
を選択します。
そして開かれたエラーログファイル内より、対象のエラーログを探します。[ERROR]
と記載されている行かつ、今回の発生日時から対象のエラーログを特定します。
今回は以下のようなログが残っていました。
[ERROR] InnoDB: Your database may be corrupt or you may have copied the InnoDB tablespace but not the InnoDB log files. Please refer to https://mariadb.com/kb/en/library/innodb-recovery-modes/ for information about forcing recovery.
データベースの破損等が記載されていますが、このエラーログでは何もわかりませんでした。
解決手順
ここからが実際にエラーが解決した方法です。
手順全体の概要としては、一時的にデータを退避させバックアップから破損ファイルの復元を行います。
dataフォルダを退避
まずはデータベースのデータファイルを退避します。
XAMPPのコントロールパネル右側のExplorer
ボタンをクリックし、XAMPPのインストールフォルダを開きます。
開いたxampp
フォルダ内にあるmysql
フォルダを開き、さら中にあるdata
フォルダをコピーして、デスクトップ等の安全な場所に退避します。
dataフォルダパス(例):C:\xampp\mysql\data
破損ファイルの削除
data
フォルダにあるファイルやフォルダを削除します。
削除対象は自分で作成したデータベース名のフォルダ以外のファイルとフォルダです。
自分で作成したデータベース名のフォルダは削除しないでください。
破損ファイルを復旧
data
フォルダから1つ上の階層に戻って、backup
フォルダを開きます。
backupフォルダパス(例):C:\xampp\mysql\backup
backup
フォルダ内にあるすべてのフォルダとファイルをコピーし、data
フォルダへペーストします。
対象となるフォルダとファイルは以下のものです。
mysql
performance_schema
phpmyadmin
test
aria_log.00000001
aria_log_control
ib_buffer_pool
ib_logfile0
ib_logfile1
ibdata1
ibtmp1
multi-master.info
my.ini
退避フォルダからファイルをコピー
退避したdata
フォルダからibdata1
ファイルをコピーして、元のdata
フォルダへペーストします。
復旧したbackup
フォルダのものとファイル名が重複しますが、そのまま上書きしてください。
MySQL再起動
最後にMySQLとApacheを再起動します。
無事エラーメッセージが表示されずにMySQLが起動すれば、復旧完了です。
予防方法
恐らく今回のエラーの原因はXAMPPを正常終了しなかったためだと考えられます。
毎回終了時にはApacheやMySQLをStop
ボタンから停止し、コントロールパネルのQuit
ボタンでXAMPPを終了させないといけません。
XAMPPを起動させたままWindowsをシャットダウンさせたり、XAMPPウインドウのバツボタンで閉じると、今回のようなエラーが発生するようです。
以前のパソコンではこのようなエラーは1度も起きなかったのですが、パソコンそのものの環境による差なのか、XAMPPのバージョンによる差なのかはわかりませんでした。
XAMPPがQuitできないとき
また、私の環境ではXAMPPのQuit
ボタンでエラーが出て終了できないという現象も発生しました。
エラーの内容としては「アクセスが拒否されました。」というものでした。
エラーの原因
エラーの原因は、実行したユーザーに権限がないことです。
XAMPPを実行する際に「管理者として実行」をすることでエラーを回避できますが、毎回「管理者として実行」の操作を行うのが面倒です。
そこで常に「管理者として実行」されるように変更することが可能です。
常に「管理者として実行」されるようにする
常に「管理者として実行」されるようにするには、XAMPPのインストールフォルダ内にあるxampp-control.exe
の上で右クリックをし、プロパティを開きます。
xampp-controlパス(例):C:\xampp\xampp-controll.exe
プロパティの「互換性」タブを開き、「管理者としてこのプログラムを実行する」にチェックを入れて「適用」をクリックします。
以上で次回からXAMPPが管理者として実行されるようになり、Quitの際に発生していたエラーがなくなります。