12C SYSAUX表空間使用率高的處理


上周發現一個生產庫的SYSAUX空間使用率達到了95%,24326 MB,開啟了自動擴展,數據庫版本12.2.0.1。

MOS上有文檔詳細介紹了這個問題,這種情況存在於Oracle數據庫版本12.2.0.1到18.3.0.0.0,由於Optimizer Statistics Advisor新特性的引入,AUTO_STATS_ADVISOR_TASK自動任務的執行,導致SYSAUX表空間使用逐漸增長,主要表象為:

1)查看v$sysaux_occupants,SM/ADVISOR的空間使用排在第一位。
2)查看dba_segments,發現SYSAUX表空間中WRI$_ADV_OBJECTS占用最大。

此問題在21C中進行了修復。

查詢視圖 V$SYSAUX_OCCUPANTS 顯示 SM/ADVISOR 占用空間排名靠前.
SQL> SET LINES 120
SQL> COL OCCUPANT_NAME FORMAT A30
SQL> SELECT OCCUPANT_NAME,SPACE_USAGE_KBYTES FROM V$SYSAUX_OCCUPANTS ORDER BY SPACE_USAGE_KBYTES DESC;
OCCUPANT_NAME SPACE_USAGE_KBYTES
------------------------------ ------------------
SM/ADVISOR 21390272
SM/OPTSTAT 1622208
SM/AWR 407616
XDB 63872
SM/OTHER 59200
JOB_SCHEDULER 39488
LOGMNR 14976
WM 6656
SMON_SCN_TIME 3328
SQL_MANAGEMENT_BASE 2496
PL/SCOPE 1984

SQL> SELECT * FROM (SELECT SEGMENT_NAME,OWNER,TABLESPACE_NAME,BYTES/1024/1024 "SIZE(MB)",SEGMENT_TYPE FROM DBA_SEGMENTS WHERE TABLESPACE_NAME='SYSAUX' ORDER BY BYTES DESC) WHERE ROWNUM<=10;
SEGMENT_NAME OWNER TABLESPACE SIZE(MB) SEGMENT_TYPE
------------------------------ ---------- ---------- ---------- ---------------
WRI$_ADV_OBJECTS SYS SYSAUX 11243 TABLE
WRI$_ADV_OBJECTS_IDX_01 SYS SYSAUX 5689 INDEX
WRI$_ADV_OBJECTS_PK SYS SYSAUX 3792 INDEX
I_WRI$_OPTSTAT_H_OBJ#_ICOL#_ST SYS SYSAUX 576 INDEX
I_WRI$_OPTSTAT_H_ST SYS SYSAUX 293 INDEX
I_WRI$_OPTSTAT_HH_OBJ_ICOL_ST SYS SYSAUX 72 INDEX
SYS_LOB0000007349C00005$$ SYS SYSAUX 44.1875 LOBSEGMENT
WRI$_ADV_SQLT_PLANS SYS SYSAUX 42 TABLE
SYS_LOB0000008846C00040$$ SYS SYSAUX 38.1875 LOBSEGMENT
SCHEDULER$_EVENT_LOG SYS SYSAUX 34 TABLE

在12.2.0.1中,EXECUTION_DAYS_TO_EXPIRE參數被設置為UNLIMITED,這意味着舊記錄永遠不會被清除。

SQL> col TASK_NAME format a25
SQL> col parameter_name format a35
SQL> col parameter_value format a20
SQL> set lines 120
SQL> select TASK_NAME,parameter_name, parameter_value FROM DBA_ADVISOR_PARAMETERS WHERE task_name='AUTO_STATS_ADVISOR_TASK' and PARAMETER_NAME='EXECUTION_DAYS_TO_EXPIRE';

TASK_NAME                 PARAMETER_NAME                      PARAMETER_VALUE
------------------------- ----------------------------------- --------------------
AUTO_STATS_ADVISOR_TASK   EXECUTION_DAYS_TO_EXPIRE            UNLIMITED

由於沒有從WRI$_ADV_OBJECTS中清除AUTO_STATS_ADVISOR_TASK記錄,SYSAUX空間使用正在迅速增長。

處理過程:

 

1、首先通過以下命令修改保留時間,設置保留時間為 30天:
EXEC DBMS_ADVISOR.SET_TASK_PARAMETER(task_name=> 'AUTO_STATS_ADVISOR_TASK', parameter=> 'EXECUTION_DAYS_TO_EXPIRE', value => 30);
or

