[PR] 本記事にはプロモーションが含まれています。

【XAMPP】MySQLが「shutdown unexpectedly」で起動しないときの直し方|確かめること、バックアップからの戻し方、ibdata1を使う最後の手段

MySQL

XAMPP を止めずにパソコンの電源を切ったり、コントロールパネルを強制終了したりすると、次に MySQL(MariaDB)を起動したときに、赤い文字で次のエラーが出て起動しなくなることがあります。

Plaintext
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 は起動できません。コマンドプロンプトで確かめます。

Plaintext
netstat -ano | findstr :3306

何か表示されたら、いちばん右の番号(PID)をタスクマネージャーの「詳細」タブで探すと、どのソフトが使っているか分かります。Windows の「サービス」に登録された別の MySQL なら、そちらを止めると XAMPP の MySQL が起動できます。データは壊れていないので、この先の作業はいりません。

戻し方①:mysqldump のバックアップから戻す(いちばん確実)

データが壊れていて、「MySQLを定期的に自動バックアップする」で mysqldump のバックアップを取っているなら、MySQL を初めの状態にしてから、そのファイルを流し込みます。

  1. C:\xampp\mysql を開き、data フォルダーの名前を data_old に変える
  2. 同じ場所に、空の data フォルダーを作る
  3. C:\xampp\mysql\backup の中身をすべてコピーし、新しい data に貼り付ける(XAMPP に入っている、初めの状態のデータです)
  4. コントロールパネルで MySQL を起動する
  5. コマンドプロンプトで、いちばん新しいバックアップを流し込む
Plaintext
"C:\xampp\mysql\bin\mysql.exe" -u root < "C:\xampp_mysql_backup\all_20261011_0900.sql"

すべてのデータベースが、バックアップを取ったときの状態に戻ります。MySQL のユーザーやパスワードも戻ります。バックアップのあとに入れたデータだけは戻りません。

戻し方②:バックアップがないときの最後の手段

mysqldump のバックアップがないときは、初めの状態のデータに、壊れる前の自分のデータベースを戻す方法を試します。XAMPP でよく紹介されている方法で、直ることが多いものの、次のような危うさがあります。

  • 直前の変更が消えることがある:
    捨てる ib_logfile には、まだ本体のファイルに書き込まれていない最後の変更が入っていることがあります
  • テーブルが壊れたままになることがある:
    起動できても、一部のテーブルが開けないことがあります
  • MySQL のユーザーが初めの状態に戻る:
    自分で作ったユーザーや、root に付けたパスワードは消えるので、作り直します

手順

  1. 戻し方①の 1〜3 と同じように、data を data_old に変え、新しい data に backup の中身をコピーする
  2. data_old の中から、自分で作ったデータベースのフォルダー(例:laravel_app_db)だけを、新しい data にコピーする。mysql、performance_schema、phpmyadmin、test はコピーしない
  3. data_old の ibdata1 を、新しい data に上書きでコピーする
  4. ib_logfile0 など ib_logfile で始まるファイルはコピーしない
  5. コントロールパネルで MySQL を起動する

起動できたらすぐにすること

  • phpMyAdmin で、自分のデータベースのテーブルが開けるか、最近入れたデータがあるかを確かめる
  • おかしなところがなければ、すぐに mysqldump で書き出しておく(この状態のまま使い続けると、あとで壊れることがあるため)

なぜこの方法で動くのか

MySQL(InnoDB)は、それぞれのテーブルのデータをデータベースのフォルダーの中に、全体で共通の管理情報を ibdata1 に持っています。ib_logfile は「これから書き込む予定の変更」の記録で、ふつうは突然止まっても、次の起動でこの記録を使って自動で直します。

この記録そのものが壊れると自動で直せず、起動できなくなります。この方法は、その記録を捨てて起動できるようにするものなので、記録にだけ残っていた変更は失われます。「安全に直す方法」ではなく、「できるだけ拾い出す方法」と考えてください。

壊さないために

まとめ

  • 作業の前に、data フォルダーを丸ごと別の場所に写しておく
  • まずエラーログとポートを確かめる。ポートが原因なら、データは壊れていない
  • mysqldump のバックアップがあれば、初めの状態にしてから流し込むのがいちばん確実
  • なければ ibdata1 を使う方法を試すが、直前の変更が消えることがある。起動できたらすぐ mysqldump で書き出す
  • パソコンを終える前に MySQL を止める
ほかの開発・プログラミングの記事は、開発・プログラミングメモの目次から、テーマ別に探せます。

このブログは、にほんブログ村と人気ブログランキングに参加しています。記事が役に立ったら、下のランキングのバナーのどれかを押して応援してもらえると励みになります。

ブログランキング・にほんブログ村へにほんブログ村

サーバー構築・運用ランキング プログラムランキング

MySQLXAMPP
watasoftdevをフォローする

コメント