― XAMPP / Windows 10 Home 対応・実戦編 ―
(Windows10で作ったバッチファイルはWindows11 Pro移行後も動作しました)

はじめに(なぜこの対策が必要か)
深夜、何の前触れもなく Windows が再起動する。
翌朝、XAMPP を起動すると MySQL が死んでいる。
開発者あるあるですが、これは偶然ではありません。
Windows Update による強制再起動と、MySQL(特に InnoDB)の最悪な相性が原因です。
MySQL は「動作中に電源断・強制終了」されると、ibdata1 やテーブルファイルが簡単に壊れます。
Windows Update を止める、という選択肢もある
しかし「止めずに、再起動前に MySQL だけ安全停止する」方が現実的
この記事では、
Windows Update の再起動予兆を検知 → MySQL を安全にシャットダウン
という仕組みを、Windows 10 Home 環境で構築します。
基本方針(重要)
- Windows Update は止めない
- 再起動「直前」をイベントログで検知する
- MySQL を
mysqladmin shutdownで正常終了させる - 常駐プログラムは使わない(イベント駆動)
鍵になるのは Windows イベントログ です。
再起動の「兆し」はどこに出るのか?
Windows は再起動を行う前、必ずイベントログに記録を残します。
特に重要なのがこれ:
- ログ:System
- ソース:User32
- イベントID:1074
このイベントはこういう意味を持ちます。
「このコンピューターは、◯秒後に再起動(またはシャットダウン)されます」
Windows Update でも、手動再起動でも、
再起動が“予定された瞬間”に必ず発生します。
ここをフックします。
全体構成
- 再起動予定イベント(ID:1074)を検知
- タスクスケジューラが即座に起動
- バッチファイル実行
- MySQL を安全にシャットダウン
① MySQL安全停止用バッチファイルを作る
ファイル例
C:\scripts\mysql_safe_shutdown.bat
内容
@echo off
"C:\xampp\mysql\bin\mysqladmin.exe" -u root shutdown
timeout /t 5 /nobreak >nul
※ MySQL にパスワードがある場合:
-u root -pYourPassword
(-pとパスワードの間にスペースなし)
これは Ctrl+C ではなく、正式な shutdown です。
InnoDB がフラッシュを完了してから終了します。
② タスクスケジューラで「再起動予兆」を監視
手順
- タスクスケジューラを起動
- 「タスクの作成」を選択
全般タブ
- 名前:
MySQL 再起動前安全停止 - ユーザー:
SYSTEM - 「最上位の特権で実行する」✔
トリガー
- 新規 → カスタム
- 「イベント発生時」
- ログ:
System - ソース:
User32 - イベントID:
1074
操作
- プログラムの開始
- プログラム:
C:\scripts\mysql_safe_shutdown.bat
保存して完了です。
③ 動作テスト(必ずやる)
PowerShell またはコマンドプロンプトで:
shutdown /r /t 60 /c "テスト再起動"
60秒以内に MySQL が停止すれば成功です。
この方法の強み
- Windows 10 Home でも動作
- 常駐プロセス不要
- Windows Update / 手動再起動 両対応
- MySQL を「壊さず」止められる
つまり、
Windows は好きに再起動していい
ただし MySQL は俺が止める
という関係を作れます。
注意点(現実的な話)
- 停電・強制電源断は防げない
→ UPS が別途必要 - すでに壊れた InnoDB は直らない
→ バックアップは必須 - これは「被害を減らす」対策であって万能ではない
おわりに
Windows Update は悪ではありません。
ただし サーバ用途の PC にとっては無神経です。
だからこちらも、
イベントログという「足音」を聞いて先回りする。
これはハックではなく、
Windows が用意している正規の仕組みを、正しく使っているだけです。
MySQL を守れるかどうかは、
「再起動の前に一手打てるか」で決まります。
コメント