ことれいのもり

MySQLが起動しないエラーの復旧がなぜできる?~手順解説編~

はじめに

前々回の記事で、XAMPPでMySQLのStartボタンを押しても起動しないエラーの復旧方法を紹介しました。

それを踏まえて前編では、MySQL起動エラーの復旧理由を理解するために、関連する用語・フォルダ・ファイルを解説しました。

後編となるこの記事では、実際の復旧手順に沿って、なぜこの操作でMySQLのエラーが直るのかを詳しく解説します。


前編である用語理解編を前提としているので、まだ見ていない方は先にご覧ください。


前々回の記事:XAMPPでMySQLのStartボタンを押しても起動しないエラーの復旧方法

解説 前編:MySQLが起動しないエラーの復旧がなぜできる?~用語理解編~

解説 後編:MySQLが起動しないエラーの復旧がなぜできる?~手順解説編~

前提や環境

環境

  • XAMPP
  • MySQL
  • phpMyAdmin


ここから先の内容は、私の理解をもとに初心者の方にも分かりやすく説明しています。

そのため、厳密な定義や専門的な正確さよりも、イメージしやすさを優先している部分があります。

正確な情報を知りたい方は、公式ドキュメントや専門書などもあわせてご覧いただければ幸いです。

手順に沿って説明

ここからは、実際の復旧手順に沿って何をしているのかを具体的に説明します。


前々回の記事から、復旧手順のみ抜粋します。

1.xampp\mysql\data フォルダを一旦別の場所にコピーしておく(バックアップ用として待避させる)その後、中身を全削除

2. xampp\mysql\backupフォルダの中身を全てコピーし、xampp\mysql\dataの中へ貼り付ける

3. XAMPPControlPanel→MySQLで起動できるようになっている

4. 最初にコピーしておいた元のdataフォルダから、自分で作成していたデータベースのフォルダーとibdata1というファイルをコピーしてxampp\mysql\dataに貼り付ける

5. XAMPPControlPanelのMySQLのAdminボタンからphpMyAdminを開き、データベースが復元できているか確認する

6. 復旧完了!

0. エラー文

まずは、XAMPP Controll Panelに表示されるエラー文を見てみます。

ControlPanelのエラー


このときのエラー文は以下の通りです。

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


日本語に翻訳するとこうなります。

エラー: MySQL が予期せずシャットダウンしました。
ポートのブロック、依存関係の不足、不適切な権限、クラッシュ、または別の方法によるシャットダウンが原因の可能性があります。
[ログ] ボタンを押してエラーログを表示し、Windows イベント ビューアーでさらに詳しい情報を確認してください。
さらにサポートが必要な場合は、このログ ウィンドウ全体をコピーしてフォーラムに投稿してください。


このメッセージは原因をたくさん列挙していますが、XAMPP環境でよくあるのは、データベース本体(xampp\mysql\data)の破損です。

dataフォルダには、「システムデータベース」「ユーザーデータベース」が両方入っています。


そのため、復旧の方針は次のようになります。


1. システムデータベースを初期状態に戻す(backupフォルダから復元)

2. ユーザーデータベースを元のdataフォルダから移し替える


こうすることで、MySQL本体を正常に起動できる状態に戻しつつ、自分で作成したデータベースも復元できる、という流れになります。

1. dataフォルダを別の場所にコピーして全削除する

xampp\mysql\dataフォルダを一旦別の場所にコピーして待避させます。
その後、xampp\mysql\dataフォルダの中身を全て削除します。


最初の操作として、dataフォルダを一旦別の場所にコピーして保存します。

これはdataフォルダの中に「システムデータベース」と「ユーザーデータベース」の両方が含まれており、ユーザーデータベースは後から戻すので、別の場所にバックアップしておく必要があるからです。


次の操作では、dataフォルダの中身を全て削除します。

dataフォルダは壊れている可能性があるので、一度削除してリセットしたいからです。

2. backupフォルダの中身をdataフォルダへ移す

xampp\mysql\backupフォルダの中身を全てコピーし、xampp\mysql\dataフォルダの中へ貼り付けます。(待避させた方ではなく、全部削除した方に貼り付けます)


backupフォルダは、初期状態のデータを保持しています。

これは、システムデータベースそのものです。

backupフォルダの中身をdataフォルダに貼り付けることで、システムデータベースを初期状態に戻している、という操作になります。

