Oracle 19c se2 audit ログ定期クリーンアップ　備忘録

ChatGPTの回答の備忘録だけ。

統一監査のログがデータベースのストレージを圧迫しないように、定期的にログをクリーンアップすることが重要です。Oracle は `DBMS_AUDIT_MGMT` パッケージを提供しており、これを使用して監査ログを管理およびクリーンアップできます。

### **ステップ 1：DBMS_AUDIT_MGMT パッケージの有効化**

まず、`DBMS_AUDIT_MGMT` パッケージがデータベースで有効になっていることを確認します。通常、Oracle 19c ではこのパッケージはデフォルトで利用可能です。もし利用できない場合は、データベース管理者に連絡して有効化してください。

### **ステップ 2：クリーンアップポリシーの設定**

`DBMS_AUDIT_MGMT` パッケージを使用して、古い監査ログを定期的にクリーンアップするポリシーを設定できます。例えば、特定の期間内の監査ログだけを保持し、それ以外のログを削除することができます。

#### **例：過去 30 日間の監査ログを保持する設定**

```sql
BEGIN
  -- 監査ログ管理の初期化
  DBMS_AUDIT_MGMT.INIT_CLEANUP(
    AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, 
    DEFAULT_CLEANUP_INTERVAL => 12);  -- 12 時間ごとにチェック

  -- クリーンアップポリシーの設定、過去 30 日間のログを保持
  DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(
    AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, 
    LAST_ARCHIVE_TIME => SYSTIMESTAMP - INTERVAL '30' DAY);
  
  -- クリーンアップの実行
  DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL(
    AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
    USE_LAST_ARCH_TIMESTAMP => TRUE);
END;
/
```

### **ステップ 3：定期的な自動クリーンアップの設定**

クリーンアップ作業を自動化するために、上記のスクリプトをスケジューリングタスク（`DBMS_SCHEDULER` を使用）として設定し、定期的に実行することができます。例えば、毎日または毎週クリーンアップタスクを実行するように設定します。

#### **例：毎日クリーンアップを行うジョブの作成**

```sql
BEGIN
  DBMS_SCHEDULER.CREATE_JOB (
    job_name        => 'audit_log_cleanup_job',
    job_type        => 'PLSQL_BLOCK',
    job_action      => 'BEGIN DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL(
                         AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
                         USE_LAST_ARCH_TIMESTAMP => TRUE); END;',
    start_date      => SYSTIMESTAMP,
    repeat_interval => 'FREQ=DAILY; BYHOUR=2; BYMINUTE=0; BYSECOND=0',
    enabled         => TRUE);
END;
/
```

この例では、毎日午前 2 時に実行されるクリーンアップジョブ `audit_log_cleanup_job` を作成しています。このジョブは、30 日を超える統一監査ログを自動的に削除します。

### **ステップ 4：クリーンアップジョブの監視**

作成したクリーンアップジョブの状態を監視し、正常に実行されているか確認することができます。これには、`DBA_SCHEDULER_JOBS` と `DBA_SCHEDULER_JOB_RUN_DETAILS` ビューを使用します。

```sql
-- クリーンアップジョブの状態を確認
SELECT job_name, state, last_start_date, last_run_duration
FROM dba_scheduler_jobs
WHERE job_name = 'AUDIT_LOG_CLEANUP_JOB';

-- クリーンアップジョブの実行履歴を確認
SELECT job_name, status, run_duration, log_date
FROM dba_scheduler_job_run_details
WHERE job_name = 'AUDIT_LOG_CLEANUP_JOB';
```

これらの手順を通じて、Oracle の統一監査ログを効率的に管理し、ストレージスペースが監査ログによって圧迫されることを防ぐことができます。定期的なクリーンアップにより、データベースのパフォーマンスとストレージリソースが適切に維持されます。


はい、従来の監査（Traditional Auditing）でも、同様の方法でログを定期的にクリーンアップすることが可能です。Oracle が提供する `DBMS_AUDIT_MGMT` パッケージは、統合監査（Unified Auditing）だけでなく、従来の監査ログの管理にも使用できます。以下に、従来の監査ログを定期的にクリーンアップする手順を説明します。

### **ステップ 1：従来監査のログ管理の初期化**

まず、従来監査ログの管理を初期化する必要があります。`DBMS_AUDIT_MGMT.INIT_CLEANUP` を使用して設定します。

```sql
BEGIN
  -- 従来監査ログの管理を初期化
  DBMS_AUDIT_MGMT.INIT_CLEANUP(
    AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUDIT_TRAIL,  -- 従来監査ログに適用
    DEFAULT_CLEANUP_INTERVAL => 12);  -- 12 時間ごとにチェック
END;
/
```

### **ステップ 2：クリーンアップポリシーの設定**

`DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP` を使用して、ログの保持期間を設定できます。例えば、過去 30 日間の監査ログのみを保持するように設定します。

```sql
BEGIN
  -- クリーンアップポリシーの設定、過去 30 日間の監査ログを保持
  DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(
    AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUDIT_TRAIL, 
    LAST_ARCHIVE_TIME => SYSTIMESTAMP - INTERVAL '30' DAY);
END;
/
```

### **ステップ 3：定期的なクリーンアップの実行**

統合監査と同様に、従来監査ログのクリーンアップを定期的に実行するために、スケジューリングタスクを作成することができます。例えば、毎日実行されるタスクを作成します：

```sql
BEGIN
  DBMS_SCHEDULER.CREATE_JOB (
    job_name        => 'traditional_audit_log_cleanup_job',
    job_type        => 'PLSQL_BLOCK',
    job_action      => 'BEGIN DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL(
                         AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUDIT_TRAIL,
                         USE_LAST_ARCH_TIMESTAMP => TRUE); END;',
    start_date      => SYSTIMESTAMP,
    repeat_interval => 'FREQ=DAILY; BYHOUR=2; BYMINUTE=0; BYSECOND=0',
    enabled         => TRUE);
END;
/
```

このタスクは毎日午前 2 時に実行され、30 日を超える従来監査ログを自動的に削除します。

### **ステップ 4：クリーンアップタスクの監視**

クリーンアップタスクの状態を監視し、正常に実行されているか確認することができます。これには、`DBA_SCHEDULER_JOBS` と `DBA_SCHEDULER_JOB_RUN_DETAILS` ビューを使用します。

```sql
-- クリーンアップタスクの状態を確認
SELECT job_name, state, last_start_date, last_run_duration
FROM dba_scheduler_jobs
WHERE job_name = 'TRADITIONAL_AUDIT_LOG_CLEANUP_JOB';

-- クリーンアップタスクの実行履歴を確認
SELECT job_name, status, run_duration, log_date
FROM dba_scheduler_job_run_details
WHERE job_name = 'TRADITIONAL_AUDIT_LOG_CLEANUP_JOB';
```

これらの手順を実行することで、Oracle データベース内の従来監査ログを効果的に管理し、ログファイルがストレージを過剰に占有することを防ぎ、データベースのパフォーマンスと可用性を確保することができます。