Oracle の監査ログは放置するとテーブルやディスクが肥大化し、パフォーマンス低下やディスク枯渇の原因になります。本記事では、監査ログの保存先の確認と変更、DBMS_AUDIT_MGMT による自動クリーンアップ、保持期間の設定まで解説します。
この記事でわかること
・伝統的監査(DB テーブル / OS ファイル)の保存先の確認と変更
・統合監査(UNIFIED_AUDIT_TRAIL)の保存場所
・DBMS_AUDIT_MGMT によるクリーンアップの初期設定
・自動クリーンアップジョブのスケジュール
・手動クリーンアップの方法
・OS 監査ファイルのローテーション
・監査ログ肥大化の予防策
・伝統的監査(DB テーブル / OS ファイル)の保存先の確認と変更
・統合監査(UNIFIED_AUDIT_TRAIL)の保存場所
・DBMS_AUDIT_MGMT によるクリーンアップの初期設定
・自動クリーンアップジョブのスケジュール
・手動クリーンアップの方法
・OS 監査ファイルのローテーション
・監査ログ肥大化の予防策
監査ログの保存先一覧
| 監査方式 | 保存先 | 確認方法 |
|---|---|---|
| 伝統的監査(DB) | SYS.AUD$ テーブル(SYSTEM 表領域) | SELECT COUNT(*) FROM sys.aud$ |
| 伝統的監査(OS) | audit_file_dest パラメータのパス | SHOW PARAMETER audit_file_dest |
| 伝統的監査(XML) | audit_file_dest + XML 形式 | SHOW PARAMETER audit_file_dest |
| 統合監査(12c+) | AUDSYS.AUD$UNIFIED テーブル | SELECT COUNT(*) FROM unified_audit_trail |
| SYS 操作の監査 | audit_syslog_level または OS ファイル | SHOW PARAMETER audit_sys_operations |
SQL(保存先の確認)
-- 伝統的監査: DB / OS / XML のどれか SHOW PARAMETER audit_trail; -- DB: SYS.AUD$ テーブルに保存 -- OS: audit_file_dest の OS ファイルに保存 -- XML: audit_file_dest に XML ファイルで保存 -- OS 監査ファイルのパス SHOW PARAMETER audit_file_dest; -- 例: /oracle/admin/ORCL/adump -- 統合監査が有効か確認 SELECT VALUE FROM V$OPTION WHERE PARAMETER = 'Unified Auditing'; -- TRUE = 統合監査が有効
DB テーブルの監査ログサイズを確認する
SQL(監査テーブルのサイズ確認)
-- 伝統的監査テーブル SYS.AUD$ のサイズ
SELECT segment_name, ROUND(bytes/1024/1024, 1) AS size_mb
FROM dba_segments
WHERE segment_name = 'AUD$' AND owner = 'SYS';
-- 統合監査テーブルのサイズ
SELECT segment_name, ROUND(bytes/1024/1024, 1) AS size_mb
FROM dba_segments
WHERE segment_name LIKE 'AUD$UNIFIED%' AND owner = 'AUDSYS';
-- レコード数
SELECT COUNT(*) AS record_count FROM sys.aud$;
SELECT COUNT(*) AS record_count FROM unified_audit_trail;
-- 月ごとのレコード数推移
SELECT TO_CHAR(event_timestamp, 'YYYY-MM') AS month,
COUNT(*) AS cnt
FROM unified_audit_trail
GROUP BY TO_CHAR(event_timestamp, 'YYYY-MM')
ORDER BY month;
SYS.AUD$ は SYSTEM 表領域にある
伝統的監査の SYS.AUD$ テーブルは SYSTEM 表領域に格納されます。監査ログが肥大化するとSYSTEM 表領域が枯渇し、データベース全体に影響を与えます。定期的なクリーンアップは必須です。
伝統的監査の SYS.AUD$ テーブルは SYSTEM 表領域に格納されます。監査ログが肥大化するとSYSTEM 表領域が枯渇し、データベース全体に影響を与えます。定期的なクリーンアップは必須です。
SYS.AUD$ を別の表領域に移動する
SYS.AUD$ を SYSTEM 表領域から専用の表領域に移動することで、肥大化時の影響範囲を限定できます。
SQL(AUD$ テーブルの移動)
-- (1) 専用表領域を作成
CREATE TABLESPACE audit_ts DATAFILE
'/oracle/oradata/ORCL/audit_ts01.dbf' SIZE 2G AUTOEXTEND ON MAXSIZE 10G;
-- (2) AUD$ を移動(DBMS_AUDIT_MGMT 使用)
BEGIN
DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION(
audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
audit_trail_location_value => 'AUDIT_TS'
);
END;
/
-- 統合監査テーブルの移動
BEGIN
DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION(
audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
audit_trail_location_value => 'AUDIT_TS'
);
END;
/
SYS.AUD$ の移動は本番環境で推奨
SYSTEM 表領域の肥大化は DB 全体に影響するため、監査ログ専用の表領域に移動するのがベストプラクティスです。移動はオンライン(DB 稼働中)で実行可能です。
SYSTEM 表領域の肥大化は DB 全体に影響するため、監査ログ専用の表領域に移動するのがベストプラクティスです。移動はオンライン(DB 稼働中)で実行可能です。
DBMS_AUDIT_MGMT によるクリーンアップ
初期設定(初回のみ)
SQL(クリーンアップの初期設定)
-- 統合監査のクリーンアップを初期化
BEGIN
DBMS_AUDIT_MGMT.INIT_CLEANUP(
audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
default_cleanup_interval => 720 -- 時間(30 日)
);
END;
/
-- 伝統的監査の場合
BEGIN
DBMS_AUDIT_MGMT.INIT_CLEANUP(
audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
default_cleanup_interval => 720
);
END;
/
-- 初期化状態の確認
SELECT audit_trail, cleanup_interval
FROM dba_audit_mgmt_config_params
WHERE parameter_name = 'DEFAULT CLEAN UP INTERVAL';
手動クリーンアップ
SQL(手動で古い監査ログを削除)
-- (1) アーカイブタイムスタンプを設定(この日時より前のログを削除対象にする)
BEGIN
DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(
audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
last_archive_time => SYSDATE - 90 -- 90 日以前を削除対象
);
END;
/
-- (2) クリーンアップを実行
BEGIN
DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL(
audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
use_last_arch_timestamp => TRUE
);
END;
/
自動クリーンアップジョブの設定
SQL(自動クリーンアップの設定)
-- 自動クリーンアップジョブを作成(日次実行)
BEGIN
DBMS_AUDIT_MGMT.CREATE_PURGE_JOB(
audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
audit_trail_purge_interval => 24, -- 24 時間ごと
audit_trail_purge_name => 'UNIFIED_AUDIT_PURGE_JOB',
use_last_arch_timestamp => TRUE
);
END;
/
-- ジョブの状態を確認
SELECT job_name, job_status, audit_trail,
job_frequency AS interval_hours
FROM dba_audit_mgmt_cleanup_jobs;
SQL(自動クリーンアップジョブの削除)
-- ジョブを削除
BEGIN
DBMS_AUDIT_MGMT.DROP_PURGE_JOB(
audit_trail_purge_name => 'UNIFIED_AUDIT_PURGE_JOB'
);
END;
/
audit_trail_type の定数一覧
| 定数 | 対象 |
|---|---|
| AUDIT_TRAIL_AUD_STD | 伝統的監査(SYS.AUD$) |
| AUDIT_TRAIL_FGA_STD | FGA 監査(SYS.FGA_LOG$) |
| AUDIT_TRAIL_UNIFIED | 統合監査(AUDSYS.AUD$UNIFIED) |
| AUDIT_TRAIL_OS | OS ファイル監査 |
| AUDIT_TRAIL_XML | XML 形式の OS ファイル監査 |
| AUDIT_TRAIL_ALL | 上記すべて |
OS 監査ファイルのローテーション
audit_trail=OS / XML の場合、OS ファイルに監査ログが蓄積されます。OS レベルでの定期削除が必要です。
Shell(OS 監査ファイルの確認と削除)
# 監査ファイルの場所を確認 sqlplus / as sysdba -s <<EOF SHOW PARAMETER audit_file_dest EOF # 例: /oracle/admin/ORCL/adump # ファイル数とサイズの確認 ls -la /oracle/admin/ORCL/adump/ | wc -l du -sh /oracle/admin/ORCL/adump/ # 90 日以上前の監査ファイルを削除 find /oracle/admin/ORCL/adump/ -name '*.aud' -mtime +90 -delete find /oracle/admin/ORCL/adump/ -name '*.xml' -mtime +90 -delete
Shell(cron で OS ファイルを定期削除)
# crontab: 毎日 4:00 に 90 日以上前の監査ファイルを削除 0 4 * * * find /oracle/admin/ORCL/adump/ -name '*.aud' -mtime +90 -delete
OS 監査ファイルは DBMS_AUDIT_MGMT でも削除可能
OS ファイル形式の監査ログも DBMS_AUDIT_MGMT(audit_trail_type=AUDIT_TRAIL_OS)で管理できます。OS の find コマンドでの削除でも問題ありませんが、DBMS_AUDIT_MGMT に統一する方が管理が容易です。
OS ファイル形式の監査ログも DBMS_AUDIT_MGMT(audit_trail_type=AUDIT_TRAIL_OS)で管理できます。OS の find コマンドでの削除でも問題ありませんが、DBMS_AUDIT_MGMT に統一する方が管理が容易です。
保持期間の設定
| 要件 | 保持期間の目安 | 根拠 |
|---|---|---|
| 一般的な運用 | 90 日 | 直近 3 か月の操作を追跡可能 |
| PCI DSS | 1 年(直近 3 か月は即時参照可能) | PCI DSS Requirement 10.7 |
| SOX 法 | 7 年 | 財務データの監査証跡 |
| ISMS / ISO 27001 | 組織のポリシーに依存 | 通常 1〜3 年 |
SQL(保持期間に基づくクリーンアップ設定の例)
-- 90 日保持: 90 日以前のログを自動削除
BEGIN
-- アーカイブタイムスタンプを毎日更新するジョブと組み合わせ
DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(
audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
last_archive_time => SYSDATE - 90
);
END;
/
-- 上記を毎日実行する DBMS_SCHEDULER ジョブ
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name => 'JOB_SET_ARCHIVE_TS',
job_type => 'PLSQL_BLOCK',
job_action => 'BEGIN DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP('
|| 'DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, SYSDATE-90); END;',
start_date => TRUNC(SYSDATE) + 1 + 3/24,
repeat_interval => 'FREQ=DAILY; BYHOUR=3',
enabled => TRUE
);
END;
/
実務パターン集
パターン(1): 統合監査の完全なクリーンアップ設定
SQL(推奨設定: 初期化 + アーカイブTS + 自動ジョブ)
-- (1) 初期化
EXEC DBMS_AUDIT_MGMT.INIT_CLEANUP(DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, 720);
-- (2) 90 日保持のアーカイブタイムスタンプを設定
BEGIN
DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(
DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, SYSDATE - 90);
END;
/
-- (3) 自動クリーンアップジョブ(日次)
BEGIN
DBMS_AUDIT_MGMT.CREATE_PURGE_JOB(
audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
audit_trail_purge_interval => 24,
audit_trail_purge_name => 'DAILY_AUDIT_PURGE',
use_last_arch_timestamp => TRUE
);
END;
/
パターン(2): 伝統的監査 + OS ファイルの両方をクリーンアップ
Shell(統合スクリプト)
#!/bin/bash
# audit_cleanup.sh
# DB テーブルのクリーンアップ
sqlplus / as sysdba <<EOF
BEGIN
DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(
DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, SYSDATE - 90);
DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL(
DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, TRUE);
END;
/
EOF
# OS ファイルの削除
find /oracle/admin/ORCL/adump/ -name '*.aud' -mtime +90 -delete
パターン(3): 緊急対応(テーブル肥大化時)
SQL(緊急: AUD$ を TRUNCATE)
-- SYSTEM 表領域が逼迫している場合の緊急対応
-- 注意: 監査ログが全件削除される
TRUNCATE TABLE sys.aud$;
TRUNCATE TABLE sys.fga_log$;
-- 統合監査の緊急削除
BEGIN
DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(
DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, SYSDATE);
DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL(
DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, TRUE);
END;
/
TRUNCATE は最終手段
TRUNCATE TABLE sys.aud$ は監査ログを全件削除するため、コンプライアンス要件に抵触する可能性があります。SYSTEM 表領域の緊急空き確保が目的の場合のみ使用し、事前に必要なログを CSV 等にエクスポートしてから実行してください。
TRUNCATE TABLE sys.aud$ は監査ログを全件削除するため、コンプライアンス要件に抵触する可能性があります。SYSTEM 表領域の緊急空き確保が目的の場合のみ使用し、事前に必要なログを CSV 等にエクスポートしてから実行してください。
監査ログの監視
SQL(監査ログサイズの定期監視)
-- 監査テーブルのサイズとレコード数を確認
SELECT 'AUD$' AS trail,
(SELECT ROUND(bytes/1024/1024) FROM dba_segments
WHERE segment_name='AUD$' AND owner='SYS') AS size_mb,
(SELECT COUNT(*) FROM sys.aud$) AS records
FROM DUAL
UNION ALL
SELECT 'UNIFIED',
(SELECT ROUND(SUM(bytes)/1024/1024) FROM dba_segments
WHERE segment_name LIKE 'AUD$UNIFIED%' AND owner='AUDSYS'),
(SELECT COUNT(*) FROM unified_audit_trail)
FROM DUAL;
よくある質問
QSYS.AUD$ を SYSTEM 表領域から移動すべきですか?
A本番環境では移動を強く推奨します。AUD$ が肥大化すると SYSTEM 表領域が枯渇し、DB 全体が停止するリスクがあります。DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION で専用表領域に移動してください。
QDBMS_AUDIT_MGMT.INIT_CLEANUP は必須ですか?
Aはい。CLEAN_AUDIT_TRAIL や CREATE_PURGE_JOB を使う前に初期化が必須です。初期化せずにクリーンアップを実行すると ORA エラーが発生します。初期化は DB ごとに 1 回だけ実行すれば十分です。
QSET_LAST_ARCHIVE_TIMESTAMP はどういう意味ですか?
A「この日時より前のログは外部にアーカイブ済み」という宣言です。CLEAN_AUDIT_TRAIL に use_last_arch_timestamp=TRUE を指定すると、このタイムスタンプより前のログだけが削除されます。外部保管していなくても削除のための閾値として使えます。
QTRUNCATE TABLE sys.aud$ は安全ですか?
A動作自体は安全(DB は壊れない)ですが、監査ログが全件消えるため、コンプライアンス上の問題が生じる可能性があります。通常は DBMS_AUDIT_MGMT で保持期間を指定して段階的に削除するのが推奨です。TRUNCATE は SYSTEM 表領域枯渇時の緊急手段です。
Q統合監査のログはどのくらいのペースで増えますか?
A監査ポリシーの範囲と DB の利用頻度に依存します。ログオン監査のみなら 1 日数千件程度ですが、全 DML を監査すると 1 日数十万〜数百万件になることもあります。定期的にサイズを確認し、クリーンアップの頻度を調整してください。
QOS 監査ファイル(.aud)を削除しても DB に影響はありますか?
Aありません。OS 監査ファイルは書き込み専用で、DB は参照しません。古いファイルを find + delete で削除しても DB の動作に影響はありません。ただし DBA_AUDIT_TRAIL(audit_trail=OS 時)の検索結果からは消えます。
まとめ
監査ログの保存先とローテーションの要点をまとめます。
| やりたいこと | 方法 |
|---|---|
| DB 監査ログのサイズ確認 | SELECT bytes FROM dba_segments WHERE segment_name=’AUD$’ |
| AUD$ を SYSTEM 表領域から移動 | DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION |
| クリーンアップの初期化 | DBMS_AUDIT_MGMT.INIT_CLEANUP |
| 手動クリーンアップ | SET_LAST_ARCHIVE_TIMESTAMP + CLEAN_AUDIT_TRAIL |
| 自動クリーンアップ(日次) | DBMS_AUDIT_MGMT.CREATE_PURGE_JOB |
| OS 監査ファイルの定期削除 | find /path -name ‘*.aud’ -mtime +90 -delete(cron) |
| 緊急時のテーブル全削除 | TRUNCATE TABLE sys.aud$(最終手段) |
監査機能の設定方法は「監査(AUDIT)機能の設定方法」も併せて参照してください。

