oracle 異常雜症 之 SYSTEM表空間不足問題 (二)

雜症二、SYSTEM表空間不足報錯


一、雜症:

PLSQL登錄,報錯:

ORA-00604: 遞歸 SQL 層  出現錯誤

ORA-01653: 表.無法通過(在表空間中)擴展

ORA-02002: 寫入審記線索時出錯


二、病理:

1、表空間不足

2、數據庫的審計功能已經開啓引起(SYS.AUD$表)


三、病因定位:

先連接上數據庫:

# su oracle

# sqlplus /nolog

SQL> conn /as sysdba          //重新連接

SQL> startup mount;             //掛起

SQL> alter database open;   //打開數據庫


執行下面SQL,查看錶空間使用情況

SELECT

UPPER(F.TABLESPACE_NAME) "TABLESPACE_NAME",

D.TOT_GROOTTE_MB "TABLESPACE_SIZE(M)",

D.TOT_GROOTTE_MB - F.TOTAL_BYTES "TABLESPACE_USED(M)",

TO_CHAR (ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,2),'990.99') "TABLESPACE_USED_BI",

F.TOTAL_BYTES "TABLESPACE_FREE(M)"

FROM

(SELECT TABLESPACE_NAME, ROUND(SUM(BYTES) /(1024 * 1024), 2) TOTAL_BYTES, ROUND(MAX(BYTES) /(1024 * 1024), 2) MAX_BYTES FROM SYS.DBA_FREE_SPACE GROUP BY TABLESPACE_NAME) F,

(SELECT DD.TABLESPACE_NAME, ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB FROM SYS.DBA_DATA_FILES DD GROUP BY DD.TABLESPACE_NAME) D

WHERE

D.TABLESPACE_NAME = F.TABLESPACE_NAME

ORDER BY 4 DESC;


SYSTEM表空間使用比 已經達到 99.81。


四、治療:

表空間不足治療:

方案一:若表空間不是自增,則修改爲自增模式。(不適合此次原因)

先查看錶空間是否自增

SQL > select FILE_NAME,TABLESPACE_NAME,AUTOEXTENSIBLE from dba_data_files;

YES 說明是自增的

如果是NO則執行下面 SQL,修改模式:

SQL > alter database datafile '/home/app/XXX/oradata/XXX/system01.dbf' AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED;

注:根據自己SYSTEM對應的的數據文件路徑填寫,50M爲每次自增的大小。


方案二:擴大表空間對應的數據文件大小 (不適合此次原因)

可得 對應的表空間文件已經 32G了。

規定 表空間所對應的數據文件不能超過32G。

若沒有達到則可以通過 擴大表空間對應文件的大小,SQL爲:

SQL > alter database datafile '/home/app/XXX/oradata/XXX/system01.dbf' resize 32000M;


方案三:爲SYSTEM表空間增加一個數據文件SYSTEM02.DBF (不適合此次問題原因)

大小:500M ,  自增大小:50M

SQL> alter  tablespace "SYSTEM" add datafile '/home/app/XXX/oradata/XXX/system02.dbf' SIZE 500M AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED;

注:一個表空間能對應多個數據文件,但一個數據文件只能對應一個表空間


方案四:清空AUD$表數據並關閉審計功能根本原因,筆者使用了該方案)

1、查sys.aud$及其索引 佔用大小

SQL> SELECT t.owner, t.segment_name,SUM(bytes)/1024/1024/1024 as SIZE_G

FROM dba_segments t

WHERE t.tablespace_name = 'SYSTEM' and t.segment_name='AUD$'

GROUP BY t.owner,t.segment_name

ORDER BY SUM(bytes) desc;

可怕,就是這個審計表,達到了31個G了,問題就在此。


2、清空AUD$:

SQL> truncate table AUD$;


3、查看審計功能

SQL> show parameter audit


4、關閉審計功能:

SQL> alter system set audit_trail='none' scope=spfile;

如果只是清理 AUD$表,問題已經解決,但是時間久後,問題還是會復現,如果不需要審計數據可以關閉審計功能永久解決。


注:此上方案解決後,需要重啓

SQL> shutdown immediate;   //關閉

SQL> startup mount;             //掛起

SQL> alter database open;   //打開數據庫



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章