之前发了一个提问贴,可能大家都没有遇到过。最近正好解决了所以给大家分享一下。 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来说还是差的很远呢。以后继续努力吧。