Oracle 11g無法自動收集統計資訊

迷倪小魏發表於2018-01-31

 

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

發現是12926號。查詢了一下萬年曆。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了。

 

今天是週一。現在將週一的收集統計資訊的時間變更一下。

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

 

 

相關的檢視:
dba_autotask_task
dba_autotask_client
dba_autotask_client_job
dba_autotask_window_clients
dba_autotask_client_history
dba_scheduler_jobs
dba_scheduler_job_classes
dba_scheduler_window_groups
dba_scheduler_windows
dba_scheduler_wingroup_members

 

關於詳細的Oracle 11g統計資訊的收集與調整請參看博文:Oracle 11G統計資訊自動收集及調整http://blog.csdn.net/leshami/article/details/65935325



作者:SEian.G(苦練七十二變,笑對八十一難)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31015730/viewspace-2150708/,如需轉載,請註明出處,否則將追究法律責任。

相關文章