Oracle 12c SYSAUX 表空間增長過快,主要是熱表,統計信息,優化器


 
1. 通過SQL語句查看 SYSAUX 占用情況,和表空間里對象占用情況
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                     5901376
SM/OPTSTAT                     574080
​
 
SQL> COL SEGMENT_NAME FORMAT A30
SQL> COL OWNER FORMAT A10
SQL> COL TABLESPACE_NAME FORMAT A10
SQL> COL SEGMENT_TYPE FORMAT A15
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      3600       TABLE
WRI$_ADV_OBJECTS_IDX_01        SYS        SYSAUX      1400       INDEX
HEAT_MAP                       SYS        SYSAUX       600       TABLE
 

 

A.哪果是表空間里是 heat_map占用比較大 ,可以查看HEAT_MAP 是否開啟

   這個段為12c新特性提供的新功能:它存儲在行和段級別系統生成的數據使用統計信息——這些信息可以用來自動化壓縮和移動數據,以降低存儲成本、提高性能和優化Oracle數據庫存儲,並且默認是啟用的狀態,但如果數據庫host objects過多將會導致該段占用大量SYSAUX表空間,通過MOS搜索得到該問題的解決方案:
      ALTER SYSTEM SET "_drop_stat_segment" =1;    數據庫不用重啟
      通過調整數據庫的隱藏參數來進行段的清除( 文檔 ID 2024036.1
 

B. SM/OPTSTAT  占用空間排名 參考:文檔 ID )  

    這個是由於,存放的歷史統計信息太多, 更統計信息頻率,和數據量變更,以及保存時間都有關系。
    1. 自動清理策略默認31天
          select dbms_stats.get_stats_history_availability from dual;
    2. 修改保留策略
           exec dbms_stats.alter_stats_history_retention(1);
    3. 手動清理一次
           exec dbms_stats.purge_stats(sysdate-10);
    4.  如果表還是比較大,可以考慮在線移動
 
a. 重創建表
CREATE TABLE WRI$_OPTSTAT_HISTGRM_HISTORY_B AS SELECT * FROM WRI$_OPTSTAT_HISTGRM_HISTORY ;
 TRUNCATE TABLE  WRI$_OPTSTAT_HISTGRM_HISTORY ;
 INSERT INTO WRI$_OPTSTAT_HISTGRM_HISTORY  SELECT * FROM  WRI$_OPTSTAT_HISTGRM_HISTORY_B;
 COMMIT;
 drop table WRI$_OPTSTAT_HISTGRM_HISTORY_B purge;

 

        b.通過表移動的方式
alter table WRI$_OPTSTAT_HISTHEAD_HISTORY move;  文檔ID 454678.1

 

    5. 手動重創建索引  
alter index  xxx  rebuild online ; 

 

 

C. SM/ADVISOR 占用空間排名 參考:文檔 ID 2440139.1)  

      查詢視圖 V$SYSAUX_OCCUPANTS 顯示 SM/ADVISOR 占用空間排名靠前.
      這個是由於12.2版本的一個新特性,即優化器統計信息顧問每天在維護窗口期間自動運行,因而引發了該問題。

      AUTO_STATS_ADVISOR_TASK 任務運行了很多次導致SYSAUX表空間增長迅速。

   

例如:

 
SQL> COL TASK_NAME FORMAT A35
SQL> SELECT TASK_NAME, COUNT(*) CNT FROM DBA_ADVISOR_OBJECTS GROUP BY TASK_NAME ORDER BY CNT DESC;
​
TASK_NAME                           CNT
----------------------------------- ----------
AUTO_STATS_ADVISOR_TASK             27082431
SYS_AUTO_SPM_EVOLVE_TASK            19
SYS_AUTO_SQL_TUNING_TASK            39

 

 
 

解決辦法:

 

1. 這個自動運行的任務(AUTO_STATS_ADVISOR_TASK) 可以被刪除進而釋放它占用的大量空間。

DECLARE
v_tname VARCHAR2(32767);
BEGIN
v_tname := 'AUTO_STATS_ADVISOR_TASK';
DBMS_STATS.DROP_ADVISOR_TASK(v_tname);
END;
/

 

一旦任務被刪除,所有依賴Auto Stats Advisor Task的相關歷史輸出信息將從WRI$_ADV_OBJECTS表中一並刪除。

刪除任務AUTO_STATS_ADVISOR_TASK可能引發如下報錯:

ORA-20001: Statistics Advisor: Invalid Task Name For the current user

如果上述報錯出現,可以用下面的方法重建AUTO_STATS_ADVISOR_TASK來解決:

SQL> connect / as sysdba
SQL> EXEC DBMS_STATS.INIT_PACKAGE();

 

 
刪除任務之后,重組表和所有索引:

SQL> ALTER TABLE WRI$_ADV_OBJECTS MOVE;
SQL> ALTER INDEX WRI$_ADV_OBJECTS_IDX_01 REBUILD;
SQL> ALTER INDEX WRI$_ADV_OBJECTS_PK REBUILD;

 
2.如果表WRI$_ADV_OBJECTS中有太多和Auto Stats Advisor Task相關的記錄,刪除任務時可能會需要大量undo空間.

一旦發生此狀況,如下方法可以用來直接清理數據而避免產生大量redo 和undo信息。

### 檢查表 WRI$_ADV_OBJECTS和 Auto 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> TRUNCATE TABLE WRI$_ADV_OBJECTS;

 

### 把備份表中數據插回原表 ###

SQL> INSERT /*+ APPEND */ INTO WRI$_ADV_OBJECTS SELECT * FROM WRI$_ADV_OBJECTS_NEW;

 

### 重建索引 ###

SQL> ALTER INDEX WRI$_ADV_OBJECTS_IDX_01 REBUILD;
SQL> ALTER INDEX WRI$_ADV_OBJECTS_PK REBUILD;

 



P.S: 表 WRI$_ADV_OBJECTS_NEW在上述命令都成功執行后可刪除。

從數據字典刪除統計信息任務,避免再次造成問題。

DECLARE
v_tname VARCHAR2(32767);
BEGIN
v_tname := 'AUTO_STATS_ADVISOR_TASK';
DBMS_STATS.DROP_ADVISOR_TASK(v_tname);
END;
/

 

DBA可以在任何時間重建統計信息顧問任務 (AUTO_STATS_ADVISOR_TASK),具體參考如下辦法:

SQL> EXEC DBMS_STATS.INIT_PACKAGE();

 

統計信息顧問任務 (AUTO_STATS_ADVISOR_TASK)也可以被直接禁用:
DECLARE
filter1 CLOB;
BEGIN
filter1 := DBMS_STATS.CONFIGURE_ADVISOR_RULE_FILTER('AUTO_STATS_ADVISOR_TASK','EXECUTE',NULL,'DISABLE');
END;
/

 

 新的增強補丁已經被申請,將會提供更方便的方法來禁用這個任務。
Unpublished Bug 26749785 NEED TO HAVE MORE CONTROL IN DICTIONARY FOR AUTO_STATS_ADVISOR_TASK

 

 


免責聲明!

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



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