3. 一度MySQLを起動してみる

ここで一度MySQLを起動してみます。  
Startボタンを押した後、緑色になっていれば成功です。


システムデータベースを初期化した状態で、MySQLが起動できるか確かめます。

「MySQLが起動した」ということは、システムデータベースは破損していない、という意味になります。


ただ、この状態ではユーザーデータベースのデータが戻っていません。

dataフォルダのバックアップを取っているので、移し替えましょう。

4. 1で待避させたdataフォルダから必要なファイルをコピーする

1で待避させたdataフォルダから、自分で作成したデータベースのフォルダとibdata1ファイルをコピーして、
xampp\mysql\dataの中に貼り付けます。


待避させたdataフォルダから、ユーザーデータベースの部分とibdata1ファイルをxampp\mysql\dataフォルダに移動させます。

これにより、自分で作成したデータベースの情報を移すことができました。


ここで、「なぜibdata1ファイルも一緒に移す必要があるの?」と疑問に思う方もいるかもしれません。

それは、backupフォルダから移してきたibdata1ファイルには、システムデータベースの情報しかないからです。


ibdata1ファイルの移動経路と中身を確認してみましょう。

まず、ibdata1ファイルは、xampp\mysql\dataフォルダに存在します。


「1. dataフォルダを別の場所にコピーして全削除する」

この時のdataフォルダ内のibdata1ファイルは、システムデータベース・ユーザーデータベースの両方の情報を持っています。


「2. backupフォルダの中身をdataフォルダへ移す」

backupフォルダは、初期状態のシステムデータベースのみ入っています。

つまり、ここにあるibdata1ファイルは、システムデータベースの情報のみ持っています。

この中身をdataフォルダに移すので、dataフォルダ内のibdata1ファイルも、システムデータベースの情報のみ持っていることになります。


「4. 1で待避させたdataフォルダから必要なファイルをコピーする」

ユーザーデータベースの中身をdataフォルダに移します。

ここでibdata1ファイルを移さなかった場合を考えてみましょう。

このときのdataフォルダ内は以下の通りです。


システムデータベース・ユーザーデータベースの情報は存在します。

しかし、ibdata1ファイルはbackupフォルダからコピーしてきた物です。

思い出してください、backupフォルダはシステムデータベースのみ入っていましたね。

つまり、ibdata1ファイルはシステムデータベースの情報しか持っていません!

これにより、ユーザーデータベースの存在は認識できるけど、どこにあるのかは分からないという状態に陥り、エラーになります。


これを解決するにはどうしたら良いのでしょうか?

それは、システムデータベース・ユーザーデータベースの両方の情報を持つibdata1ファイルに置き換えればいいです。

両方の情報を持つibdata1ファイルは、最初に待避させたdataフォルダ内のibdata1ファイルです。

だから、ユーザーデータベースを移すときに一緒にibdata1ファイルも移す、ということになります。


長く説明してきましたが、まとめると以下のようになります。(データベースはDBと省略して書いています)

  • 待避させたdataフォルダ内のibdata1ファイルはシステムDB・ユーザーDBの両方の情報を持っている
  • backupフォルダ内のibdata1ファイルはシステムDBの情報しか持たない
  • そのままユーザーDBのみをコピーすると、どこにユーザーDBがあるか認識できずにエラーになる
  • そこで、ユーザーDBをコピーするときにibdata1ファイルもコピーすることで、両方の情報を認識でき、正常にMySQLが起動する


ここが最大の難所にして復旧理解のキモになる部分です!

難しく感じる方は、ぜひご自身の環境で試してください。

私も理解するまでは難しかったですが、自分で試行錯誤することで何とか理解できました!

おわりに

今回は実際の手順に沿って、なぜこの操作をするとMySQLのエラーが直るのか? を解説しました。

エラーの対処方法の記事はいくつも見つかるのに、その理由まで言及しているものは全くなかったので、自分で調べてみたという背景があります。


前編・後編の記事を通じて、ファイルやフォルダが何をしているのか?が理解できるようになったと思います。

これから先、別のエラーが発生しても、原因を理解した上で復旧できるようになるはずです。

これからも、ただエラーの対処方法を載せるのではなく、なぜ直るのか? まで調べて記事にしていこうと思います。

興味がある人は、他の記事もご覧いただけると幸いです。