這篇文章給大家分享的是有關Oracle 11g無法自動收集統計信息怎么辦的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
SQL> select client_name,task_name,operation_name,status from dba_autotask_task; -- 查詢dba_autotask_task視圖根本沒有結果返回。
no rows selected
SQL> select job_name,actual_start_date,status from (select * from dba_scheduler_job_run_details where job_name like 'ORA$AT_OS_OPT%' order by log_date desc ) where rownum <4; --最近一次執行成功的自動收集統計信息的時間如下
JOB_NAME ACTUAL_START_DATE STATUS
---------------------------- ---------------------------------------- -------------
ORA$AT_OS_OPT_SY_2606 26-SEP-12 10.00.07.902100 PM PRC SUCCEEDED
ORA$AT_OS_OPT_SY_2586 25-SEP-12 10.00.07.829792 PM PRC SUCCEEDED
ORA$AT_OS_OPT_SY_2566 24-SEP-12 10.00.07.154019 PM PRC SUCCEEDED
SQL> select WINDOW_NAME, WINDOW_NEXT_TIME , WINDOW_ACTIVE,OPTIMIZER_STATS from DBA_AUTOTASK_WINDOW_CLIENTS order by WINDOW_NEXT_TIME ; --各個窗口的狀態也都一切正常。
WINDOW_NAME WINDOW_NEXT_TIME WINDO OPTIMIZE
------------------------------ ------------------------------------- ----- --------
TUESDAY_WINDOW 30-JAN-18 10.00.00.000000 PM PRC FALSE ENABLED
WEDNESDAY_WINDOW 31-JAN-18 10.00.00.000000 PM PRC FALSE ENABLED
THURSDAY_WINDOW 01-FEB-18 10.00.00.000000 PM PRC FALSE ENABLED
FRIDAY_WINDOW 02-FEB-18 10.00.00.000000 PM PRC FALSE ENABLED
SATURDAY_WINDOW 03-FEB-18 06.00.00.000000 AM PRC FALSE ENABLED
SUNDAY_WINDOW 04-FEB-18 06.00.00.000000 AM PRC FALSE ENABLED
MONDAY_WINDOW 05-FEB-18 03.00.00.000000 PM PRC FALSE ENABLED
SQL> select client_name,status from dba_autotask_client; --奇怪的是查詢這個視圖,確實是自動打開收集統計信息的設置。
CLIENT_NAME STATUS
--------------------------------------- --------
auto optimizer stats collection ENABLED
auto space advisor ENABLED
sql tuning advisor ENABLED
SQL> select window_name,autotask_status from DBA_AUTOTASK_WINDOW_CLIENTS;--自動調用窗口也是正常的。
WINDOW_NAME AUTOTASK
------------------------------ --------
MONDAY_WINDOW ENABLED
TUESDAY_WINDOW ENABLED
WEDNESDAY_WINDOW ENABLED
THURSDAY_WINDOW ENABLED
FRIDAY_WINDOW ENABLED
SATURDAY_WINDOW ENABLED
SUNDAY_WINDOW ENABLED
至此,問題較為清晰。11g中我的自動收集統計信息的相關設置都正常,但為什么不會自動收集統計信息了呢?也就是說為什么查詢dba_autotask_task這個視圖沒有task在執行呢?
最后,通過各方求助終于解決了問題。原因如下:
SQL> select window_name,active from DBA_SCHEDULER_WINDOWS;
WINDOW_NAME ACTIV
------------------------------ -----
MONDAY_WINDOW FALSE
TUESDAY_WINDOW FALSE
WEDNESDAY_WINDOW FALSE
THURSDAY_WINDOW TRUE
FRIDAY_WINDOW FALSE
SATURDAY_WINDOW FALSE
SUNDAY_WINDOW FALSE
WEEKNIGHT_WINDOW FALSE
WEEKEND_WINDOW FALSE
正常來說所有的窗口都應該是 false的狀態。但是 我們現有有一個是true,或許有可能是因為這個原因。這個窗口是周四的窗口,然后找一下最近一次自動收集統計信息的時間。
SQL> select job_name,actual_start_date,status from (select * from dba_scheduler_job_run_details where job_name like 'ORA$AT_OS_OPT%' order by log_date desc ) where rownum <4;
JOB_NAME ACTUAL_START_DATE STATUS
---------------------------- ---------------------------------------- -------------
ORA$AT_OS_OPT_SY_2606 26-SEP-12 10.00.07.902100 PM PRC SUCCEEDED
ORA$AT_OS_OPT_SY_2586 25-SEP-12 10.00.07.829792 PM PRC SUCCEEDED
ORA$AT_OS_OPT_SY_2566 24-SEP-12 10.00.07.154019 PM PRC SUCCEEDED
發現是12年9月26號。查詢了一下萬年歷。26號正好是周三。而周四變成了true,可能是因為在收集統計信息的時候數據庫不正常關閉導致的吧!現在將這個true改變為false。
這里注意,如果你的生產環境很久很久沒有自動收集統計信息了的狀態下,請先在測試環境收集統計信息最好做個spa報告,不然很有可能影響生產。
SQL> EXECUTE DBMS_SCHEDULER.CLOSE_WINDOW ('THURSDAY_WINDOW');
再次查詢
SQL> select window_name,active from DBA_SCHEDULER_WINDOWS;
WINDOW_NAME ACTIV
------------------------------ -----
MONDAY_WINDOW FALSE
TUESDAY_WINDOW FALSE
WEDNESDAY_WINDOW FALSE
THURSDAY_WINDOW FALSE
FRIDAY_WINDOW FALSE
SATURDAY_WINDOW FALSE
SUNDAY_WINDOW FALSE
WEEKNIGHT_WINDOW FALSE
WEEKEND_WINDOW FALSE
都變為flase了。
今天是周一?,F在將周一的收集統計信息的時間變更一下。
SQL> select WINDOW_NAME, WINDOW_NEXT_TIME , WINDOW_ACTIVE,OPTIMIZER_STATS from DBA_AUTOTASK_WINDOW_CLIENTS order by WINDOW_NEXT_TIME ;
WINDOW_NAME WINDOW_NEXT_TIME WINDO OPTIMIZE
------------------------------ -------------------------------------- ----- --------
MONDAY_WINDOW 29-JAN-18 10.00.00.000000 PM PRC FALSE ENABLED
TUESDAY_WINDOW 30-JAN-18 10.00.00.000000 PM PRC FALSE ENABLED
WEDNESDAY_WINDOW 31-JAN-18 10.00.00.000000 PM PRC FALSE ENABLED
THURSDAY_WINDOW 01-FEB-18 10.00.00.000000 PM PRC FALSE ENABLED
FRIDAY_WINDOW 02-FEB-18 10.00.00.000000 PM PRC FALSE ENABLED
SATURDAY_WINDOW 03-FEB-18 06.00.00.000000 AM PRC FALSE ENABLED
SUNDAY_WINDOW 04-FEB-18 06.00.00.000000 AM PRC FALSE ENABLED
7 rows selected.
修改自動收集時間窗口。
SQL> begin
2 dbms_scheduler.disable( name => '"SYS"."MONDAY_WINDOW"', force => true);
3 end;
4 /
PL/SQL procedure successfully completed.
SQL> begin
2 dbms_scheduler.set_attribute( name=> '"SYS"."MONDAY_WINDOW"',attribute => 'repeat_interval',value=>'freq=daily;byday=mon;byhour=15;byminute=0;bysecond=0');
3 end;
4 /
PL/SQL procedure successfully completed.
SQL> begin
2 dbms_scheduler.enable( name => '"SYS"."MONDAY_WINDOW"');
3 end;
4 /
PL/SQL procedure successfully completed.
修改成功
SQL> select WINDOW_NAME, WINDOW_NEXT_TIME , WINDOW_ACTIVE,OPTIMIZER_STATS from DBA_AUTOTASK_WINDOW_CLIENTS order by WINDOW_NEXT_TIME ;
WINDOW_NAME WINDOW_NEXT_TIME WINDO OPTIMIZE
------------------------------ --------------------------------------- ----- --------
MONDAY_WINDOW 29-JAN-18 03.00.00.000000 PM PRC FALSE ENABLED
TUESDAY_WINDOW 30-JAN-18 10.00.00.000000 PM PRC FALSE ENABLED
WEDNESDAY_WINDOW 31-JAN-18 10.00.00.000000 PM PRC FALSE ENABLED
THURSDAY_WINDOW 01-FEB-18 10.00.00.000000 PM PRC FALSE ENABLED
FRIDAY_WINDOW 02-FEB-18 10.00.00.000000 PM PRC FALSE ENABLED
SATURDAY_WINDOW 03-FEB-18 06.00.00.000000 AM PRC FALSE ENABLED
SUNDAY_WINDOW 04-FEB-18 06.00.00.000000 AM PRC FALSE ENABLED
7 rows selected.
跑完之后再次查詢。
SQL> select job_name,actual_start_date,status from (select * from dba_scheduler_job_run_details where job_name like 'ORA$AT_OS_OPT%' order by log_date desc ) where rownum <4;
JOB_NAME ACTUAL_START_DATE STATUS
---------------------------- ------------------------------------------ --------------
ORA$AT_OS_OPT_SY_2626 29-JAN-18 03.00.00.732062 PM PRC STOPPED
ORA$AT_OS_OPT_SY_2606 26-SEP-12 10.00.07.902100 PM PRC SUCCEEDED
ORA$AT_OS_OPT_SY_2586 25-SEP-12 10.00.07.829792 PM PRC SUCCEEDED
果然,是因為這個窗口的問題。這個DBA_SCHEDULER_WINDOWS 正常的狀態應該是false的狀態,當系統調用時變為true的狀態,現在因為數據庫不正常關閉,導致了這個窗口并沒有改變過來。所以數據庫所有的收集作業都斷了。
再次查詢 :
SQL> select client_name,task_name,operation_name,status from dba_autotask_task;
CLIENT_NAME TASK_NAME OPERATION_NAME STATUS
--------------------------------- ------------------------------------------ ----------------------------------- --------
sql tuning advisor AUTO_SQL_TUNING_PROG automatic sql tuning task ENABLED
auto space advisor auto_space_advisor_prog auto space advisor job ENABLED
auto optimizer stats collection gather_stats_prog auto optimizer stats job ENABLED
通過在網上查詢相關資料【http://blog.itpub.net/235507/viewspace-1137629/】,寫到Oracle 11g統計信息自動收集任務運行任務調用的流程:
1、首先是dba_autotask_task-->dba_autotask_client建立自動執行任務
2、再根據時間窗口及資源組建立自動執行作業
dba_autotask_client-->dba_scheduler_window_groups-->dba_scheduler_windows-->dba_scheduler_jobs
dba_autotask_client-->dba_scheduler_job_classes
感謝各位的閱讀!關于“Oracle 11g無法自動收集統計信息怎么辦”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。