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
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; //開啟資料庫