We are running the Oracle delivered automatic optimizer stats job on some of our 11.2 Oracle databases and the job is not completing for some of our tables. But, the list of these tables is buried in a trace file on the database server on some random RAC node. I built a script to figure out which node and file the trace was in and edit the output down to a list of tables that stats didn’t finish on. Output is like this:
Job log start time: 2013-07-17 09:00:07 MYOWNER1.MYTABLE1 MYOWNER2.MYTABLE2 ...
The outer script calls a SQL script that builds a list of Unix commands to search through the logs for the table names.
statlogs.sh
rm statlogstmp.sh sqlplus -s /nolog < statlogs.sql > statlogstmp.sh chmod 744 statlogstmp.sh ./statlogstmp.sh
statlogs.sql
connect YOURUSERNAME/YOURPASSWORD
set linesize 32000
set pagesize 1000
set echo off
set termout off
set trimspool on
set serveroutput on size 1000000
set feedback off
set heading off
-- This script builds unix commands to find tables
-- whose stats did not complete during the automatic stats job runs
-- over the past 7 days.
DECLARE
CURSOR JRD_CURSOR IS
select
INSTANCE_ID,
SLAVE_PID,
cast(ACTUAL_START_DATE as date) start_date_time,
cast(ACTUAL_START_DATE+RUN_DURATION as date) end_date_time
from
DBA_SCHEDULER_JOB_RUN_DETAILS
where
JOB_NAME like 'ORA$AT_OS_OPT_SY%' and
log_date > sysdate - 7
order by LOG_DATE;
JRD_REC JRD_CURSOR%ROWTYPE;
AT_LEAST_ONE_JOB_RAN boolean;
TRACE_DIR varchar2(2000);
log_inst_name varchar2(2000);
log_host_name varchar2(2000);
log_INSTANCE_ID number;
job_slave_pid number;
job_start_date_time date;
job_end_date_time date;
BEGIN
AT_LEAST_ONE_JOB_RAN := FALSE;
OPEN JRD_CURSOR;
LOOP
FETCH JRD_CURSOR INTO JRD_REC;
EXIT WHEN JRD_CURSOR%NOTFOUND;
AT_LEAST_ONE_JOB_RAN := TRUE;
log_INSTANCE_ID := JRD_REC.INSTANCE_ID;
job_slave_pid :=JRD_REC.SLAVE_PID;
job_start_date_time := JRD_REC.start_date_time;
job_end_date_time := JRD_REC.end_date_time;
-- Output echo command to display date and time that the current stats job log was opened
DBMS_OUTPUT.PUT_LINE('echo "Job log start time: '||
to_char(job_start_date_time,'YYYY-MM-DD HH24:MI:SS') || '"');
-- Trace directory for the stats job log
select VALUE into TRACE_DIR from gv$parameter where name='background_dump_dest'
and INST_ID=log_INSTANCE_ID;
-- Details needed for name of stats job log
select INSTANCE_NAME,HOST_NAME into log_inst_name,log_host_name
from gv$instance
where INSTANCE_NUMBER=log_INSTANCE_ID;
-- Output ssh command to find names of tables whose stats did not complete
DBMS_OUTPUT.PUT_LINE('ssh '||log_host_name||' "grep TABLE: '||TRACE_DIR||'/'||log_inst_name||'_j0*_'||
job_slave_pid||'.trc" | awk ''{ print $3 }'' | sed ''s/"//'' | sed ''s/"."/./'' | sed ''s/"\.".*//'' | sort -u');
END LOOP;
CLOSE JRD_CURSOR;
IF (AT_LEAST_ONE_JOB_RAN = FALSE) THEN
DBMS_OUTPUT.PUT_LINE('No stats jobs have run in the past 7 days.');
END IF;
END;
/
Put your username and password at the top of the sql script.
Here is a link to a zip of these two files.
– Bobby

Nice informative information blog is this……
Thanks and Regards :
Qadir Shaikh.
Visit at http://www.oratc.com