ENABLE_DDL_LOGGING** 參數自 Oracle 11g 引入,啟用後可在 Alert Log 自動記錄所有 DDL 執行時間與語句文本,為審計、變更追蹤、故障排查提供零成本的原生審計能力。本文詳細說明參數特性、已知 Bug、實測驗證與生產環境應用建議。
| 屬性 | 值 |
|---|---|
| 參數名 | ENABLE_DDL_LOGGING |
| 類型 | BOOLEAN |
| 預設值 | FALSE |
| 可動態修改 | 是 (ALTER SYSTEM SET ... SCOPE=BOTH) |
| 生效範圍 | 實例級 |
| 記錄位置 | Alert Log ($DIAG_HOME/trace/alert_) |
參考官方文檔,涵蓋以下物件的 CREATE/ALTER/DROP/TRUNCATE/RENAME:
Bug 12938609:11.2.0.2 和 11.1.0.7 版本中,RENAME TABLE 語句不會被記錄。
SQL> show parameter ddl NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ ddl_lock_timeout integer 0 enable_ddl_logging boolean FALSE SQL> alter system set enable_ddl_logging=true; System altered. SQL> show parameter ddl NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ ddl_lock_timeout integer 0 enable_ddl_logging boolean TRUE
SQL> show user USER is "LC0029999" SQL> create table t1 as select * from dba_objects where 1=2; Table created. SQL> alter table t1 rename to t11; Table altered. SQL> create table lc0039999.t1 as select * from dba_objects where 1=2; Table created.
Wed Jun 10 01:38:35 2015 ALTER SYSTEM SET enable_ddl_logging=TRUE SCOPE=BOTH; Wed Jun 10 01:39:17 2015 create table t1 as select * from dba_objects where 1=2 Wed Jun 10 01:40:03 2015 alter table t1 rename to t11 Wed Jun 10 01:46:52 2015 create table lc0039999.t1 as select * from dba_objects where 1=2
lc0039999.t1) 同樣被記錄,實現全庫級 DDL 審計。alter table t1 rename to t11 正確記錄。| 缺口 | 補充方案 |
|---|---|
| 無用戶/客戶端資訊 | 啟用標準審計 AUDIT DDL 或 統一審計 (12c+), 記錄 USERHOST, CLIENT_ID 等 |
| Alert Log 輪轉可能丟失 | 配置日誌收集或 LOG_ARCHIVE_DEST 歸檔 Alert Log |
| 無法記錄失敗的 DDL | 結合 DDL_LOGGING (12c) 或 觸發器 AFTER DDL ON DATABASE 捕獲錯誤碼 |
| 大量 DDL 刷屏 Alert Log | 調大 MAX_DUMP_FILE_SIZE、DIAG_DEST 磁盤空間; 或僅維護窗口開啟 |
-- 1. 永久生效 (SPFILE) ALTER SYSTEM SET enable_ddl_logging=TRUE SCOPE=SPFILE; -- 2. 確保 Alert Log 足夠大且被收集 -- log_archive_dest_1='LOCATION=/u01/app/oracle/admin/adump' # 也收集 trace 檔 -- 3. 定期清理/歸檔 Alert Log, 避免佔滿 DIAG_DEST
ENABLE_DDL_LOGGING 仍保留相容,但官方推薦使用 Unified Auditing。ENABLE_DDL_LOGGING=TRUE 是 Oracle 11g 提供的零代碼、零性能影響、全實例級的 DDL 記錄開關。雖缺乏上下文資訊,但作為第一道審計防線、故障排查快照極具價值。建議所有生產庫預設開啟,並配合日誌收集系統構建完整變更審計鏈路。