Windows Server 2022でのMySQL構築:「次へ」の連打がシステムに牙をむく

MySQL tutorial - IT technology blog
MySQL tutorial - IT technology blog

実例: 「次へ、次へ、完了」が罠になる時

システム管理者を始めたばかりの頃、MySQLのインストールはChromeのインストールと同じくらい簡単だと思っていました。インストーラーをダウンロードして、ただ「次へ」を連打すればいいだけだと。しかし、現実はもっと過酷でした。クライアント向けのERPプロジェクトをデプロイした際、運用開始からわずか1週間で手痛い失敗を経験したのです。

他のサーバーからの接続はファイアウォールで遮断され、rootパスワードは推測しやすく、最悪なことにログテーブルが1500万件に達した途端、システムが「亀の歩み」のように遅くなりました。原因は何だったのでしょうか? デフォルトの設定ファイルでは、サーバーに32GBのRAMがあるにもかかわらず、わずか数百MBしか割り当てられていなかったのです。

「開発環境」と「本番環境」の違いは非常に大きいです。デフォルト設定のまま運用することは、ハッカーに門戸を開放し、自らパフォーマンスを絞り込んでいるようなものです。

なぜWindows上のMySQLでは接続エラーが発生しやすいのか?

いくつかのトラブルシューティングを経て、WindowsでのMySQLデプロイが「停滞」する3つの主な障壁を突き止めました。

  • Windowsファイアウォールが厳格すぎる: Linuxとは異なり、Windows Serverはデフォルトですべてのインバウンドトラフィックをブロックします。ポート 3306 は、具体的な通知もなく遮断されることがよくあります。
  • ユーザーホストの制限: MySQLのデフォルトは 'root'@'localhost' のみ許可されています。他のマシンからリモート接続しようとすれば、100%拒否されます。
  • パスワード管理の悩み: Active Directory環境でデータベースのパスワードを別途管理するのは苦痛です。Windowsアカウントでそのままログインしたいと思いつつ、設定方法がわからず足踏みしている方も多いでしょう。

プロフェッショナルなMySQLデプロイ手順

1. エンジンとWorkbenchのインストール

MySQL Installer (MSI) 版を優先して使用しましょう。これは、ZIP版よりも正確かつ自動的にWindowsサービスとして登録してくれます。専用のデータベースサーバーであれば、攻撃対象領域(attack surface)を最小限にするために “Server only” を選択してください。

# インストール時の重要な注意点:
# 認証方式の選択: Use Strong Password Encryption (SHA256) を選択
# アプリケーションが極端に古くない限り、Legacy Authenticationは絶対に使用しないでください。

2. Windowsネイティブ認証の有効化

これはWindows Serverの非常に優れた機能です。パスワードを手動で管理する代わりに、 authentication_windows プラグインを使用します。これにより、MySQLは現在ログインしているWindowsアカウントを通じてユーザーを識別できるようになります。

my.ini ファイル(通常は C:\ProgramData\MySQL\MySQL Server 8.0\my.ini)を探し、 [mysqld] セクションの下に以下の行を追加します。

[mysqld]
plugin-load-add=authentication_windows.dll

その後、MySQL内でマッピングするユーザーを作成します。

CREATE USER 'DOMAIN\社員名' IDENTIFIED WITH authentication_windows;

これで、同僚は自分のPCにログインするだけでデータベースへのアクセス権が得られます。パスワードを入力する必要がなく、利便性と会社のポリシーに沿ったセキュリティを両立できます。

3. PowerShellでポート3306を開放する(GUIは使わない)

GUIでのクリック操作はミスが発生しやすいです。私は常に正確性を期すためにPowerShellスクリプトを使用します。以下のコマンドはポート3306を開放しますが、特定の内部IPレンジ(例:192.168.1.0/24)のみに制限します。

New-NetFirewallRule -DisplayName "Allow MySQL Port 3306" `
    -Direction Inbound `
    -LocalPort 3306 `
    -Protocol TCP `
    -Action Allow `
    -RemoteAddress 192.168.1.0/24

実体験からの教訓: 決して -RemoteAddress Any にしないでください。「Any」で開放してしまえば、わずか5分でサーバーはボットによるスキャンとブルートフォース攻撃にさらされることになります。

4. 大規模データ向けのパフォーマンス最適化

orderslogs テーブルが1000万行を超えると、 innodb_buffer_pool_sizeの設定が死活問題となります。16GBのRAMを搭載したサーバーであれば、思い切って再設定しましょう。

# データベースにRAMの約60-70%を割り当てる
innodb_buffer_pool_size = 10G

# 重いトランザクションをスムーズに処理するためにログファイルを増やす
innodb_log_file_size = 2G

# スパイク時のサーバーダウンを防ぐために接続数を制限する
max_connections = 500

3層の防御戦略

安定運用のために、私は常に「3本柱」のルールを適用しています。

  1. ネットワーク層: ファイアウォールでアプリケーションサーバーの正確なIPのみをフィルタリングする。
  2. OS層: MySQLサービスを専用のサービスアカウントで実行する. LocalSystem 権限は絶対に使用しないでください。MySQLがハッキングされた場合、サーバー全体が乗っ取られる危険性があります。
  3. データベース層: rootのリモート接続を完全に遮断する。root操作はローカル(localhost)のみに制限します。

ちょっとしたコツ: Windows DefenderがMySQLのデータファイルをスキャンすることで、読み書きの速度が20〜30%低下することがあります。データディレクトリ(C:\ProgramData\MySQL\...\Data)をアンチウイルスの除外設定(Exclusion)に追加して、ディスクのパフォーマンスを解放しましょう。

Windows Server 2022上のMySQLは、適切に「飼い慣らす」方法を知っていれば非常に強力です。これらの実戦経験が、皆さんのシステムの高速化と安全性向上に役立つことを願っています。

Share: