なぜGeneral Logだけでは不十分なのか?
朝起きて、重要なデータテーブルが突然「消えていた」という経験はありませんか?さらに悪いことに、General Logを確認しても、何百万行もの無意味なクエリの中に埋もれて途方に暮れてしまうかもしれません。<a href="https://itfromzero.com/ja/database/mysql-ja-database/mysql%e3%82%b9%e3%83%ad%e3%83%bc%e3%82%af%e3%82%a8%e3%83%aa%e3%83%ad%e3%82%b0%e3%82%92%e4%bd%bf%e7%94%a8%e3%81%97%e3%81%a6%e9%81%85%e3%81%84sql%e3%82%af%e3%82%a8%e3%83%aa%e3%82%92%e6%a4%9c%e5%87%ba.html">Slow Query Log</a>も役に立ちません。なぜなら、それは実行の遅いクエリを記録するだけで、「危険な」コマンドを記録するものではないからです。
PCI DSS、HIPAA、GDPRなどの厳格な基準では、誰が、いつ、どのIPから操作したかを正確に追跡することが義務付けられています。MySQL Audit Log Pluginは、このギャップを埋めるために誕生しました。単にログを記録するだけでなく、高度なフィルタリング機能を提供し、システム内のあらゆる変更を管理できるようにします。
私が運用している50GBのシステムでの経験ですが、秒間2,000クエリすべてに対してAudit Logを有効にすると、CPU使用率が30%急増しました。しかし、DROP、DELETE、GRANTなどのコマンドのみをフィルタリングするように設定したところ、パフォーマンスへの影響はほとんどなくなりました。これにより、開発チームにステージング環境へのアクセス権限を安心して付与できるようになりました。
Community版ではどのAudit Pluginを選ぶべきか?
高価なEnterprise版を使用しなくても、コミュニティから提供されている3つの優れた選択肢があります:
- Percona Audit Log Plugin: 現在のナンバーワンの選択肢です。JSON形式をスムーズにサポートし、MySQL 8.0と完璧な互換性があります。
- MariaDB Audit Plugin: MySQLでも動作しますが、メジャーバージョンのアップグレード時にスクリプトエラーが発生することがあります。
- McAfee MySQL Audit Plugin: かつては非常に有名でしたが、現在は新機能の更新速度がかなり遅くなっています。
この記事では、実環境での卓越した安定性を考慮し、Percona Audit Log Pluginに基づいた解説を行います。
クイックインストール手順
まず、システムのプラグインディレクトリの場所を確認する必要があります。MySQLにログインして以下を入力してください:
SHOW VARIABLES LIKE 'plugin_dir';
audit_log.soファイルを上記のディレクトリにコピーした後、次のコマンドでプラグインを有効化します:
INSTALL PLUGIN audit_log SONAME 'audit_log.so';
すべてが準備できているか確認するために、ステータスを再チェックしましょう:
SHOW PLUGINS;
-- 設定パラメータの確認
SHOW VARIABLES LIKE 'audit_log%';
audit_logの行にACTIVEステータスが表示されれば、半分は完了です。
最適設定:ディスクフルを防ぐ
数時間でディスクがいっぱいにならないよう、デフォルト設定のままにはしないでください。以下は、私が本番サーバーで行っている最適化方法です。
1. JSON形式を優先する
古いXML形式は忘れましょう。JSONを使用することで、ELK StackやPythonスクリプトなどのツールによるログ処理が40%高速化されます。
SET GLOBAL audit_log_format = 'JSON';
2. ログ記録ポリシー(Policy)の設定
4つの選択肢があります:ALL(すべて記録)、NONE(無効)、LOGINS(ログインのみ記録)、QUERIES(クエリのみ記録)。ヒント:ALLを選択しつつ、exclude_accounts機能を使用して、不要なログを頻繁に生成するシステムユーザーを除外するのがおすすめです。
3. my.cnfによる永続的な設定
MySQLの再起動後も設定を維持するために、my.cnfファイルに以下の行を追加します:
[mysqld]
audit_log_policy=ALL
audit_log_format=JSON
audit_log_file=/var/log/mysql/audit.log
audit_log_rotate_on_size=100M
audit_log_rotations=10
ログファイルを100MBごとに分割することで、数GBのログファイルでテキストエディタがフリーズするのを待つことなく、非常に素早く内容を確認できます。
成果:証跡の追跡
機密性の高いコマンドを実行して、すぐにログファイルを監視してみましょう:
tail -f /var/log/mysql/audit.log
次のような詳細なレコードが表示されます:
{
"audit_record": {
"name": "Query",
"timestamp": "2026-05-19T10:00:00Z",
"command_class": "drop_table",
"user": "dev_user[dev_user] @ localhost [192.168.1.15]",
"sqltext": "DROP TABLE customer_data"
}
}
ログを見ると、IP 192.168.1.15のdev_userがテーブル削除コマンドを実行したことが一目瞭然です。すべてが透明化されます。
「安眠」するためのアドバイス
ログをデータベースサーバーに永久に保存したままにしないでください。ハッカーは侵入後、証拠隠滅のためにログを削除する傾向があります。私は常にlogrotateと簡単なスクリプトを組み合わせて、1時間ごとにログをS3に転送しています。これにより、サーバーにトラブルが発生しても追跡データは常に安全に保たれます。
給与や顧客情報が含まれる特定のテーブルのみに関心がある場合は、Audit Filteringを使用してターゲットを絞り込んでください。この方法はリソースを節約するだけでなく、情報の検索スピードも数倍速くなります。
MySQL Audit Logは魔法の杖ではありませんが、データを守る強力な盾になります。皆さんの導入が成功することを願っています!

