之前發了一個提問貼,可能大家都沒有遇到過。最近正好解決了所以給大家分享一下。 http://www.cndba.cn/549974293/problem/48 select client_name,task_name,operation_name,status from dba_autotask_t... ...
之前發了一個提問貼,可能大家都沒有遇到過。最近正好解決了所以給大家分享一下。 http://www.cndba.cn/549974293/problem/48 select client_name,task_name,operation_name,status from dba_autotask_task; -- 查詢這個視圖根本沒有結果返回。 no rows selected 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 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 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中我的自動收集統計信息的相關設置都正常,但為什麼不會自動收集統計信息了呢。 --各位不妨先自己思考思考------ 最後,通過各方求助終於解決了問題。原因如下: 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報告。不然很有可能影響生產。 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. 跑完之後再次查詢。 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的狀態,現在因為資料庫不正常關閉,導致了這個視窗並沒有改變過來。所以資料庫所有的收集作業都斷了。 再次查詢 : 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 看到網上有人寫到11g調用job的流程。 首先是dba_autotask_task-->dba_autotask_client建立自動執行任務 再根據時間視窗及資源組建立自動執行作業 dba_autotask_client-->dba_scheduler_window_groups-->dba_scheduler_windows-->dba_scheduler_jobs dba_autotask_client-->dba_scheduler_job_classes http://blog.itpub.net/235507/viewspace-1137629/ 總結:其實在網上,已經寫出瞭如何調用的。只不過一開始我自己沒有註意到,作為一個dba來說還是差的很遠呢。以後繼續努力吧。