数据库无法自动收集统计信息问题

2018-01-30 19:18:54来源:cnblogs.com作者:初入DBA的小白人点击

分享
之前发了一个提问贴,可能大家都没有遇到过。最近正好解决了所以给大家分享一下。http://www.cndba.cn/549974293/problem/48select client_name,task_name,operation_name,status from dba_autotask_task;    -- 查询这个视图根本没有结果返回。no rows selectedselect 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                   SUCCEEDEDORA$AT_OS_OPT_SY_2586                              25-SEP-12 10.00.07.829792 PM PRC                   SUCCEEDEDORA$AT_OS_OPT_SY_2566                              24-SEP-12 10.00.07.154019 PM PRC                   SUCCEEDEDselect 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 ENABLEDWEDNESDAY_WINDOW               31-JAN-18 10.00.00.000000 PM PRC                                            FALSE ENABLEDTHURSDAY_WINDOW                01-FEB-18 10.00.00.000000 PM PRC                                            FALSE ENABLEDFRIDAY_WINDOW                  02-FEB-18 10.00.00.000000 PM PRC                                            FALSE ENABLEDSATURDAY_WINDOW                03-FEB-18 06.00.00.000000 AM PRC                                            FALSE ENABLEDSUNDAY_WINDOW                  04-FEB-18 06.00.00.000000 AM PRC                                            FALSE ENABLEDMONDAY_WINDOW                  05-FEB-18 03.00.00.000000 PM PRC                                            FALSE ENABLEDSQL> select client_name,status from dba_autotask_client;     --奇怪的是查询这个视图,确实是自动打开收集统计信息的设置。CLIENT_NAME                                                      STATUS---------------------------------------------------------------- --------auto optimizer stats collection                                  ENABLEDauto space advisor                                               ENABLEDsql tuning advisor                                               ENABLEDselect window_name,autotask_status from DBA_AUTOTASK_WINDOW_CLIENTS;--自动调用窗口也是正常的。WINDOW_NAME                    AUTOTASK------------------------------ --------MONDAY_WINDOW                  ENABLEDTUESDAY_WINDOW                 ENABLEDWEDNESDAY_WINDOW               ENABLEDTHURSDAY_WINDOW                ENABLEDFRIDAY_WINDOW                  ENABLEDSATURDAY_WINDOW                ENABLEDSUNDAY_WINDOW                  ENABLED至此,问题较为清晰。11g中我的自动收集统计信息的相关设置都正常,但为什么不会自动收集统计信息了呢。--各位不妨先自己思考思考------最后,通过各方求助终于解决了问题。原因如下:SQL> select window_name,active from DBA_SCHEDULER_WINDOWS;WINDOW_NAME                    ACTIV------------------------------ -----MONDAY_WINDOW                  FALSETUESDAY_WINDOW                 FALSEWEDNESDAY_WINDOW               FALSETHURSDAY_WINDOW                TRUEFRIDAY_WINDOW                  FALSESATURDAY_WINDOW                FALSESUNDAY_WINDOW                  FALSEWEEKNIGHT_WINDOW               FALSEWEEKEND_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                   SUCCEEDEDORA$AT_OS_OPT_SY_2586                              25-SEP-12 10.00.07.829792 PM PRC                   SUCCEEDEDORA$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                  FALSETUESDAY_WINDOW                 FALSEWEDNESDAY_WINDOW               FALSETHURSDAY_WINDOW                FALSEFRIDAY_WINDOW                  FALSESATURDAY_WINDOW                FALSESUNDAY_WINDOW                  FALSEWEEKNIGHT_WINDOW               FALSEWEEKEND_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 ENABLEDTUESDAY_WINDOW                 30-JAN-18 10.00.00.000000 PM PRC                                            FALSE ENABLEDWEDNESDAY_WINDOW               31-JAN-18 10.00.00.000000 PM PRC                                            FALSE ENABLEDTHURSDAY_WINDOW                01-FEB-18 10.00.00.000000 PM PRC                                            FALSE ENABLEDFRIDAY_WINDOW                  02-FEB-18 10.00.00.000000 PM PRC                                            FALSE ENABLEDSATURDAY_WINDOW                03-FEB-18 06.00.00.000000 AM PRC                                            FALSE ENABLEDSUNDAY_WINDOW                  04-FEB-18 06.00.00.000000 AM PRC                                            FALSE ENABLED7 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 ENABLEDTUESDAY_WINDOW                 30-JAN-18 10.00.00.000000 PM PRC                                            FALSE ENABLEDWEDNESDAY_WINDOW               31-JAN-18 10.00.00.000000 PM PRC                                            FALSE ENABLEDTHURSDAY_WINDOW                01-FEB-18 10.00.00.000000 PM PRC                                            FALSE ENABLEDFRIDAY_WINDOW                  02-FEB-18 10.00.00.000000 PM PRC                                            FALSE ENABLEDSATURDAY_WINDOW                03-FEB-18 06.00.00.000000 AM PRC                                            FALSE ENABLEDSUNDAY_WINDOW                  04-FEB-18 06.00.00.000000 AM PRC                                            FALSE ENABLED7 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                   STOPPEDORA$AT_OS_OPT_SY_2606                              26-SEP-12 10.00.07.902100 PM PRC                   SUCCEEDEDORA$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                                        ENABLEDauto space advisor                                 auto_space_advisor_prog                                          auto space advisor job                                           ENABLEDauto 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_jobsdba_autotask_client-->dba_scheduler_job_classes http://blog.itpub.net/235507/viewspace-1137629/总结:其实在网上,已经写出了如何调用的。只不过一开始我自己没有注意到,作为一个dba来说还是差的很远呢。以后继续努力吧。

  

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台