Oracle是一個被廣泛應用的企業級數據庫管理系統,它提供了各種各樣的工具來收集和跟蹤數據庫實例的操作。其中,Oracle Audit Vault和Database Firewall是一個流行的審計解決方案,可以通過使用它提供的AUDIT命令來查詢數據庫實例的活動日志。
當使用AUDIT命令啟用審計時,Oracle記錄了大量的信息,有關于用戶登錄時間,用戶修改的表,以及其他一系列的操作。舉個例子,我們可能想知道一個特定用戶在過去一個月內更改了哪些數據。在這種情況下,使用AUDIT就可以方便地查詢到這些信息。
AUDIT SELECT TABLE, UPDATE TABLE, DELETE TABLE BY SCOTT, HR WHENEVER SUCCESSFUL;
這里,AUDIT命令啟用了SCOTT和HR用戶的審計,并設置了一個過濾器來只記錄SELECT,UPDATE和DELETE操作成功的記錄。此外,這個特定的AUDIT設置的保留時長是一個月。
那么,在這個過程中,生成的審計日志文件通常位于數據庫實例本地目錄中。我們可以通過這些日志文件來查詢數據庫實例中的發生的活動:
SELECT * FROM DBA_AUDIT_TRAIL WHERE TIMESTAMP > SYSDATE - 30 AND USERNAME = 'HR' AND ACTION_NAME IN ('SELECT', 'UPDATE', 'DELETE');
這個查詢操作將在AUDIT軌跡表中搜索最近一個月內,由HR用戶執行的SELECT、UPDATE和DELETE操作日志。
當然,在審計記錄數量過多時,我們通常會想到刪除一部分日志,以保持其存儲空間的合理使用。可以使用以下語句刪除一個月前的所有日志:
DELETE FROM DBA_AUDIT_TRAIL WHERE TIMESTAMP < SYSDATE - 30;
需要注意的是,如果你希望查詢操作考慮被被分段的表,需要使用分段的AUDIT設置。例如,下面這個AUDIT語句將記錄關于HR用戶在表EMP上分段訪問的事件:
AUDIT ALTER, DELETE, INDEX, INSERT, SELECT, UPDATE ON HR.EMP BY ACCESS WHENEVER SUCCESSFUL;
在此AUDIT設置中,HR用戶的分段訪問操作將在AUDIT軌跡表中以PARTITION_NAME列形式記錄下來。
最后,為了防止AUDIT軌跡表變得太大,可以將其移動到分離的表空間中。要做到這一點,需要先使用以下命令生成一個與原始AUDIT軌跡表相同的目標空間:
CREATE TABLESPACE AUDIT_TS DATAFILE '/path/to/audit/file.dbf' SIZE 200M AUTOEXTEND ON NEXT 50M;
然后,移動已有的AUDIT軌跡表到新的表空間中:
ALTER TABLE DBA_AUDIT_TRAIL MOVE TABLESPACE AUDIT_TS;
以上這些就是AUDIT查詢的基礎。需要注意的是,在查詢大量的審計日志時,性能問題也需要被關注。此外,在收集大量的審計信息時,最好優先選擇以事件為單位的審計跟蹤方法,因為這樣可以減少存儲開銷和查詢成本。