查询job有关的几个视图,以及手工计算采样率

今天检查alert日志发现几个错误,一个是关于job的,一个是关于ora-04030的.最终发现都和job有关,这儿小小总结一下.

1.job报的错:1ORA-12012: error on auto execute of job XXXX

数据库版本10.2.0.5(10g之后原来的job被SCHEDULER替换升级了) 根据XXXX的号可以查询相关视图来查询到是什么job

select * from sys.scheduler$_job where obj#=&xxxx;

然后再根据job以及alert中的其他提示来诊断问题出在哪儿.我在这个地方,alert中还提示了是调用了个存储过程,出的错,初步判断是存储过程中的某一行,没有进行异常的捕获,所以造成了job的抛出错误

2.另外,查询job执行情况的一个视图

SELECT LOG_DATE, RUN_DURATION, JOB_NAME, STATUS, ERROR#  FROM DBA_SCHEDULER_JOB_RUN_DETAILS
 WHERE STATUS != 'SUCCEEDED';

根据这个视图可以查询失败了的job是哪些,有多少job是失败了的,然后再根据这个线头去找问题. 在ERROR#列可以看到在失败的时候oracle抛出的异常号.在这儿,对于AUTO_SPACE_ADVISOR_JOB抛出的就是ORA-04030.(因为这个对应的系统比较大,大概有5-6个T,里面有些大表有好几百G的)

3.最后,对于oracle自动收集统计信息的job:GATHER_STATS_JOB,对于数据量巨大的系统,很难在时间窗口内完成,建议disable掉,改用手工的

查看GATHER_STATS_JOB执行的情况:

SELECT log_id,
       job_name,
       status,
       TO_CHAR(ACTUAL_START_DATE, 'DD-MON-YYYY HH24:MI') start_date,       
       TO_CHAR(log_date, 'DD-MON-YYYY HH24:MI') log_date
  FROM dba_scheduler_job_run_details
 WHERE job_name = 'AUTO_SPACE_ADVISOR_JOB'
 order by 4 ;

4.查询统计信息为空或者统计信息过期的表,并根据表的大小来设定取样率的sql:

SELECT OWNER,
       SEGMENT_NAME,
       CASE
         WHEN SIZE_GB < 0.5 THEN
          30
         WHEN SIZE_GB >= 0.5 AND SIZE_GB < 1 THEN
          20
         WHEN SIZE_GB >= 1 AND SIZE_GB < 5 THEN
          10
         WHEN SIZE_GB >= 5 AND SIZE_GB < 10 THEN
          5
         WHEN SIZE_GB >= 10 THEN
          1
       END AS PERCENT,
       8 AS DEGREE
  FROM (SELECT OWNER, SEGMENT_NAME, SUM(BYTES / 1024 / 1024 / 1024) SIZE_GB
          FROM DBA_SEGMENTS
         WHERE OWNER = 'PMIS'
           AND SEGMENT_NAME IN
               (SELECT /*+ UNNEST */
                DISTINCT TABLE_NAME
                  FROM DBA_TAB_STATISTICS
                 WHERE (LAST_ANALYZED IS NULL OR STALE_STATS = 'YES')
                   AND OWNER = 'PMIS')
         GROUP BY OWNER, SEGMENT_NAME)

根据这个算出来的采样率之后,再通过GATHER_TABLE_STATS去手工收集,而不采用自动收集.

原文地址:https://www.cnblogs.com/nazeebodan/p/2845703.html