EXEC  DBMS_SQLTUNE.SET_TUNING_TASK_PARAMETER (task_name=> 'AUTO_STATS_ADVISOR_TASK', parameter=> 'EXECUTION_DAYS_TO_EXPIRE', value => 30);

數天后查看WRI$_ADV_OBJECTS表數據還是在增長,並沒有自動清除。

2、過期的統計信息顧問記錄可以使用下面的命令手動清除,而不是依賴Auto-Purge窗口。這將清除超過30天保留期的舊統計顧問記錄。

SQL> conn / as sysdba
SQL> exec prvt_advisor.delete_expired_tasks;

但是這個存儲過程實際上用delete的方式進行的,如果表WRI$_ADV_OBJECTS中有太多和Auto Stats Advisor Task相關的記錄,刪除任務時可能會需要大量undo空間.
一旦發生此狀況,如下方法可以用來直接清理數據而避免產生大量redo 和undo信息 。
3、truncate WRI$_ADV_OBJECTS

### 檢查表 WRI$_ADV_OBJECTSAuto Stats Advisor Task相關的有效條數 ###
SQL> SELECT COUNT(*) FROM WRI$_ADV_OBJECTS WHERE TASK_ID=(SELECT DISTINCT ID FROM
WRI$_ADV_TASKS WHERE NAME='AUTO_STATS_ADVISOR_TASK');
### 創建新表並保留非 AUTO_STATS_ADVISOR_TASK數據 ###
SQL> CREATE TABLE WRI$_ADV_OBJECTS_NEW AS SELECT * FROM WRI$_ADV_OBJECTS WHERE TASK_ID !=
(SELECT DISTINCT ID FROM WRI$_ADV_TASKS WHERE NAME='AUTO_STATS_ADVISOR_TASK');
SQL> SELECT COUNT(*) FROM WRI$_ADV_OBJECTS_NEW;
### 截斷原表 ###
SQL> TRUNCATE TABLE WRI$_ADV_OBJECTS;
### 把備份表中數據插回原表 ###
SQL> INSERT /*+ APPEND */ INTO WRI$_ADV_OBJECTS SELECT * FROM WRI$_ADV_OBJECTS_NEW;
For 19c & above, use the below insert statement to avoid ORA-54013 error as there is a new
column SQL_ID_VC added to WRI$_ADV_OBJECTS.
SQL> INSERT INTO WRI$_ADV_OBJECTS("ID" ,"TYPE" ,"TASK_ID" ,"EXEC_NAME" ,"ATTR1" ,"ATTR2"
,"ATTR3" ,"ATTR4" ,"ATTR5" ,"ATTR6" ,"ATTR7" ,"ATTR8" ,"ATTR9"
,"ATTR10","ATTR11","ATTR12","ATTR13","ATTR14","ATTR15","ATTR16","ATTR17","ATTR18","ATTR19","A
,"SPARE_N1" ,"SPARE_N2" ,"SPARE_N3" ,"SPARE_N4" ,"SPARE_C1" ,"SPARE_C2" ,"SPARE_C3"
,"SPARE_C4" ) SELECT "ID" ,"TYPE" ,"TASK_ID" ,"EXEC_NAME" ,"ATTR1" ,"ATTR2" ,"ATTR3"
,"ATTR4" ,"ATTR5" ,"ATTR6" ,"ATTR7" ,"ATTR8" ,"ATTR9" ,"ATTR10","ATTR11","ATTR12","ATTR13","ATTR14","ATTR15","ATTR16","ATTR17","ATTR18","ATTR19","AT
,"SPARE_N1" , "SPARE_N2" ,"SPARE_N3" ,"SPARE_N4" ,"SPARE_C1" ,"SPARE_C2" ,"SPARE_C3"
,"SPARE_C4" FROM WRI$_ADV_OBJECTS_NEW;

SQL> COMMIT;
### 重建索引 ###
SQL> ALTER INDEX WRI$_ADV_OBJECTS_IDX_01 REBUILD;
SQL> ALTER INDEX WRI$_ADV_OBJECTS_PK REBUILD;
最終使用第3種方式進行了處理。

最后,可以考慮從數據字典刪除統計信息任務,避免再次造成問題。
DECLARE
v_tname VARCHAR2(32767);
BEGIN
v_tname := 'AUTO_STATS_ADVISOR_TASK';
DBMS_STATS.DROP_ADVISOR_TASK(v_tname);
END;
/

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM