昨天同事說有個測試庫無法登錄了,用PLSQL Developer登陸后提示: ERROR:ORA-00604: error occurred at recursive SQL level 1OR
昨天同事說有個測試庫無法登錄了,用PLSQL Developer登陸后提示:
ERROR: ORA-00604: error occurred at recursive SQL level 1 ORA-01653: unable to extend table SYS.AUD$ by 8192 in tablespace SYSTEM ORA-02002: error while writing to audit trail ORA-00604: error occurred at recursive SQL level 1 ORA-01653: unable to extend table SYS.AUD$ by 8192 in tablespace SYSTEM
貌似以前聽@dbsnake說過這問題。
首先SYS.AUD$是數據字典表,存儲于SYSTEM表空間,存儲的是審計信息,,11g默認是開啟審計
SQL> show parameter audit_trail NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ audit_trail string DB
上面的提示明顯是指SYSTEM表空間的SYS.AUD$表無法繼續擴容了,可能是磁盤空間不足,或SYSTEM表空間分配的數據文件空間不足。針對上面這個問題,有兩種方法:
1、擴容SYSTEM表空間。
2、降低SYS.AUD$的容量。
之所以有第二種方法,從MOS:73408.1這篇文章可以得到結論:
SYS.AUD$ is the only SYS object that should ever be directly modified
SYS.AUD$是唯一一個可以直接修改的SYS對象。
那如何降低SYS.AUD$的容量呢?
1、最簡單的方法就是truncate table SYS.AUD$,最直接,前提是不需要保留審計信息。
2、MOS中也介紹一種方法:DELETE FROM sys.aud$ WHERE obj$name='
3、也可以備份審計表,然后再降低容量。
CREATE TABLE backup_aud$ AS SELECT * from sys.aud$; truncate table aud$; exp file=aud_backup.dmp tables=backup_aud$ drop table backup_aud$;
如果僅需要降低SYS.AUD$占用的空間,此時可以再次執行insert into aud$ select * from backup_aud$;將數據導入進來。
4、要刪除SYS.AUD$表需要相應的權限:要么是SYS用戶,要么具有DELETE ANY TABLE系統權限,或者SYS用戶將SYS.AUD$表的DELETE權限賦予這個用戶。具有delete_catalog_role角色亦可以,但11.2.0.2之前的版本可能有bug導致這個角色沒有SYS.AUD$的刪除權限,需要人工添加,具體也可參見9697811這個bug描述。
5、MOS有介紹:The DELETE ANY TABLE privilege only applies to SYS objects if O7_DICTIONARY_ACCESSIBILITY=TRUE,表示如果O7_DICTIONARY_ACCESSIBILITY參數是TRUE,則只有SYS用戶可以具有DELETE ANY TABLE權限。查了一些資料,也說O7_DICTIONARY_ACCESSIBILITY這個參數的作用就是保護數據字典基表,FALSE要求SYS不能以普通用戶角色登錄,必須用sysdba角色登錄,如果TRUE則普通用戶也可以訪問數據字典基表,就會引起安全問題了。
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com