承知しました。今日やった MySQL 復旧手順 を ESA(エンジニア向けナレッジ共有記事)風にまとめました。
社内共有できるように「背景 → 調査 → 対応 → 学び」で整理しています。
MySQL が「mysql.db テーブル破損」で起動しない問題の復旧手順
背景
-
XAMPP (MariaDB 10.4.10) 環境で MySQL が突然停止し、起動しなくなった。
-
XAMPP Control Panel のログには以下が出力された:
Error: MySQL shutdown unexpectedly. Can't open and lock privilege tables: Table '.\mysql\db' is marked as crashed
-
mysql.db
はシステムデータベース(権限管理用テーブル)のため、起動不能に直結。
調査
-
ポート競合 / サービス競合 を確認 → 問題なし。
-
強制リカバリ起動
mysqld.exe --defaults-file="...\my.ini" --console --innodb-force-recovery=1
→ 依然として
mysql.db
が crashed と出力され、起動不可。 -
C:\xampp7312\mysql\data\mysql
を調査したところ、db.frm
,db.MAD
,db.MAI
が存在。
→ MyISAM ではなく Aria ストレージエンジン のテーブルであることが判明。
対応
1. バックアップ
copy db.frm db.frm.bak
copy db.MAI db.MAI.bak
copy db.MAD db.MAD.bak
2. aria_chk
による修復
cd /d C:\xampp7312\mysql\data\mysql
"C:\xampp7312\mysql\bin\aria_chk.exe" --recover --quick db
-
出力例:
info : Wrong CRC on datapage at ... warning : Number of rows changed from 0 to 2 status : OK
-
→ CRC エラーを修復し、テーブルが復旧。
3. 通常起動
-
innodb_force_recovery
設定を削除。 - XAMPP から MySQL 起動 → 成功。
4. ダンプ取得
mysqldump.exe -u root --all-databases --routines --events > C:\temp\all.sql
- これで全データをバックアップ。
学び / 注意点
-
mysql.db
は Aria テーブル。破損時はaria_chk
を利用する。 -
innodb_force_recovery
は InnoDB テーブル復旧には有効だが、システムテーブルが Aria の場合は効果が薄い。 - 今回の復旧後、
mysql.db
の行数が減少(= 権限情報の一部消失)していた。必要に応じてGRANT
コマンドで再設定が必要。 - 復旧直後に 必ず全DBを mysqldump で退避すること。
今後の対策
- 定期的に
mysqldump --all-databases
を自動化してバックアップを確保する。 - サーバー強制終了や電源断を避ける(Aria/ MyISAM はクラッシュに弱い)。
- システムDBが壊れた場合は 同バージョンのクリーンな
mysql
フォルダと置換 するのも最終手段。
👉 これで「今日の復旧の流れ」を ESA 用にまとめてみました。
必要なら Markdown のまま esa.io に貼り付けられます。
ご希望あれば コードブロック部分をシェルスクリプト化したり、チェックリスト形式に直すこともできますが、その方がいいですか?