Windows Updateの再起動を感知して、MySQLを安全にシャットダウンする方法

― XAMPP / Windows 10 Home 対応・実戦編 ―

(Windows10で作ったバッチファイルはWindows11 Pro移行後も動作しました)

猫ガールが「MySQLの安全なシャットダウン」を示している

はじめに(なぜこの対策が必要か)

深夜、何の前触れもなく 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 でも、手動再起動でも、
再起動が“予定された瞬間”に必ず発生します。

ここをフックします。


全体構成

  1. 再起動予定イベント(ID:1074)を検知
  2. タスクスケジューラが即座に起動
  3. バッチファイル実行
  4. 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 がフラッシュを完了してから終了します。


② タスクスケジューラで「再起動予兆」を監視

手順

  1. タスクスケジューラを起動
  2. 「タスクの作成」を選択

全般タブ

  • 名前: 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 を守れるかどうかは、
「再起動の前に一手打てるか」で決まります。

コメント

PAGE TOP