今天检查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去手工收集,而不采用自动收集.