XAMPP を止めずにパソコンの電源を切ったり、コントロールパネルを強制終了したりすると、次に MySQL(MariaDB)を起動したときに、赤い文字で次のエラーが出て起動しなくなることがあります。
Error: MySQL shutdown unexpectedly.この記事では、確かめること、バックアップから戻す方法、バックアップがないときの最後の手段を、この順に紹介します。
なお、XAMPPのコントロールパネルには「MySQL」と書かれていますが、中に入っているのは、MySQLから分かれた互換のデータベース「MariaDB」です(XAMPPは2015年ごろに、MySQLからMariaDBに切り替えています)。私も、XAMPPをまとめてインストールしていたので、しばらく気づきませんでした。コマンドの名前は mysql のままなので、この記事の手順はそのまま使えます。
作業の前に:data フォルダーを丸ごと写しておく
この先の作業で失敗してもやり直せるように、最初に C:\xampp\mysql\data フォルダーを丸ごと別の場所(デスクトップなど)にコピーしておきます。MySQL は止まっているので、このときはそのままコピーして構いません。
確かめる①:エラーログを見る
このエラーは、データが壊れたときだけでなく、いろいろな理由で出ます。理由はエラーログに書かれています。
コントロールパネルの MySQL の行にある「Logs」を押し、mysql_error.log を開きます(ファイルは C:\xampp\mysql\data\mysql_error.log)。いちばん下にある、今回の起動のときの [ERROR] の行を見ます。
| ログに出ていること | 考えられる理由 |
|---|---|
Can't start server: Bind on TCP/IP port や Address already in use | ほかのソフトが同じポート(3306)を使っている |
InnoDB や ib_logfile、ibdata1 を含む行 | データのファイルが壊れている |
Permission denied や Access is denied | フォルダーの権限(「xampp-control.iniのアクセス拒否エラー」) |
確かめる②:ポートが使われていないか
別に入れた MySQL や、止め忘れた MySQL が 3306 番のポートを使っていると、XAMPP の MySQL は起動できません。コマンドプロンプトで確かめます。
netstat -ano | findstr :3306何か表示されたら、いちばん右の番号(PID)をタスクマネージャーの「詳細」タブで探すと、どのソフトが使っているか分かります。Windows の「サービス」に登録された別の MySQL なら、そちらを止めると XAMPP の MySQL が起動できます。データは壊れていないので、この先の作業はいりません。
戻し方①:mysqldump のバックアップから戻す(いちばん確実)
データが壊れていて、「MySQLを定期的に自動バックアップする」で mysqldump のバックアップを取っているなら、MySQL を初めの状態にしてから、そのファイルを流し込みます。
C:\xampp\mysqlを開き、dataフォルダーの名前をdata_oldに変える- 同じ場所に、空の
dataフォルダーを作る C:\xampp\mysql\backupの中身をすべてコピーし、新しいdataに貼り付ける(XAMPP に入っている、初めの状態のデータです)- コントロールパネルで MySQL を起動する
- コマンドプロンプトで、いちばん新しいバックアップを流し込む
"C:\xampp\mysql\bin\mysql.exe" -u root < "C:\xampp_mysql_backup\all_20261011_0900.sql"すべてのデータベースが、バックアップを取ったときの状態に戻ります。MySQL のユーザーやパスワードも戻ります。バックアップのあとに入れたデータだけは戻りません。
戻し方②:バックアップがないときの最後の手段
mysqldump のバックアップがないときは、初めの状態のデータに、壊れる前の自分のデータベースを戻す方法を試します。XAMPP でよく紹介されている方法で、直ることが多いものの、次のような危うさがあります。
- 直前の変更が消えることがある:
捨てるib_logfileには、まだ本体のファイルに書き込まれていない最後の変更が入っていることがあります - テーブルが壊れたままになることがある:
起動できても、一部のテーブルが開けないことがあります - MySQL のユーザーが初めの状態に戻る:
自分で作ったユーザーや、rootに付けたパスワードは消えるので、作り直します
手順
- 戻し方①の 1〜3 と同じように、
dataをdata_oldに変え、新しいdataにbackupの中身をコピーする data_oldの中から、自分で作ったデータベースのフォルダー(例:laravel_app_db)だけを、新しいdataにコピーする。mysql、performance_schema、phpmyadmin、testはコピーしないdata_oldのibdata1を、新しいdataに上書きでコピーするib_logfile0などib_logfileで始まるファイルはコピーしない- コントロールパネルで MySQL を起動する
起動できたらすぐにすること
- phpMyAdmin で、自分のデータベースのテーブルが開けるか、最近入れたデータがあるかを確かめる
- おかしなところがなければ、すぐに mysqldump で書き出しておく(この状態のまま使い続けると、あとで壊れることがあるため)
なぜこの方法で動くのか
MySQL(InnoDB)は、それぞれのテーブルのデータをデータベースのフォルダーの中に、全体で共通の管理情報を ibdata1 に持っています。ib_logfile は「これから書き込む予定の変更」の記録で、ふつうは突然止まっても、次の起動でこの記録を使って自動で直します。
この記録そのものが壊れると自動で直せず、起動できなくなります。この方法は、その記録を捨てて起動できるようにするものなので、記録にだけ残っていた変更は失われます。「安全に直す方法」ではなく、「できるだけ拾い出す方法」と考えてください。
壊さないために
- パソコンを終了する前に、コントロールパネルで MySQL を「Stop」する
- 定期的に mysqldump でバックアップを取っておく(「MySQLを定期的に自動バックアップする」)
まとめ
- 作業の前に、
dataフォルダーを丸ごと別の場所に写しておく - まずエラーログとポートを確かめる。ポートが原因なら、データは壊れていない
- mysqldump のバックアップがあれば、初めの状態にしてから流し込むのがいちばん確実
- なければ
ibdata1を使う方法を試すが、直前の変更が消えることがある。起動できたらすぐ mysqldump で書き出す - パソコンを終える前に MySQL を止める



コメント