Saturday, November 26, 2022

#!/bin/bash # #################################################################################################################################### # DATABASE DAILY HEALTH CHECK MONITORING SCRIPT VER="[6.4]" # =================================================================================================== # CAUTION: THIS SCRIPT MAY CAUSE A SLIGHT OVEARHEAD, DO NOT RUN IT TOO FREQUENT, ONCE A DAY IS IDEAL. # =================================================================================================== # *********** # How To Use: # *********** # 1- Set your Email by modifying this parameter below: EMAIL="youremail@yourcompany.com" # 2- Check the THRESHOLDS section and make sure they meet your policy. # 3- You can DISABLE/ENABLE some section by altering the parameter that accept Y or N values # e.g. Disable Memory Check Section in the report: # Go to THRESHOLDS section and set: # CHECK_MEMORY=N # **************************************************************************************************** # FEATURES: # ******** # CHECKING CPU UTILIZATION. # CHECKING FILESYSTEM UTILIZATION. # CHECKING TABLESPACES UTILIZATION. # CHECKING FLASH RECOVERY AREA UTILIZATION. # CHECKING ASM DISKGROUPS UTILIZATION. # CHECKING BLOCKING SESSIONS ON THE DATABASE. # CHECKING UNUSABLE INDEXES ON THE DATABASE. # CHECKING INVALID OBJECTS ON THE DATABASE. # CHECKING CORRUPTED BLOCKS ON THE DATABASE. # CHECKING FAILED JOBS IN THE DATABASE. # CHECKING LONG RUNNING JOBS [For More than 1 Day]. # CHECKING ACTIVE INCIDENTS. # CHECKING OUTSTANDING ALERTS. # CHECKING DATABASE SIZE GROWTH. # CHECKING RMAN BACKUPs. # REPORT UNRECOVERABLE DB FILES. # CHECKING OS / HARDWARE STATISTICS. # CHECKING RESOURCE LIMITS. # CHECKING RECYCLEBIN. # CHECKING CURRENT RESTORE POINTS. # CHECKING HEALTH MONITOR CHECKS RECOMMENDATIONS THAT RUN BY DBMS_HM PACKAGE. # CHEKCING MONITORED INDEXES. # CHECKING REDOLOG SWITCHES. # CHECKING MODIFIED INTIALIZATION PARAMETERS SINCE THE LAST DB STARTUP. # CHECKING ADVISORS RECOMMENDATIONS: # - SQL TUNING ADVISOR # - SGA ADVISOR # - PGA ADVISOR # - BUFFER CACHE ADVISOR # - SHARED POOL ADVISOR # - SEGMENT ADVISOR # CHECKING NEW CREATED OBJECTS. # CHECKING AUDIT RECORDS. # CHECKING FAILED LOGIN ATTEMPTS. # # # # # # Author: Mahmmoud ADEL # # # # ### # # # # # # # # Created: 22-12-13 Based on dbalarm.sh script. # Modifications:18-05-14 Added Filsystem monitoring. # 19-05-14 Added CPU monitoring. # 09-12-14 Added Tablespaces monitoring # Added BLOCKING SESSIONS monitoring # Added UNUSABLE INDEXES monitoring # Added INVALID OBJECTS monitoring # Added FAILED LOGINS monitoring # Added AUDIT RECORDS monitoring # Added CORRUPTED BLOCKS monitoring # [It will NOT run a SCAN. It will look at V$DATABASE_BLOCK_CORRUPTION] # Added FAILED JOBS monitoring. # 06-10-15 Replaced mpstat with iostat for CPU Utilization Check # 02-11-15 Enhanced "FAILED JOBS monitoring" part. # 13-12-15 Added Advisors Recommendations to the report # 04-04-16 dba_tablespace_usage_metrics view will be used for 11g onwards versions # for checking tablespaces size, advised by: Satyajit Mohapatra # 10-04-16 Add Flash Recovery Area monitoring # 10-04-16 Add ASM Disk Groups monitoring # 15-07-16 Add ACTIVE INCIDENTS, RESOURCE LIMITS, RECYCLEBIN, RESTORE POINTS, # MONITORED INDEXES, REDOLOG SWITCHES, MODIFIED SPFILE PARAMETERS checks. # 02-01-17 Removed ALERTLOG check for DB & Listener + # Merged alerts with advisors. [Recommended by: ABD-ELGAWAD] # 03-01-17 Added checking RAC status feature. [Recommended by: Samer ALJazzar] # 09-01-17 Added RMAN BACKUP CHECK. # 04-05-17 Added Reporting of Newly Created Objects in the last 24Hours. # 12-06-17 Added Long Running Jobs Alert. # 20-07-17 Neutralize login.sql if found under Oracle user home directory due to bugs. # 10-10-17 Added reporting Long Running Queries to the report. # 09-01-18 Workaround for df command bug "`/root/.gvfs': Permission denied" # 16-05-18 Added SHOWSQLTUNINGADVISOR, SHOWMEMORYADVISORS, SHOWSEGMENTADVVISOR, SHOWJOBS # and SHOWHASHEDCRED parameters to allow the user to decide whether to show their # results in the report or not. # 21-06-18 Added MODOBJCONTTHRESHOLD to control the display of LAST MODIFIED OBJECTS in the report. # 15-08-18 Added REPORT UNRECOVERABLE DATABASE FILES that don't have a valid backup. # 10-02-19 Removed the failed jobs alerting from the script. # 19-02-19 Added HTML email format content. # 04-04-19 Added Reporting of Top Fragmented Tables. # 16-06-20 Excluding goldengate modules from Long Running Queries reporting. # 22-06-20 Modified the check for cluster services to get compatible with 12c+. # 23-06-20 Listed: Running Instances/listeners, open ports in the report. # 14-09-20 Added Memory utilization check feature, combining both RAM and SWAP in the calculation. # 14-09-20 Reorganize script sections to make it easy to edit by users. # 23-11-20 Enhance df command output in HTML mode # 04-04-21 Listing Dormant accounts in the report. # 04-04-21 Auditing data will be included in the report by default. [If AUD$ is big this section will take much time] # 20-09-21 Show yesterday's hardware (CPU & Memory) stats if crossed the thresholds. # 02-09-22 Added FLASHBACK_CHECK checker to check if FLASHBACK feature is turned OFF and send Email alert. # 20-10-22 enclosing IF condition between two brackets [[ ]] for more accuracy # 20-10-22 Defaulting the script shell to BASH shell to cater to the enclosing of IF condition between double brackets. # 20-10-22 Changed the default setting of CHKAUDITRECORDS from Y to N as some systems have huge audit trail table. # # # # # # # # # #################################################################################################################################### # HERE YOU SET YOUR EMAIL: EMAIL="youremail@yourcompany.com" # HERE YOU SET THE SMTP SERVER IF EXIST. UNHASH THE BELOW LINE AND REPLACE "mailrelay.mycompany.com" WITH YOUR COMPANY's SMTP: #export smtp="mailrelay.mycompany.com:25" # This is an example, your Network Admin knows the SMTP NAME & PORT to use. # ######################### # THRESHOLDS: # ######################### # Send an E-mail for each THRESHOLD if been reached: # ADJUST the following THRESHOLD VALUES as per your requirements: HTMLENABLE=Y # Enable HTML Email Format [DB] FSTHRESHOLD=95 # THRESHOLD FOR FILESYSTEM %USED [OS] CPUTHRESHOLD=95 # THRESHOLD FOR CPU %UTILIZATION [OS] CHECK_MEMORY=Y # REPORT LOW MEMORY USING BELOW TWO DEFINED THRESHOLDS COMBINED [OS] USEDPHYSICALMEM_PCT=95 # THRESHOLD FOR RAM %UTILIZATION [OS] USEDSWAPMEM_PCT=75 # THRESHOLD FOR SWAP SPACE %UTILIZATION [OS] CHECK_CLUSTER=Y # CHECK CLUSTERWARE HEALTH [CL] CHKAUDITRECORDS=N # INCLUDE AUDIT RECORDS IN THE REPORT [increases CPU Load] [DB] SHOWDORMANTACCOUNTS=Y # SHOW INACTIVE ACCOUNTS IN THE REPORT [DB] DORMANT_INACTIVE_DAYS=45 # SHOW Inactive Accounts with NO login attempts since 45 days.[DB] SHOWSQLTUNINGADVISOR=Y # INCLUDE SQL TUNING ADVISOR RESULTS IN THE REPORT [DB] SHOWMEMORYADVISORS=Y # INCLUDE MEMORY ADVISORS RESULTS IN THE REPORT [DB] SHOWSEGMENTADVVISOR=N # INCLUDE SEGMENT ADVISOR RESULTS IN THE REPORT [DB] SHOWJOBS=Y # INCLUDE DB JOBS DETAILS IN THE REPORT [DB] SHOWHASHEDCRED=N # INCLUDE DB USERS HASHED VERSION CREDENTIALS IN THE REPORT [DB] REPORTUNRECOVERABLE=Y # INCLUDE UNRECOVERABLE DATAFILES IN THE REPORT. [DB] TBSTHRESHOLD=95 # THRESHOLD FOR TABLESPACE %USED [DB] FRATHRESHOLD=95 # THRESHOLD FOR FLASH RECOVERY AREA %USED [DB] ASMTHRESHOLD=95 # THRESHOLD FOR ASM DISK GROUPS [DB] UNUSEINDXTHRESHOLD=1 # THRESHOLD FOR NUMBER OF UNUSABLE INDEXES [DB] INVOBJECTTHRESHOLD=1 # THRESHOLD FOR NUMBER OF INVALID OBJECTS [DB] FAILLOGINTHRESHOLD=1 # THRESHOLD FOR NUMBER OF FAILED LOGINS [DB] AUDITRECOTHRESHOLD=1 # THRESHOLD FOR NUMBER OF AUDIT RECORDS [DB] CORUPTBLKTHRESHOLD=1 # THRESHOLD FOR NUMBER OF CORRUPTED BLOCKS [DB] FAILDJOBSTHRESHOLD=1 # THRESHOLD FOR NUMBER OF FAILED JOBS [DB] JOBSRUNSINCENDAY=1 # THRESHOLD FOR JOBS RUNNING LONGER THAN N DAY [DB] NEWOBJCONTTHRESHOLD=1 # THRESHOLD FOR NUMBER OF NEWLY CREATED OBJECTS [DB] MODOBJCONTTHRESHOLD=1 # THRESHOLD FOR NUMBER OF MODIFIED OBJECTS [DB] LONG_RUN_QUR_HOURS=1 # THRESHOLD FOR QUERIES RUNNING LONGER THAN N HOURS [DB] SHOW_YESTERDAY_STATS=Y # CHECKER FOR SHOWING HARDWARE RESOURCES THAT CROSSED THRESHOLDS[OS] FLASHBACK_CHECK=N # Y means SEND ALERT EMAIL IF FLASHBACK FEATURE IS TURNED OFF [DB] # ####################################### # Excluded Modules: # ####################################### # Here you can exclude the modules you don't want their queries to get reported in the Long Running Queries list: # goldegate modules are excluded below, to add extra modules, make sure to enclose them between single quote and separating them by a comma: EXCLUDED_MODULES="'OGG-USE_OCI_THREAD','OGG-OCI_META_THREAD'" # ####################################### # Excluded INSTANCES: # ####################################### # Here you can mention the instances the script will IGNORE and will NOT run against: # Use pipe "|" as a separator between each instance name. # e.g. Excluding: -MGMTDB, ASM instances: EXL_DB="\-MGMTDB|ASM|APX" #Excluding INSTANCES [Will get excluded from the report]. # ######################### # Excluded ERRORS: # ######################### # Here you can exclude the errors that you don't want to be alerted when they appear in the logs: # Use pipe "|" between each error. EXL_ALERT_ERR="ORA-2396|TNS-00507|TNS-12502|TNS-12560|TNS-12537|TNS-00505" #Excluded ALERTLOG ERRORS [Will not get reported]. EXL_LSNR_ERR="TNS-00507|TNS-12502|TNS-12560|TNS-12537|TNS-00505" #Excluded LISTENER ERRORS [Will not get reported]. # ################################ # Excluded FILESYSTEM/MOUNT POINTS: # ################################ # Here you can exclude specific filesystems/mount points from being reported by the script: # e.g. Excluding: /dev/mapper, /dev/asm mount points: EXL_FS="\/dev\/mapper\/|\/dev\/asm\/" #Excluded mount points [Will be skipped during the check]. # Workaround df command output bug "`/root/.gvfs': Permission denied" if [[ -f /etc/redhat-release ]] then export DF='df -hTPx fuse.gvfs-fuse-daemon' else export DF='df -hT' fi export SRV_NAME="`uname -n`" case ${EMAIL} in "youremail@yourcompany.com") echo echo "##############################################################################################" echo "You Missed Something! :-)" echo "In order to receive the HEALTH CHECK report via Email, set your E-mail at line# 120" echo "by replacing this template [youremail@yourcompany.com] with YOUR E-mail address." echo "DB HEALTH CHECK report will be saved on disk..." echo "##############################################################################################" export SQLLINESIZE=165 echo;; *) export SQLLINESIZE=200 export OSLINESIZE=300 ;; esac SCRIPT_NAME="dbdailychk${VER}" # In case your company Emails go through a specific SMTP server. Specify it in the below line and UN-HASH it: #export smtp="mailrelay.mycompany.com:25" #This is an example, you have to check with your Network Admin for the SMTP NAME/PORT to use. export MAIL_LIST="${EMAIL}" #export MAIL_LIST="-r ${SRV_NAME} ${EMAIL}" echo echo "[dbdailychk Script Started ...]" # ############################# # EXPORTING VARIABLES SECTIONS: # ############################# export HTMLENABLE export FSTHRESHOLD export CPUTHRESHOLD export CHECK_MEMORY export USEDPHYSICALMEM_PCT export USEDSWAPMEM_PCT export CHECK_CLUSTER export CHKAUDITRECORDS export SHOWDORMANTACCOUNTS export DORMANT_INACTIVE_DAYS export SHOWSQLTUNINGADVISOR export SHOWMEMORYADVISORS export SHOWSEGMENTADVVISOR export SHOWJOBS export SHOWHASHEDCRED export REPORTUNRECOVERABLE export TBSTHRESHOLD export FRATHRESHOLD export ASMTHRESHOLD export UNUSEINDXTHRESHOLD export INVOBJECTTHRESHOLD export FAILLOGINTHRESHOLD export AUDITRECOTHRESHOLD export CORUPTBLKTHRESHOLD export FAILDJOBSTHRESHOLD export JOBSRUNSINCENDAY export NEWOBJCONTTHRESHOLD export MODOBJCONTTHRESHOLD export LONG_RUN_QUR_HOURS export SHOW_YESTERDAY_STATS export FLASHBACK_CHECK export EXCLUDED_MODULES export EXL_DB export EXL_ALERT_ERR export EXL_LSNR_ERR export EXL_FS export SCRIPT_NAME # ######################### # Checking The FILESYSTEM: # ######################### # Report Partitions that reach the threshold of Used Space: FSLOG=/tmp/filesystem_DBA_BUNDLE.log echo "[Reported By ${SCRIPT_NAME} Script" > ${FSLOG} echo "" >> ${FSLOG} ${DF} >> ${FSLOG} ${DF} | grep -v "^Filesystem" |awk '{print substr($0, index($0, $2))}'| egrep -v "${EXL_FS}"|awk '{print $(NF-1)" "$NF}'| while read OUTPUT do PRCUSED=`echo ${OUTPUT}|awk '{print $1}'|cut -d'%' -f1` FILESYS=`echo ${OUTPUT}|awk '{print $2}'` if [[ ${PRCUSED} -ge ${FSTHRESHOLD} ]] then mail -s "ALARM: Filesystem [ ${FILESYS} ] on Server [ ${SRV_NAME} ] has reached ${PRCUSED}% of USED space" ${MAIL_LIST} < ${FSLOG} fi done rm -f ${FSLOG} # ######################### # Getting ORACLE_SID: # ######################### # Exit with sending Alert mail if No DBs are running: INS_COUNT=$( ps -ef|grep pmon|grep -v grep|egrep -v ${EXL_DB}|wc -l ) if [[ $INS_COUNT -eq 0 ]] then echo "[Reported By ${SCRIPT_NAME} Script]" > /tmp/oracle_processes_DBA_BUNDLE.log echo " " >> /tmp/oracle_processes_DBA_BUNDLE.log echo "Current running INSTANCES on server [${SRV_NAME}]:" >> /tmp/oracle_processes_DBA_BUNDLE.log echo "***************************************************" >> /tmp/oracle_processes_DBA_BUNDLE.log ps -ef|grep -v grep|grep pmon >> /tmp/oracle_processes_DBA_BUNDLE.log echo " " >> /tmp/oracle_processes_DBA_BUNDLE.log echo "Current running LISTENERS on server [${SRV_NAME}]:" >> /tmp/oracle_processes_DBA_BUNDLE.log echo "***************************************************" >> /tmp/oracle_processes_DBA_BUNDLE.log ps -ef|grep -v grep|grep tnslsnr >> /tmp/oracle_processes_DBA_BUNDLE.log mail -s "ALARM: No Databases Are Running on Server ${SRV_NAME} !!!" ${MAIL_LIST} < /tmp/oracle_processes_DBA_BUNDLE.log rm -f /tmp/oracle_processes_DBA_BUNDLE.log exit fi # ######################### # Setting ORACLE_SID: # ######################### for ORACLE_SID in $( ps -ef|grep pmon|grep -v grep|egrep -v ${EXL_DB}|awk '{print $NF}'|sed -e 's/ora_pmon_//g'|grep -v sed|grep -v "s///g" ) do export ORACLE_SID # ######################### # Getting ORACLE_HOME # ######################### ORA_USER=`ps -ef|grep ${ORACLE_SID}|grep pmon|grep -v grep|egrep -v ${EXL_DB}|grep -v "\-MGMTDB"|awk '{print $1}'|tail -1` USR_ORA_HOME=`grep -i "^${ORA_USER}:" /etc/passwd| cut -f6 -d ':'|tail -1` # SETTING ORATAB: if [[ -f /etc/oratab ]] then ORATAB=/etc/oratab export ORATAB ## If OS is Solaris: elif [[ -f /var/opt/oracle/oratab ]] then ORATAB=/var/opt/oracle/oratab export ORATAB fi # ATTEMPT1: Get ORACLE_HOME using pwdx command: export PGREP=`which pgrep` export PWDX=`which pwdx` if [[ -x ${PGREP} ]] && [[ -x ${PWDX} ]] then PMON_PID=`pgrep -lf _pmon_${ORACLE_SID}|awk '{print $1}'` export PMON_PID ORACLE_HOME=`pwdx ${PMON_PID} 2>/dev/null|awk '{print $NF}'|sed -e 's/\/dbs//g'` export ORACLE_HOME fi # ATTEMPT2: If ORACLE_HOME not found get it from oratab file: if [[ ! -f ${ORACLE_HOME}/bin/sqlplus ]] then ## If OS is Linux: if [[ -f /etc/oratab ]] then ORATAB=/etc/oratab ORACLE_HOME=`grep -v '^\#' ${ORATAB} | grep -v '^$'| grep -i "^${ORACLE_SID}:" | perl -lpe'$_ = reverse' | cut -f3 | perl -lpe'$_ = reverse' |cut -f2 -d':'` export ORACLE_HOME ## If OS is Solaris: elif [[ -f /var/opt/oracle/oratab ]] then ORATAB=/var/opt/oracle/oratab ORACLE_HOME=`grep -v '^\#' ${ORATAB} | grep -v '^$'| grep -i "^${ORACLE_SID}:" | perl -lpe'$_ = reverse' | cut -f3 | perl -lpe'$_ = reverse' |cut -f2 -d':'` export ORACLE_HOME fi fi # ATTEMPT3: If ORACLE_HOME is in /etc/oratab, use dbhome command: if [[ ! -f ${ORACLE_HOME}/bin/sqlplus ]] then ORACLE_HOME=`dbhome "${ORACLE_SID}"` export ORACLE_HOME fi # ATTEMPT4: If ORACLE_HOME is still not found, search for the environment variable: [Less accurate] if [[ ! -f ${ORACLE_HOME}/bin/sqlplus ]] then ORACLE_HOME=`env|grep -i ORACLE_HOME|sed -e 's/ORACLE_HOME=//g'` export ORACLE_HOME fi # ATTEMPT5: If ORACLE_HOME is not found in the environment search user's profile: [Less accurate] if [[ ! -f ${ORACLE_HOME}/bin/sqlplus ]] then ORACLE_HOME=`grep -h 'ORACLE_HOME=\/' ${USR_ORA_HOME}/.bash_profile ${USR_ORA_HOME}/.*profile | perl -lpe'$_ = reverse' |cut -f1 -d'=' | perl -lpe'$_ = reverse'|tail -1` export ORACLE_HOME fi # ATTEMPT6: If ORACLE_HOME is still not found, search for orapipe: [Least accurate] if [[ ! -f ${ORACLE_HOME}/bin/sqlplus ]] then if [[ -x /usr/bin/locate ]] then ORACLE_HOME=`locate -i orapipe|head -1|sed -e 's/\/bin\/orapipe//g'` export ORACLE_HOME fi fi # TERMINATE: If all above attempts failed to get ORACLE_HOME location, EXIT the script: if [[ ! -f ${ORACLE_HOME}/bin/sqlplus ]] then echo "Please export ORACLE_HOME variable in your .bash_profile file under oracle user home directory in order to get this script to run properly" echo "e.g." echo "export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1" mail -s "dbdailychk script on Server [ ${SRV_NAME} ] failed to locate ORACLE_HOME for SID [ ${ORACLE_SID} ], Please export ORACLE_HOME variable in your .bash_profile file under oracle user home directory" ${MAIL_LIST} < /dev/null exit fi export LD_LIBRARY_PATH=${ORACLE_HOME}/lib # ############################# # Getting hostname in lowercase: # ############################# HOSTNAMELOWER=$( echo "`hostname --short`"| tr '[A-Z]' '[a-z]' ) export HOSTNAMELOWER # ######################## # Getting GRID_HOME: # ######################## CHECK_OCSSD=`ps -ef|grep 'ocssd.bin'|grep -v grep|wc -l` CHECK_CRSD=`ps -ef|grep 'crsd.bin'|grep -v grep|wc -l` if [[ ${CHECK_OCSSD} -gt 0 ]] then GRID_HOME=`ps -ef|grep 'ocssd.bin'|grep -v grep|awk '{print $NF}'|sed -e 's/\/bin\/ocssd.bin//g'|grep -v sed|grep -v "//g"|tail -1` export GRID_HOME if [[ ! -d ${GRID_HOME} ]] then ASM_INSTANCE_NAME=`ps -ef|grep pmon|grep -v grep|grep asm_pmon_|awk '{print $NF}'|sed -e 's/asm_pmon_//g'|grep -v sed|grep -v "s///g"|tail -1` GRID_HOME=`dbhome ${ASM_INSTANCE_NAME}` export GRID_HOME fi # ######################## # Getting GRID_BASE: # ######################## # Locating GRID_BASE: GRID_BASE=`cat ${GRID_HOME}/crs/install/crsconfig_params|grep ^ORACLE_BASE|tail -1|awk '{print $NF}'|sed -e 's/ORACLE_BASE=//g'` export GRID_BASE if [[ ! -d ${GRID_BASE} ]] then GRID_BASE=`cat ${GRID_HOME}/crs/utl/appvipcfg|grep ^ORACLE_BASE|tail -1|awk '{print $NF}'|sed -e 's/ORACLE_BASE=//g'` export GRID_BASE fi if [[ ! -d ${GRID_BASE} ]] then GRID_BASE=`cat ${GRID_HOME}/install/envVars.properties|grep ^ORACLE_BASE|tail -1|awk '{print $NF}'|sed -e 's/ORACLE_BASE=//g'` export GRID_BASE fi fi # ######################### # Variables: # ######################### export PATH=${PATH}:${ORACLE_HOME}/bin export LOG_DIR=${USR_ORA_HOME}/BUNDLE_Logs mkdir -p ${LOG_DIR} chown -R ${ORA_USER} ${LOG_DIR} chmod -R go-rwx ${LOG_DIR} if [[ ! -d ${LOG_DIR} ]] then mkdir -p /tmp/BUNDLE_Logs export LOG_DIR=/tmp/BUNDLE_Logs chown -R ${ORA_USER} ${LOG_DIR} chmod -R go-rwx ${LOG_DIR} fi cat /dev/null > ${LOG_DIR}/dbdailychk.part.log export LOGFILE=${LOG_DIR}/dbdailychk.part.log # ######################### # HTML Preparation: # ######################### case ${HTMLENABLE} in y|Y|yes|YES|Yes|ON|On|on) if [[ -x /usr/sbin/sendmail ]] then export SENDMAIL="/usr/sbin/sendmail -t" export MAILEXEC="echo #" export HASHHTML="" export HASHNONHTML="--" export HASHHTMLOS="" export HASHNOHTMLOS="echo #" SENDMAILARGS=$( echo "To: ${EMAIL};" echo "Subject: ${MSGSUBJECT} ;" echo "Content-Type: text/html;" echo "MIME-Version: 1.0;" cat ${LOGFILE} ) export SENDMAILARGS else export SENDMAIL="echo #" export MAILEXEC="mail -s" export HASHHTML="--" export HASHNONHTML="" export HASHHTMLOS="echo #" export HASHNOHTMLOS="" fi ;; *) export SENDMAIL="echo #" export HASHHTML="--" export HASHNONHTML="" export HASHHTMLOS="echo #" export HASHNOHTMLOS="" export MAILEXEC="mail -s" ;; esac export LOGFILE=${LOG_DIR}/dbdailychk.part.log export SRV_NAME="`uname -n`" # ########################## # Neutralize login.sql file: [Bug Fix] # ########################## # Existance of login.sql file under Oracle user Linux home directory eliminates many functions during the execution of this script from crontab: if [[ -f ${USR_ORA_HOME}/login.sql ]] then #echo "login.sql file found and will be neutralized." mv ${USR_ORA_HOME}/login.sql ${USR_ORA_HOME}/login.sql_NeutralizedBy${SCRIPT_NAME} fi # ######################## # Getting ORACLE_BASE: # ######################## # Get ORACLE_BASE from user's profile if it EMPTY: if [[ ! -d "${ORACLE_BASE}" ]] then ORACLE_BASE=`cat ${ORACLE_HOME}/install/envVars.properties|grep ^ORACLE_BASE|tail -1|awk '{print $NF}'|sed -e 's/ORACLE_BASE=//g'` export ORACLE_BASE fi if [[ ! -d "${ORACLE_BASE}" ]] then ORACLE_BASE=`grep -h 'ORACLE_BASE=\/' ${USR_ORA_HOME}/.bash* ${USR_ORA_HOME}/.*profile | perl -lpe'$_ = reverse' |cut -f1 -d'=' | perl -lpe'$_ = reverse'|tail -1` export ORACLE_BASE fi # ######################### # Getting DB_NAME: # ######################### DB_NAME_RAW=$(${ORACLE_HOME}/bin/sqlplus -S "/ as sysdba" < ${JOBSRUNSINCENDAY} and SESSION_ID is not null; SELECT count(*) from dba_scheduler_running_jobs where extract(day FROM elapsed_time) > ${JOBSRUNSINCENDAY}; exit; EOF ) VAL510=`echo ${VAL410} | awk '{print $NF}'` if [[ ${VAL510} -ge 1 ]] then VAL610=$(${ORACLE_HOME}/bin/sqlplus -S "/ as sysdba" << EOF set linesize ${SQLLINESIZE} pages 1000 -- Enable HTML color format: ${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF spool ${LOGFILE} ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} PROMPT

${HASHHTML} PROMPT Long Running Jobs [${ORACLE_SID}] ${HASHHTML} PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 ${HASHNONHTML} PROMPT Long Running Jobs: [${ORACLE_SID}] ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^^^ col INS for 999 col "JOB_NAME|OWNER|SPID|SID" for a55 col ELAPSED_TIME for a17 col CPU_USED for a17 col "WAIT_SEC" for 9999999999 col WAIT_CLASS for a15 col "BLKD_BY" for 9999999 col "WAITED|WCLASS|EVENT" for a45 select j.RUNNING_INSTANCE INS,j.JOB_NAME ||' | '|| j.OWNER||' |'||SLAVE_OS_PROCESS_ID||'|'||j.SESSION_ID"JOB_NAME|OWNER|SPID|SID" ,s.FINAL_BLOCKING_SESSION "BLKD_BY",ELAPSED_TIME,CPU_USED ,substr(s.SECONDS_IN_WAIT||'|'||s.WAIT_CLASS||'|'||s.EVENT,1,45) "WAITED|WCLASS|EVENT",S.SQL_ID from dba_scheduler_running_jobs j, gv\$session s where j.RUNNING_INSTANCE=S.INST_ID(+) and j.SESSION_ID=S.SID(+) and extract(day FROM elapsed_time) > ${JOBSRUNSINCENDAY} order by "JOB_NAME|OWNER|SPID|SID",ELAPSED_TIME; spool off exit; EOF ) #mail -s "WARNING: JOBS running for more than ${JOBSRUNSINCENDAY} day detected on database [${DB_NAME_UPPER}] on Server [${SRV_NAME}]" ${MAIL_LIST} < ${LOG_DIR}/long_running_jobs.log export MSGSUBJECT="WARNING: JOBS running for more than ${JOBSRUNSINCENDAY} day detected on database [${DB_NAME_UPPER}] on Server [${SRV_NAME}]" #SENDMAILARGS=$( #echo "To: ${EMAIL};" #echo "Subject: ${MSGSUBJECT} ;" #echo "Content-Type: text/html;" #echo "MIME-Version: 1.0;" #cat ${LOGFILE} #) ${MAILEXEC} "${MSGSUBJECT}" ${MAIL_LIST} < ${LOGFILE} #echo ${SENDMAILARGS} | tr \; '\n' |awk 'length == 1 || NR == 1 {print $0} length && NR > 1 { print substr($0,2) }'| ${SENDMAIL} ( echo "To: ${EMAIL};" echo "MIME-Version: 1.0" echo "Content-Type: text/html;" echo "Subject: ${MSGSUBJECT}" cat ${LOGFILE} ) | ${SENDMAIL} cat /dev/null > ${LOGFILE} fi # ############################################ # LOGFILE SETTINGS: # ############################################ # Logfile path variable: DB_HEALTHCHK_RPT=${LOG_DIR}/${DB_NAME_UPPER}_HEALTH_CHECK_REPORT.log OS_HEALTHCHK_RPT=${LOG_DIR}/OS_HEALTH_CHECK_REPORT.log export DB_HEALTHCHK_RPT # Flush the logfile: export LOGDATE=`date +%d-%b-%y` echo "HEALTH_CHECK_REPORT_FOR_DATABASE_[${DB_NAME_UPPER}]_ON_{${LOGDATE}}" > ${DB_HEALTHCHK_RPT} cat /dev/null > ${OS_HEALTHCHK_RPT} # ########################### # Checking Memory Utilization: # ########################### case ${CHECK_MEMORY} in y|Y|yes|YES|Yes|ON|On|on) # Check the Linux OS version: export PATH=${PATH}:/usr/local/bin FILE_NAME=/etc/redhat-release export FILE_NAME if [[ -f ${FILE_NAME} ]] then LNXVER=`cat /etc/redhat-release | grep -o '[0-9]'|head -1` export LNXVER # IF LINUX VERSION IS 6 OR LOWER: if [[ ${LNXVER} -le 6 ]] then MEMTOTAL=`cat /proc/meminfo|grep MemTotal|awk '{print $(NF-1)}'` MEMUSEDRAW=`free -k|grep 'Mem:'|awk '{print $(3)}'` MEMCACHED=`cat /proc/meminfo|grep '^Cached:'|awk '{print $(NF-1)}'` MEMFREE=$(awk "BEGIN {print ${MEMTOTAL} - ${MEMUSEDRAW} + ${MEMCACHED}}") MEMUSED=$(awk "BEGIN {print ${MEMTOTAL} - ${MEMFREE}}") MEMUSEDPCTFLOAT=$(awk "BEGIN {print ${MEMUSED} * 100 / ${MEMTOTAL}}") MEMUSEDPCT=${MEMUSEDPCTFLOAT%.*} SWAPTOTAL=`cat /proc/meminfo|grep SwapTotal|awk '{print $(NF-1)}'` SWAPFREE=`cat /proc/meminfo|grep SwapFree|awk '{print $(NF-1)}'` SWAPUSED=$(awk "BEGIN {print ${SWAPTOTAL} - ${SWAPFREE}}") SWAPUSEDPCTFLOAT=$(awk "BEGIN {print ${SWAPUSED} * 100 / ${SWAPTOTAL}}") SWAPUSEDPCT=${SWAPUSEDPCTFLOAT%.*} fi # IF LINUX VERSION IS 7 OR HIGHER: if [[ ${LNXVER} -ge 7 ]] then MEMTOTAL=`cat /proc/meminfo|grep MemTotal|awk '{print $(NF-1)}'` MEMUSEDRAW=`free -k|grep 'Mem:'|awk '{print $(3)}'` MEMCACHED=`cat /proc/meminfo|grep '^Cached:'|awk '{print $(NF-1)}'` MEMFREE=`cat /proc/meminfo|grep MemAvailable|awk '{print $(NF-1)}'` MEMUSED=$(awk "BEGIN {print ${MEMTOTAL} - ${MEMFREE}}") MEMUSEDPCTFLOAT=$(awk "BEGIN {print ${MEMUSED} * 100 / ${MEMTOTAL}}") MEMUSEDPCT=${MEMUSEDPCTFLOAT%.*} SWAPTOTAL=`cat /proc/meminfo|grep SwapTotal|awk '{print $(NF-1)}'` SWAPFREE=`cat /proc/meminfo|grep SwapFree|awk '{print $(NF-1)}'` SWAPUSED=$(awk "BEGIN {print ${SWAPTOTAL} - ${SWAPFREE}}") SWAPUSEDPCTFLOAT=$(awk "BEGIN {print ${SWAPUSED} * 100 / ${SWAPTOTAL}}") SWAPUSEDPCT=${SWAPUSEDPCTFLOAT%.*} fi # Show MEMORY ALERT if both MEMUSEDPCT and SWAPUSEDPCT are below their defined thresholds: if [[ ${MEMUSEDPCT} -ge ${USEDPHYSICALMEM_PCT} ]] && [[ ${SWAPUSEDPCT} -ge ${USEDSWAPMEM_PCT} ]] then echo "" >> ${OS_HEALTHCHK_RPT} echo "^^^^^^^^^^^^^^^^^" >> ${OS_HEALTHCHK_RPT} echo "MEMORY_WARNING: " >> ${OS_HEALTHCHK_RPT} echo "^^^^^^^^^^^^^^^^^" >> ${OS_HEALTHCHK_RPT} echo "Looks_The_Server_Is_Running_Out_of_Memory!." >> ${OS_HEALTHCHK_RPT} echo "" >> ${OS_HEALTHCHK_RPT} echo "%USED_PHYSICAL_RAM:${MEMUSEDPCT}%" >> ${OS_HEALTHCHK_RPT} echo "%USED_SWAP_SPACE:${SWAPUSEDPCT}%" >> ${OS_HEALTHCHK_RPT} echo "" >> ${OS_HEALTHCHK_RPT} echo "Memory_Details:" >> ${OS_HEALTHCHK_RPT} echo "^^^^^^^^^^^^^^" >> ${OS_HEALTHCHK_RPT} echo "" >> ${OS_HEALTHCHK_RPT} free -g >> ${OS_HEALTHCHK_RPT} echo "" >> ${OS_HEALTHCHK_RPT} mail -s "ALARM: OUT OF MEMORY Scenario is Imminent on Server [ ${SRV_NAME} ]" ${MAIL_LIST} < ${OS_HEALTHCHK_RPT} fi fi ;; esac # Show yesterday's hardware stats if crossed threshold: case ${SHOW_YESTERDAY_STATS} in Y|y|YES|Yes|yes|ON|On|on) # Yesterday's High CPU Utilization: # ################################# # If CPU IDLE is below 5% or CPU Utilization is higher than 95%: HIGH_CPU_CNT=`sar -f /var/log/sa/sa$(date +%d -d yesterday) | sed -r '/^\s*$/d' | awk '{ if ( $NF < 5 ) print $NF,$1,$2 }'|wc -l` if [[ ${HIGH_CPU_CNT} -gt 1 ]] then echo "" >> ${OS_HEALTHCHK_RPT} echo "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" >> ${OS_HEALTHCHK_RPT} echo "Yesterday's_High_CPU_Periods:" >> ${OS_HEALTHCHK_RPT} echo "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" >> ${OS_HEALTHCHK_RPT} sar -f /var/log/sa/sa$(date +%d -d yesterday) | sed -r '/^\s*$/d' | grep -v Linux | awk '{ if ( $NF < 5 ) print $NF,$1,$2 }' >> ${OS_HEALTHCHK_RPT} fi # Yesterday's High Memory Utilization: # #################################### # If Memory utilization cross 95%: HIGH_MEM_CNT=`sar -r -f /var/log/sa/sa$(date +%d -d yesterday) | grep -Ev 'Average|Linux' | awk '{ if ( $5 > 95 ) print $5,$1,$2 }'|wc -l` if [[ ${HIGH_MEM_CNT} -ge 1 ]] then echo "" >> ${OS_HEALTHCHK_RPT} echo "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" >> ${OS_HEALTHCHK_RPT} echo "Yesterday's_High_Memory_Periods:" >> ${OS_HEALTHCHK_RPT} echo "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" >> ${OS_HEALTHCHK_RPT} sar -r -f /var/log/sa/sa$(date +%d -d yesterday) | grep -Ev 'Average|Linux' | awk '{ if ( $5 > 95 ) print $5,$1,$2 }' >> ${OS_HEALTHCHK_RPT} fi ;; esac # Filesystem Utilization: # ####################### echo "" >> ${OS_HEALTHCHK_RPT} echo "^^^^^^^^^^^^^^^^^" >> ${OS_HEALTHCHK_RPT} echo "Local_Filesystem:" >> ${OS_HEALTHCHK_RPT} echo "^^^^^^^^^^^^^^^^^" >> ${OS_HEALTHCHK_RPT} ${DF} >> ${OS_HEALTHCHK_RPT} echo "" >> ${OS_HEALTHCHK_RPT} sed -i 's/Mounted on/Mounted_on/g' ${OS_HEALTHCHK_RPT} # ############################################ # Checking RAC/ORACLE_RESTART Services: # ############################################ case ${CHECK_CLUSTER} in y|Y|yes|YES|Yes|ON|On|on) # Check for ocssd clusterware process: CHECK_OCSSD=`ps -ef|grep 'ocssd.bin'|grep -v grep|wc -l` CHECK_CRSD=`ps -ef|grep 'crsd.bin'|grep -v grep|wc -l` if [[ ${CHECK_CRSD} -gt 0 ]] then CLS_STR=crs export CLS_STR CLUSTER_TYPE=CLUSTERWARE export CLUSTER_TYPE else CLS_STR=has export CLS_STR CLUSTER_TYPE=ORACLE_RESTART export CLUSTER_TYPE fi if [[ ${CHECK_CRSD} -gt 0 ]] then GRID_HOME=`ps -ef|grep 'ocssd.bin'|grep -v grep|awk '{print $NF}'|sed -e 's/\/bin\/ocssd.bin//g'|grep -v sed|grep -v "//g"` export GRID_HOME echo "^^^^^^^^^^^^^^^^^^^" >> ${OS_HEALTHCHK_RPT} echo "CLUSTERWARE CHECKS:" >> ${OS_HEALTHCHK_RPT} echo "^^^^^^^^^^^^^^^^^^^" >> ${OS_HEALTHCHK_RPT} echo "" >> ${OS_HEALTHCHK_RPT} FILE_NAME=${GRID_HOME}/bin/ocrcheck export FILE_NAME if [[ -x ${FILE_NAME} ]] then echo "" >> ${OS_HEALTHCHK_RPT} echo "^^^^^^^^^^^^^^^^^^^" >> ${OS_HEALTHCHK_RPT} echo "OCR DISKS CHECKING:" >> ${OS_HEALTHCHK_RPT} echo "^^^^^^^^^^^^^^^^^^^" >> ${OS_HEALTHCHK_RPT} ${GRID_HOME}/bin/ocrcheck >> ${OS_HEALTHCHK_RPT} echo "" >> ${OS_HEALTHCHK_RPT} fi FILE_NAME=${GRID_HOME}/bin/crsctl export FILE_NAME if [[ -x ${FILE_NAME} ]] then echo "" >> ${OS_HEALTHCHK_RPT} echo "^^^^^^^^^^^^^^^^^^^^" >> ${OS_HEALTHCHK_RPT} echo "VOTE DISKS CHECKING:" >> ${OS_HEALTHCHK_RPT} echo "^^^^^^^^^^^^^^^^^^^^" >> ${OS_HEALTHCHK_RPT} ${GRID_HOME}/bin/crsctl query css votedisk >> ${OS_HEALTHCHK_RPT} echo "" >> ${OS_HEALTHCHK_RPT} fi fi if [[ ${CHECK_OCSSD} -gt 0 ]] then GRID_HOME=`ps -ef|grep 'ocssd.bin'|grep -v grep|awk '{print $NF}'|sed -e 's/\/bin\/ocssd.bin//g'|grep -v sed|grep -v "//g"` export GRID_HOME FILE_NAME=${GRID_HOME}/bin/crsctl export FILE_NAME if [[ -x ${FILE_NAME} ]] then echo "" >> ${OS_HEALTHCHK_RPT} echo "" >> ${OS_HEALTHCHK_RPT} echo "^^^^^^^^^^^^^^^^^^^^^^^" >> ${OS_HEALTHCHK_RPT} echo "${CLUSTER_TYPE}_SERVICES:" >> ${OS_HEALTHCHK_RPT} echo "^^^^^^^^^^^^^^^^^^^^^^^" >> ${OS_HEALTHCHK_RPT} EXCLUDED_SERVICES="ora.proxy_advm|ora.asmgroup|ora.diskmon|ora.ons" $GRID_HOME/bin/crsctl status res |grep -v "^$"|awk -F "=" 'BEGIN {print " "} {printf("%s",NR%4 ? $2"|" : $2"\n")}'|sed -e 's/ *, /,/g' -e 's/, /,/g'|\ awk -F "|" 'BEGIN { printf "%-50s%-50s\n","Resource_Name","State";printf "%-50s%-50s\n", "-------------------------------------","---------------------"; }{ split ($3,trg,",") split ($4,st,",")} {for (i in trg) {printf "%-50s%-50s\n",$1,st[i]}}'|egrep -v "${EXCLUDED_SERVICES}" >> ${OS_HEALTHCHK_RPT} fi FILE_NAME=${ORACLE_HOME}/bin/srvctl export FILE_NAME if [[ -x ${FILE_NAME} ]] then echo "" >> ${OS_HEALTHCHK_RPT} echo "^^^^^^^^^^^^^^^^^^^^^^^^" >> ${OS_HEALTHCHK_RPT} echo "DATABASE_SERVICES_STATUS:" >> ${OS_HEALTHCHK_RPT} echo "^^^^^^^^^^^^^^^^^^^^^^^^" >> ${OS_HEALTHCHK_RPT} ${ORACLE_HOME}/bin/srvctl status service -d ${DB_UNQ_NAME} >> ${OS_HEALTHCHK_RPT} echo "" >> ${OS_HEALTHCHK_RPT} fi fi ;; esac echo "" >> ${OS_HEALTHCHK_RPT} echo "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" >> ${OS_HEALTHCHK_RPT} echo "List_of_All_Running_Instances:" >> ${OS_HEALTHCHK_RPT} echo "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" >> ${OS_HEALTHCHK_RPT} ps -ef|grep pmon|grep -v grep >> ${OS_HEALTHCHK_RPT} echo "" >> ${OS_HEALTHCHK_RPT} echo "" >> ${OS_HEALTHCHK_RPT} echo "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" >> ${OS_HEALTHCHK_RPT} echo "List_of_All_Running_Listeners:" >> ${OS_HEALTHCHK_RPT} echo "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" >> ${OS_HEALTHCHK_RPT} ps -ef|grep tnslsnr|grep -v grep >> ${OS_HEALTHCHK_RPT} echo "" >> ${OS_HEALTHCHK_RPT} # https://superuser.com/questions/529830/get-a-list-of-open-ports-in-linux [datashaman] FILE_NAME=/bin/netstat export FILE_NAME if [[ -x ${FILE_NAME} ]] then echo "" >> ${OS_HEALTHCHK_RPT} echo "^^^^^^^^^^^^^^^^^^^^^^^" >> ${OS_HEALTHCHK_RPT} echo "List_of_All_Open_Ports:" >> ${OS_HEALTHCHK_RPT} echo "^^^^^^^^^^^^^^^^^^^^^^^" >> ${OS_HEALTHCHK_RPT} netstat -lnt | awk 'NR>2{print $4}' | grep -E '(0.0.0.0:|:::)' | sed 's/.*://' | sort -n | uniq >> ${OS_HEALTHCHK_RPT} echo "" >> ${OS_HEALTHCHK_RPT} fi # Convert OS Checks into HTML format: #${HASHHTMLOS} awk 'BEGIN { print "

"} {print ""; for(i=1;i<=NF;i++)print ""; print ""} END{print "
" $i"
" }' ${OS_HEALTHCHK_RPT} >> ${DB_HEALTHCHK_RPT} case ${HASHHTMLOS} in 'echo #') cat ${OS_HEALTHCHK_RPT} >> ${DB_HEALTHCHK_RPT};; *) ${HASHHTMLOS} awk 'BEGIN { print ""} {print ""; for(i=1;i<=NF;i++)print ""; print ""} END{print "
" $i"
" }' ${OS_HEALTHCHK_RPT} >> ${DB_HEALTHCHK_RPT};; esac # ############################################ # REPORT UNRECOVERABLE DATABASE FILES: [RMAN] # ############################################ case ${REPORTUNRECOVERABLE} in Y|y|YES|Yes|yes|ON|On|on) VAL37=$(${ORACLE_HOME}/bin/rman target / << EOF spool log to ${LOG_DIR}/unrecoverable_DBfiles.log; REPORT UNRECOVERABLE; spool log off; exit; EOF ) #${HASHHTMLOS} echo "" > ${LOG_DIR}/unrecoverable_DBfiles_FORMATTED.log #${HASHHTMLOS} echo "" > ${LOG_DIR}/unrecoverable_DBfiles_FORMATTED.log #${HASHHTMLOS} echo "UNRECOVERABLE_DATABASE_FILES:RMAN" >> ${LOG_DIR}/unrecoverable_DBfiles_FORMATTED.log #${HASHHTMLOS} echo "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" >> ${LOG_DIR}/unrecoverable_DBfiles_FORMATTED.log #${HASHHTMLOS} sed '/Spooling \|Recovery Manager\|RMAN>\|using \|Report \|^$/d' ${LOG_DIR}/unrecoverable_DBfiles.log >> ${LOG_DIR}/unrecoverable_DBfiles_FORMATTED.log #${HASHHTMLOS} awk 'BEGIN { print ""} {print ""; for(i=1;i<=NF;i++)print ""; print ""} END{print "
" $i"
" }' ${LOG_DIR}/unrecoverable_DBfiles_FORMATTED.log >> ${DB_HEALTHCHK_RPT} ;; esac # ############################################ # Checking Advisors: # ############################################ # Checking if the Advisors should be enabled in the report: case ${SHOWSQLTUNINGADVISOR} in Y|y|YES|Yes|yes|ON|On|on) export HASHSTA="";; *) export HASHSTA="--";; esac case ${SHOWMEMORYADVISORS} in Y|y|YES|Yes|yes|ON|On|on) export HASHMA="";; *) export HASHMA="--";; esac case ${SHOWSEGMENTADVVISOR} in Y|y|YES|Yes|yes|ON|On|on) export HASHSA="";; *) export HASHSA="--";; esac case ${REPORTUNRECOVERABLE} in Y|y|YES|Yes|yes|ON|On|on) export HASHU="";; *) export HASHU="--";; esac case ${SHOWJOBS} in Y|y|YES|Yes|yes|ON|On|on) export HASHJ="";; *) export HASHJ="--";; esac case ${SHOWHASHEDCRED} in Y|y|YES|Yes|yes|ON|On|on) export HASHCRD="";; *) export HASHCRD="--";; esac case ${SHOWDORMANTACCOUNTS} in Y|y|YES|Yes|yes|ON|On|on) export HASHDORM="";; *) export HASHDORM="--";; esac # If the database version is 10g onward collect the advisors recommendations: if [[ ${DB_VER} -gt 9 ]] then VAL611=$(${ORACLE_HOME}/bin/sqlplus -S "/ as sysdba" << EOF set linesize ${SQLLINESIZE} pages 100 -- Enable HTML color format: --${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF spool ${DB_HEALTHCHK_RPT} app ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} PROMPT

${HASHHTML} PROMPT Tablespaces Size ${HASHHTML} PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 ${HASHNONHTML} PROMPT ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^^^ ${HASHNONHTML} PROMPT Tablespaces Size: [Based on Datafiles MAXSIZE] ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^^^ set pages 1000 linesize ${SQLLINESIZE} tab off col tablespace_name for A25 col Total_MB for 999999999999 col Used_MB for 999999999999 col '%Used' for 999.99 comp sum of Total_MB on report comp sum of Used_MB on report bre on report select tablespace_name, (tablespace_size*$blksize)/(1024*1024) Total_MB, (used_space*$blksize)/(1024*1024) Used_MB, -- used_percent "%Used" ${HASHHTML} case when used_percent > 90 then '' || to_char(used_percent,999.99) || '' else to_char(used_percent,999.99) end as "%Used" ${HASHNONHTML} to_char(used_percent,999.99) "%Used" from dba_tablespace_usage_metrics; ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} PROMPT

${HASHHTML} PROMPT ASM STATISTICS ${HASHHTML} PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^ ${HASHNONHTML} PROMPT ASM STATISTICS: ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^ select name,state,OFFLINE_DISKS,total_mb,free_mb, ${HASHHTML} case when ROUND((1-(free_mb / total_mb))*100, 2) > 90 then '' || to_char(ROUND((1-(free_mb / total_mb))*100, 2),999.99) || '' else to_char(ROUND((1-(free_mb / total_mb))*100, 2),999.99) end as "%FULL" ${HASHNONHTML} to_char(ROUND((1-(free_mb / total_mb))*100, 2),999.99) "%FULL" from v\$asm_diskgroup; ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} PROMPT

${HASHHTML} PROMPT FRA STATISTICS ${HASHHTML} PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^ ${HASHNONHTML} PROMPT FRA STATISTICS: ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^ ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} PROMPT

${HASHHTML} PROMPT FRA SIZE ${HASHHTML} PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 ${HASHNONHTML} PROMPT ${HASHNONHTML} PROMPT FRA_SIZE: ${HASHNONHTML} PROMPT ^^^^^^^^^ col name for a35 SELECT NAME,NUMBER_OF_FILES,SPACE_LIMIT/1024/1024/1024 AS TOTAL_SIZE_GB,SPACE_USED/1024/1024/1024 SPACE_USED_GB, SPACE_RECLAIMABLE/1024/1024/1024 SPACE_RECLAIMABLE_GB,ROUND((SPACE_USED-SPACE_RECLAIMABLE)/SPACE_LIMIT * 100, 1) AS "%FULL_AFTER_CLAIM", ${HASHHTML} case when ROUND((SPACE_USED)/SPACE_LIMIT * 100, 1) > 90 then '' || to_char(ROUND((SPACE_USED)/SPACE_LIMIT * 100, 1),999.99) || '' else to_char(ROUND((SPACE_USED)/SPACE_LIMIT * 100, 1),999.99) end as "%FULL_NOW" ${HASHNONHTML} to_char(ROUND((SPACE_USED)/SPACE_LIMIT * 100, 1),999.99) "%FULL_NOW" FROM V\$RECOVERY_FILE_DEST; ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} PROMPT

${HASHHTML} PROMPT FRA COMPONENTS ${HASHHTML} PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 ${HASHNONHTML} PROMPT FRA_COMPONENTS: ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^ select * from v\$flash_recovery_area_usage; ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} PROMPT

${HASHHTML} PROMPT DATABASE GROWTH ${HASHHTML} PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^^ ${HASHNONHTML} PROMPT DATABASE GROWTH: [In the Last ~8 days] ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^^ ${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF set serveroutput on col SNAP_TIME for a45 col "Database Size(GB)" for 99999999999999999 Declare v_BaselineSize number(20); v_CurrentSize number(20); v_TotalGrowth number(20); v_Space number(20); cursor usageHist is select a.snap_id, SNAP_TIME, sum(TOTAL_SPACE_ALLOCATED_DELTA) over ( order by a.SNAP_ID) ProgSum from (select SNAP_ID, sum(SPACE_ALLOCATED_DELTA) TOTAL_SPACE_ALLOCATED_DELTA from DBA_HIST_SEG_STAT group by SNAP_ID having sum(SPACE_ALLOCATED_TOTAL) <> 0 order by 1 ) a, (select distinct SNAP_ID, to_char(END_INTERVAL_TIME,'DD-Mon-YYYY HH24:Mi') SNAP_TIME from DBA_HIST_SNAPSHOT) b where a.snap_id=b.snap_id; Begin select sum(SPACE_ALLOCATED_DELTA) into v_TotalGrowth from DBA_HIST_SEG_STAT; select sum(bytes) into v_CurrentSize from dba_segments; v_BaselineSize := (v_CurrentSize - v_TotalGrowth) ; dbms_output.put_line('SNAP_TIME Database Size(GB)'); for row in usageHist loop v_Space := (v_BaselineSize + row.ProgSum)/(1024*1024*1024); dbms_output.put_line(row.SNAP_TIME || ' ' || to_char(v_Space) ); end loop; end; / ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} PROMPT

${HASHHTML} PROMPT Active Incidents ${HASHHTML} PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 ${HASHNONHTML} PROMPT ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^^^ ${HASHNONHTML} PROMPT Active Incidents: ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^^^ set linesize ${SQLLINESIZE} col RECENT_PROBLEMS_1_WEEK_BACK for a45 select PROBLEM_KEY RECENT_PROBLEMS_1_WEEK_BACK,to_char(FIRSTINC_TIME,'DD-MON-YY HH24:mi:ss') FIRST_OCCURENCE,to_char(LASTINC_TIME,'DD-MON-YY HH24:mi:ss') LAST_OCCURENCE FROM V\$DIAG_PROBLEM WHERE LASTINC_TIME > SYSDATE -10; ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} PROMPT

${HASHHTML} PROMPT OUTSTANDING ALERTS ${HASHHTML} PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 ${HASHNONHTML} PROMPT ${HASHNONHTML} PROMPT OUTSTANDING ALERTS: ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^^^^ col CREATION_TIME for a40 col REASON for a80 select REASON,CREATION_TIME,METRIC_VALUE from DBA_OUTSTANDING_ALERTS; ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} PROMPT

${HASHHTML} PROMPT CORRUPTED BLOCKS ${HASHHTML} PROMPT


${HASHHTML} set pages 1000 ${HASHNONHTML} PROMPT ${HASHNONHTML} PROMPT CORRUPTED BLOCKS: ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^^ select * from V\$DATABASE_BLOCK_CORRUPTION; ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} PROMPT

${HASHHTML} PROMPT BLOCKED SESSIONS ${HASHHTML} PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 ${HASHNONHTML} PROMPT ${HASHNONHTML} PROMPT BLOCKED SESSIONS: ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^^ col module for a27 col event for a24 col MACHINE for a27 col "WA_ST|WAITD|ACT_SINC|LOG_T" for a38 col "INST|USER|SID,SERIAL#" for a30 col "INS|USER|SID,SER|MACHIN|MODUL" for a65 col "PREV|CURR SQLID" for a27 col "I|BLKD_BY" for a12 select /*+RULE*/ substr(s.INST_ID||'|'||s.USERNAME||'| '||s.sid||','||s.serial#||' |'||substr(s.MACHINE,1,22)||'|'||substr(s.MODULE,1,18),1,65)"INS|USER|SID,SER|MACHIN|MODUL" ,substr(w.state||'|'||round(w.WAIT_TIME_MICRO/1000000)||'|'||LAST_CALL_ET||'|'||to_char(LOGON_TIME,'ddMon'),1,38) "WA_ST|WAITD|ACT_SINC|LOG_T" ,substr(w.event,1,24) "EVENT" ,s.FINAL_BLOCKING_INSTANCE||'|'||s.FINAL_BLOCKING_SESSION "I|BLKD_BY" from gv\$session s, gv\$session_wait w where s.USERNAME is not null and s.FINAL_BLOCKING_SESSION is not null and s.sid=w.sid and s.STATUS='ACTIVE' order by "I|BLKD_BY" desc,w.event,"INS|USER|SID,SER|MACHIN|MODUL","WA_ST|WAITD|ACT_SINC|LOG_T" desc; ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} PROMPT

${HASHHTML} PROMPT UN-USABLE INDEXES ${HASHHTML} PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 ${HASHNONHTML} PROMPT ${HASHNONHTML} PROMPT UN-USABLE INDEXES: ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^^^ PROMPT col REBUILD_UNUSABLE_INDEXES for a190 ${HASHNONHTML} set echo on feedback on pages 1000 ${HASHNONHTML} select 'ALTER INDEX '||OWNER||'.'||INDEX_NAME||' REBUILD ONLINE;' REBUILD_UNUSABLE_INDEXES from dba_indexes where status='UNUSABLE'; ${HASHHTML} select OWNER,INDEX_NAME from dba_indexes where status='UNUSABLE'; ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} PROMPT

${HASHHTML} PROMPT INVALID OBJECTS ${HASHHTML} PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 ${HASHNONHTML} PROMPT ${HASHNONHTML} PROMPT INVALID OBJECTS: ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^ ${HASHNONHTML} PROMPT set pages 0 select 'alter package '||owner||'.'||object_name||' compile;' from dba_objects where status <> 'VALID' and object_type like '%PACKAGE%' union select 'alter type '||owner||'.'||object_name||' compile specification;' from dba_objects where status <> 'VALID' and object_type like '%TYPE%'union select 'alter '||object_type||' '||owner||'.'||object_name||' compile;' from dba_objects where status <> 'VALID' and object_type not in ('PACKAGE','PACKAGE BODY','SYNONYM','TYPE','TYPE BODY') union select 'alter public synonym '||object_name||' compile;' from dba_objects where status <> 'VALID' and object_type ='SYNONYM'; set pages 1000 ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} PROMPT

${HASHHTML} PROMPT RMAN BACKUP OPERATIONS ${HASHHTML} PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 ${HASHNONHTML} PROMPT ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^^^^^^^^ ${HASHNONHTML} PROMPT RMAN BACKUP OPERATIONS: [LAST 24H] ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^^^^^^^^ col START_TIME for a15 col END_TIME for a15 col TIME_TAKEN_DISPLAY for a10 col INPUT_BYTES_DISPLAY heading "DATA SIZE" for a10 col OUTPUT_BYTES_DISPLAY heading "Backup Size" for a11 col OUTPUT_BYTES_PER_SEC_DISPLAY heading "Speed/s" for a10 col output_device_type heading "Device_TYPE" for a11 SELECT to_char (start_time,'DD-MON-YY HH24:MI') START_TIME, to_char(end_time,'DD-MON-YY HH24:MI') END_TIME, time_taken_display, ${HASHHTML} case when status not in ('COMPLETED','RUNNING') then '' || to_char(status) || '' else to_char(status) end as "status", ${HASHNONHTML} status input_type, output_device_type,input_bytes_display, output_bytes_display, output_bytes_per_sec_display ,COMPRESSION_RATIO FROM v\$rman_backup_job_details WHERE end_time > sysdate -1; ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} ${HASHU}PROMPT

${HASHHTML} ${HASHU}PROMPT REPORT UNRECOVERABLE DATAFILES ${HASHHTML} ${HASHU}PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 ${HASHNONHTML} ${HASHU}PROMPT ${HASHNONHTML} ${HASHU}PROMPT ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ${HASHNONHTML} ${HASHU}PROMPT REPORT UNRECOVERABLE DATAFILES: ${HASHNONHTML} ${HASHU}PROMPT ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ${HASHU}spool off --${HASHU}host sed '/Spooling \|Recovery Manager\|RMAN>\|^$/d' ${LOG_DIR}/unrecoverable_DBfiles.log >> ${DB_HEALTHCHK_RPT} ${HASHU}host sed '/Spooling \|Recovery Manager\|RMAN>\|using \|Report \|^$/d' ${LOG_DIR}/unrecoverable_DBfiles.log >> ${DB_HEALTHCHK_RPT} --${HASHU}host ${HASHNOHTMLOS} sed '/Spooling \|Recovery Manager\|RMAN>\|^$/d' ${LOG_DIR}/unrecoverable_DBfiles.log >> ${DB_HEALTHCHK_RPT} --${HASHU}host ${HASHHTMLOS} sed '/Spooling \|Recovery Manager\|RMAN>\|using \|Report \|^$/d' ${LOG_DIR}/unrecoverable_DBfiles.log > ${LOG_DIR}/unrecoverable_DBfiles_FORMATTED.log --${HASHU}host ${HASHHTMLOS} awk 'BEGIN { print "

"} {print ""; for(i=1;i<=NF;i++)print ""; print ""} END{print "
" $i"
" }' ${LOG_DIR}/unrecoverable_DBfiles_FORMATTED.log > ${LOG_DIR}/unrecoverable_DBfiles_HTML.log --${HASHU}host ${HASHHTMLOS} cat ${LOG_DIR}/unrecoverable_DBfiles_HTML.log >> ${DB_HEALTHCHK_RPT} ${HASHU}spool ${DB_HEALTHCHK_RPT} app ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} ${HASHJ}PROMPT

${HASHHTML} ${HASHJ}PROMPT SCHEDULED JOBS STATUS ${HASHHTML} ${HASHJ}PROMPT


${HASHHTML} ${HASHJ}PROMPT

${HASHHTML} ${HASHJ}PROMPT DBMS_JOBS ${HASHHTML} ${HASHJ}PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 ${HASHNONHTML} ${HASHJ}PROMPT ${HASHNONHTML} ${HASHJ}PROMPT ^^^^^^^^^^^^^^^^^^^^^^ ${HASHNONHTML} ${HASHJ}PROMPT SCHEDULED JOBS STATUS: ${HASHNONHTML} ${HASHJ}PROMPT ^^^^^^^^^^^^^^^^^^^^^^ ${HASHNONHTML} ${HASHJ}PROMPT ${HASHNONHTML} ${HASHJ}PROMPT DBMS_JOBS: ${HASHNONHTML} ${HASHJ}PROMPT ^^^^^^^^^^ ${HASHJ}set linesize ${SQLLINESIZE} ${HASHJ}col LAST_RUN for a25 ${HASHJ}col NEXT_RUN for a25 ${HASHJ}select job,schema_user,failures,to_char(LAST_DATE,'DD-Mon-YYYY hh24:mi:ss')LAST_RUN,to_char(NEXT_DATE,'DD-Mon-YYYY hh24:mi:ss')NEXT_RUN from dba_jobs; ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} ${HASHJ}PROMPT

${HASHHTML} ${HASHJ}PROMPT DBMS_SCHEDULER ${HASHHTML} ${HASHJ}PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 ${HASHNONHTML} ${HASHJ}PROMPT ${HASHNONHTML} ${HASHJ}PROMPT DBMS_SCHEDULER: ${HASHNONHTML} ${HASHJ}PROMPT ^^^^^^^^^^^^^^^ ${HASHJ}col OWNER for a15 ${HASHJ}col JOB_NAME for a30 ${HASHJ}col STATE for a15 ${HASHJ}col FAILURE_COUNT for 9999 heading 'Fail' ${HASHJ}col "DURATION(d:hh:mm:ss)" for a22 ${HASHJ}col REPEAT_INTERVAL for a70 ${HASHJ}col "LAST_RUN || REPEAT_INTERVAL" for a65 ${HASHJ}col "DURATION(d:hh:mm:ss)" for a12 ${HASHJ}select JOB_NAME,OWNER,ENABLED,STATE, ${HASHJ} ${HASHHTML} case when FAILURE_COUNT > 0 then '' || to_char(FAILURE_COUNT,99999) || '' else to_char(FAILURE_COUNT,99999) end as "FAILURE_COUNT", ${HASHJ} ${HASHNONHTML} FAILURE_COUNT, ${HASHJ}to_char(LAST_START_DATE,'DD-Mon-YYYY hh24:mi:ss')||' || '||REPEAT_INTERVAL "LAST_RUN || REPEAT_INTERVAL", ${HASHJ}extract(day from last_run_duration) ||':'|| ${HASHJ}lpad(extract(hour from last_run_duration),2,'0')||':'|| ${HASHJ}lpad(extract(minute from last_run_duration),2,'0')||':'|| ${HASHJ}lpad(round(extract(second from last_run_duration)),2,'0') "DURATION(d:hh:mm:ss)" ${HASHJ}from dba_scheduler_jobs order by ENABLED,STATE; ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} ${HASHJ}PROMPT

${HASHHTML} ${HASHJ}PROMPT AUTOTASK INTERNAL MAINTENANCE WINDOWS ${HASHHTML} ${HASHJ}PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 ${HASHNONHTML} ${HASHJ}PROMPT ${HASHNONHTML} ${HASHJ}PROMPT AUTOTASK INTERNAL MAINTENANCE WINDOWS: ${HASHNONHTML} ${HASHJ}PROMPT ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ${HASHJ}col WINDOW_NAME for a17 ${HASHJ}col NEXT_RUN for a20 ${HASHJ}col ACTIVE for a6 ${HASHJ}col OPTIMIZER_STATS for a15 ${HASHJ}col SEGMENT_ADVISOR for a15 ${HASHJ}col SQL_TUNE_ADVISOR for a16 ${HASHJ}SELECT WINDOW_NAME,TO_CHAR(WINDOW_NEXT_TIME,'DD-MM-YYYY HH24:MI:SS') NEXT_RUN,AUTOTASK_STATUS STATUS,WINDOW_ACTIVE ACTIVE,OPTIMIZER_STATS,SEGMENT_ADVISOR,SQL_TUNE_ADVISOR FROM DBA_AUTOTASK_WINDOW_CLIENTS; ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} ${HASHJ}PROMPT

${HASHHTML} ${HASHJ}PROMPT Current Running Jobs ${HASHHTML} ${HASHJ}PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 ${HASHNONHTML} ${HASHJ}PROMPT ${HASHNONHTML} ${HASHJ}PROMPT Current Running Jobs: ${HASHNONHTML} ${HASHJ}PROMPT ^^^^^^^^^^^^^^^^^^^^ ${HASHJ}col INS for 999 ${HASHJ}col "JOB_NAME|OWNER|SPID|SID" for a55 ${HASHJ}col ELAPSED_TIME for a17 ${HASHJ}col CPU_USED for a17 ${HASHJ}col "WAIT_SEC" for 9999999999 ${HASHJ}col WAIT_CLASS for a15 ${HASHJ}col "BLKD_BY" for 9999999 ${HASHJ}col "WAITED|WCLASS|EVENT" for a45 ${HASHJ}select j.RUNNING_INSTANCE INS,j.JOB_NAME ||' | '|| j.OWNER||' |'||SLAVE_OS_PROCESS_ID||'|'||j.SESSION_ID"JOB_NAME|OWNER|SPID|SID" ${HASHJ},s.FINAL_BLOCKING_SESSION "BLKD_BY",ELAPSED_TIME,CPU_USED ${HASHJ},substr(s.SECONDS_IN_WAIT||'|'||s.WAIT_CLASS||'|'||s.EVENT,1,45) "WAITED|WCLASS|EVENT",S.SQL_ID ${HASHJ}from dba_scheduler_running_jobs j, gv\$session s ${HASHJ}where j.RUNNING_INSTANCE=S.INST_ID(+) ${HASHJ}and j.SESSION_ID=S.SID(+) ${HASHJ}order by "JOB_NAME|OWNER|SPID|SID",ELAPSED_TIME; ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} ${HASHJ}PROMPT

${HASHHTML} ${HASHJ}PROMPT FAILED DBMS_SCHEDULER JOBS IN THE LAST 24H ${HASHHTML} ${HASHJ}PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 ${HASHNONHTML} ${HASHJ}PROMPT ${HASHNONHTML} ${HASHJ}PROMPT FAILED DBMS_SCHEDULER JOBS IN THE LAST 24H: ${HASHNONHTML} ${HASHJ}PROMPT ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ${HASHJ}col LOG_DATE for a36 ${HASHJ}col OWNER for a15 ${HASHJ}col JOB_NAME for a35 ${HASHJ}col STATUS for a11 ${HASHJ}col RUN_DURATION for a20 ${HASHJ}col ID for 99 ${HASHJ}select INSTANCE_ID ID,JOB_NAME,OWNER,LOG_DATE,STATUS,ERROR#,RUN_DURATION from DBA_SCHEDULER_JOB_RUN_DETAILS where LOG_DATE > sysdate-1 and STATUS='FAILED' order by JOB_NAME,LOG_DATE; ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} PROMPT

${HASHHTML} PROMPT Queries Running For More Than [${LONG_RUN_QUR_HOURS}] Hours ${HASHHTML} PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ${HASHNONHTML} PROMPT Queries Running For More Than [${LONG_RUN_QUR_HOURS}] Hour: ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ col module for a30 col DURATION_HOURS for 99999.9 col STARTED_AT for a13 col "USERNAME| SID,SERIAL#" for a30 ${HASHNONHTML} col "SQL_ID | SQL_TEXT" for a120 select username||'| '||sid ||','|| serial# "USERNAME| SID,SERIAL#",substr(MODULE,1,30) "MODULE", to_char(sysdate-last_call_et/24/60/60,'DD-MON HH24:MI') STARTED_AT, last_call_et/60/60 "DURATION_HOURS" --||' | '|| (select SQL_FULLTEXT from v\$sql where address=sql_address) "SQL_ID | SQL_TEXT" ,SQL_ID from v\$session where username is not null and module is not null and module not in (${EXCLUDED_MODULES}) and last_call_et > 60*60*${LONG_RUN_QUR_HOURS} and status = 'ACTIVE'; ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} ${HASHSTA}PROMPT

${HASHHTML} ${HASHSTA}PROMPT ADVISORS STATUS ${HASHHTML} ${HASHSTA}PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^^ ${HASHNONHTML} PROMPT ADVISORS STATUS: ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^^ col ADVISOR_NAME for a60 col STATUS for a15 ${HASHSTA}SELECT client_name ADVISOR_NAME, status FROM dba_autotask_client ORDER BY client_name; ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} ${HASHSTA}PROMPT

${HASHHTML} ${HASHSTA}PROMPT SQL TUNING ADVISOR ${HASHHTML} ${HASHSTA}PROMPT


${HASHHTML} set pages 1000 ${HASHNONHTML} ${HASHSTA}PROMPT ${HASHNONHTML} ${HASHSTA}PROMPT ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ${HASHNONHTML} ${HASHSTA}PROMPT SQL TUNING ADVISOR: ${HASHNONHTML} ${HASHSTA}PROMPT ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} ${HASHSTA}PROMPT

${HASHHTML} ${HASHSTA}PROMPT Last Execution of SQL TUNING ADVISOR ${HASHHTML} ${HASHSTA}PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 ${HASHNONHTML} ${HASHSTA}PROMPT ${HASHNONHTML} ${HASHSTA}PROMPT Last Execution of SQL TUNING ADVISOR: ${HASHNONHTML} ${HASHSTA}PROMPT ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ${HASHSTA}col TASK_NAME for a60 ${HASHSTA}set long 2000000000 ${HASHSTA}SELECT task_name, status, TO_CHAR(execution_end,'DD-MON-YY HH24:MI') Last_Execution FROM dba_advisor_executions where TASK_NAME='SYS_AUTO_SQL_TUNING_TASK' and execution_end>sysdate-1; ${HASHSTA}variable Findings_Report CLOB; ${HASHSTA} BEGIN ${HASHSTA} :Findings_Report :=DBMS_SQLTUNE.REPORT_AUTO_TUNING_TASK( ${HASHSTA} begin_exec => NULL, ${HASHSTA} end_exec => NULL, ${HASHSTA} type => 'TEXT', ${HASHSTA} level => 'TYPICAL', ${HASHSTA} section => 'ALL', ${HASHSTA} object_id => NULL, ${HASHSTA} result_limit => NULL); ${HASHSTA} END; ${HASHSTA} / ${HASHSTA} print :Findings_Report ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} ${HASHMA}PROMPT

${HASHHTML} ${HASHMA}PROMPT MEMORY ADVISORS ${HASHHTML} ${HASHMA}PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 ${HASHNONHTML} PROMPT ${HASHNONHTML} PROMPT ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ${HASHNONHTML} PROMPT ORACLE MEMORY UTILIZATION: ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} PROMPT

${HASHHTML} PROMPT ORACLE MEMORY UTILIZATION ${HASHHTML} PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 col inst_id heading ins for 999 col COMPONENT for a35 col CURRENT_SIZE_MB for 99999999999 col MAX_SIZE_MB for 99999999999 select INST_ID,COMPONENT,USER_SPECIFIED_SIZE/1024/1024 USER_SPECIFIED_SIZE_MB,CURRENT_SIZE/1024/1024 CURRENT_SIZE_MB,MAX_SIZE/1024/1024 MAX_SIZE_MB from gv\$memory_dynamic_components where COMPONENT not like '%K buffer%' and COMPONENT not in ('ASM Buffer Cache','KEEP buffer cache','RECYCLE buffer cache','unified pga pool','Data Transfer Cache') order by COMPONENT,INST_ID; ${HASHNONHTML} ${HASHMA}PROMPT ${HASHNONHTML} ${HASHMA}PROMPT ${HASHNONHTML} ${HASHMA}PROMPT ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ${HASHNONHTML} ${HASHMA}PROMPT MEMORY ADVISORS: ${HASHNONHTML} ${HASHMA}PROMPT ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} ${HASHMA}PROMPT

${HASHHTML} ${HASHMA}PROMPT SGA ADVISOR ${HASHHTML} ${HASHMA}PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 ${HASHNONHTML} ${HASHMA}PROMPT ${HASHNONHTML} ${HASHMA}PROMPT SGA ADVISOR: ${HASHNONHTML} ${HASHMA}PROMPT ^^^^^^^^^^^^ ${HASHMA}col ESTD_DB_TIME for 99999999999999999 ${HASHMA}col ESTD_DB_TIME_FACTOR for 9999999999999999999999999999 ${HASHMA}select * from V\$SGA_TARGET_ADVICE where SGA_SIZE_FACTOR > .6 and SGA_SIZE_FACTOR < 1.6; ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} ${HASHMA}PROMPT

${HASHHTML} ${HASHMA}PROMPT Buffer Cache ADVISOR ${HASHHTML} ${HASHMA}PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 ${HASHNONHTML} ${HASHMA}PROMPT ${HASHNONHTML} ${HASHMA}PROMPT Buffer Cache ADVISOR: ${HASHNONHTML} ${HASHMA}PROMPT ^^^^^^^^^^^^^^^^^^^^^ ${HASHMA}col ESTD_SIZE_MB for 9999999999999 ${HASHMA}col ESTD_PHYSICAL_READS for 99999999999999999999 ${HASHMA}col ESTD_PHYSICAL_READ_TIME for 99999999999999999999 ${HASHMA}select SIZE_FACTOR "%SIZE",SIZE_FOR_ESTIMATE ESTD_SIZE_MB,ESTD_PHYSICAL_READS,ESTD_PHYSICAL_READ_TIME,ESTD_PCT_OF_DB_TIME_FOR_READS ${HASHMA}from V\$DB_CACHE_ADVICE where SIZE_FACTOR >.8 and SIZE_FACTOR<1.3; ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} ${HASHMA}PROMPT

${HASHHTML} ${HASHMA}PROMPT Shared Pool ADVISOR ${HASHHTML} ${HASHMA}PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 ${HASHNONHTML} ${HASHMA}PROMPT ${HASHNONHTML} ${HASHMA}PROMPT Shared Pool ADVISOR: ${HASHNONHTML} ${HASHMA}PROMPT ^^^^^^^^^^^^^^^^^^^^ ${HASHMA}col SIZE_MB for 99999999999 ${HASHMA}col SIZE_FACTOR for 99999999 ${HASHMA}col ESTD_SIZE_MB for 99999999999999999999 ${HASHMA}col LIB_CACHE_SAVED_TIME for 99999999999999999999999999 ${HASHMA}select SHARED_POOL_SIZE_FOR_ESTIMATE SIZE_MB,SHARED_POOL_SIZE_FACTOR "%SIZE",SHARED_POOL_SIZE_FOR_ESTIMATE/1024/1024 ESTD_SIZE_MB,ESTD_LC_TIME_SAVED LIB_CACHE_SAVED_TIME, ${HASHMA}ESTD_LC_LOAD_TIME PARSING_TIME from V\$SHARED_POOL_ADVICE ${HASHMA}where SHARED_POOL_SIZE_FACTOR > .9 and SHARED_POOL_SIZE_FACTOR < 1.6; ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} ${HASHMA}PROMPT

${HASHHTML} ${HASHMA}PROMPT PGA ADVISOR ${HASHHTML} ${HASHMA}PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 ${HASHNONHTML} ${HASHMA}PROMPT ${HASHNONHTML} ${HASHMA}PROMPT PGA ADVISOR: ${HASHNONHTML} ${HASHMA}PROMPT ^^^^^^^^^^^^ ${HASHMA}col SIZE_FACTOR for 999999999 ${HASHMA}col ESTD_SIZE_MB for 99999999999999999999 ${HASHMA}col MB_PROCESSED for 99999999999999999999 ${HASHMA}col ESTD_TIME for 99999999999999999999 ${HASHMA}select PGA_TARGET_FACTOR "%SIZE",PGA_TARGET_FOR_ESTIMATE/1024/1024 ESTD_SIZE_MB,BYTES_PROCESSED/1024/1024 MB_PROCESSED, ${HASHMA}ESTD_TIME,ESTD_PGA_CACHE_HIT_PERCENTAGE PGA_HIT,ESTD_OVERALLOC_COUNT PGA_SHORTAGE ${HASHMA}from V\$PGA_TARGET_ADVICE where PGA_TARGET_FACTOR > .7 and PGA_TARGET_FACTOR < 1.6; ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} ${HASHSA}PROMPT

${HASHHTML} ${HASHSA}PROMPT SEGMENT ADVISOR ${HASHHTML} ${HASHSA}PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 ${HASHNONHTML} ${HASHSA}PROMPT ${HASHNONHTML} ${HASHSA}PROMPT SEGMENT ADVISOR: ${HASHNONHTML} ${HASHSA}PROMPT ^^^^^^^^^^^^^^^^ ${HASHSA}select'Task Name : ' || f.task_name || chr(10) || ${HASHSA}'Start Run Time : ' || TO_CHAR(execution_start, 'dd-mon-yy hh24:mi') || chr (10) || ${HASHSA}'Segment Name : ' || o.attr2 || chr(10) || ${HASHSA}'Segment Type : ' || o.type || chr(10) || ${HASHSA}'Partition Name : ' || o.attr3 || chr(10) || ${HASHSA}'Message : ' || f.message || chr(10) || ${HASHSA}'More Info : ' || f.more_info || chr(10) || ${HASHSA}'-------------------------------------------' Advice ${HASHSA}FROM dba_advisor_findings f ${HASHSA},dba_advisor_objects o ${HASHSA},dba_advisor_executions e ${HASHSA}WHERE o.task_id = f.task_id ${HASHSA}AND o.object_id = f.object_id ${HASHSA}AND f.task_id = e.task_id ${HASHSA}AND e. execution_start > sysdate - 1 ${HASHSA}AND e.advisor_name = 'Segment Advisor' ${HASHSA}ORDER BY f.task_name; ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^^^^^^^^ ${HASHNONHTML} PROMPT TOP FRAGMENTED TABLES: ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^^^^^^^^ ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} PROMPT

${HASHHTML} PROMPT TOP FRAGMENTED TABLES ${HASHHTML} PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 col "%RECLAIMABLE_SPACE" for 99 col owner for a30 col "%FRAGMENTED_SPACE" for a17 col LAST_ANALYZED for a13 select * from (select owner,table_name,to_char(LAST_ANALYZED, 'DD-MON-YYYY') LAST_ANALYZED, round(blocks * ${blksize}/1024/1024) "FULL_SIZE_MB", round(num_rows * avg_row_len/1024/1024) "ACTUAL_SIZE_MB", round(blocks * ${blksize}/1024/1024) - round(num_rows * avg_row_len/1024/1024) "FRAGMENTED_SPACE_MB", round(((round((blocks * ${blksize}/1024/1024)) - round((num_rows * avg_row_len/1024/1024))) / round((blocks * ${blksize}/1024/1024))) * 100)||'%' "%FRAGMENTED_SPACE" from dba_tables where blocks>10 -- Exclude SYS objects: and owner <> 'SYS' and round(blocks * ${blksize}/1024/1024) > 10 -- Fragmented Space must be > 30%: and ((round((blocks * ${blksize}/1024/1024)) - round((num_rows * avg_row_len/1024/1024))) / round((blocks * ${blksize}/1024/1024))) * 100 > 30 order by "FRAGMENTED_SPACE_MB" desc) where rownum<11; PROMPT Hint: The accuracy of the FRAGMENTED TABLES list depends on having a recent STATISTICS. ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} PROMPT

${HASHHTML} PROMPT CURRENT OS / HARDWARE STATISTICS ${HASHHTML} PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ${HASHNONHTML} PROMPT CURRENT OS / HARDWARE STATISTICS: ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ select stat_name,value from v\$osstat; ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} PROMPT

${HASHHTML} PROMPT RESOURCE LIMIT ${HASHHTML} PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 ${HASHNONHTML} PROMPT ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^ ${HASHNONHTML} PROMPT RESOURCE LIMIT: ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^ col INITIAL_ALLOCATION for a20 col LIMIT_VALUE for a20 col RESOURCE_NAME for a40 select * from gv\$resource_limit order by RESOURCE_NAME; ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} PROMPT

${HASHHTML} PROMPT RECYCLEBIN OBJECTS# ${HASHHTML} PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 ${HASHNONHTML} PROMPT ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^^^^^^ ${HASHNONHTML} PROMPT RECYCLEBIN OBJECTS#: [Purging DBA_RECYCLEBIN can boost the performance of X$ tables] ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^^^^^^ col "RECYCLED_OBJECTS#" for 999999999999999999 col "TOTAL_SIZE_MB" for 99999999999999 set feedback off select ${HASHHTML} case when count(*) > 1000 then '' || to_char(count(*)) || '' else to_char(count(*)) end as "RECYCLED_OBJECTS#", ${HASHNONHTML} count(*) "RECYCLED_OBJECTS#", ${HASHHTML} case when sum(space)*${blksize}/1024/1024 > 1024 then '' || to_char(sum(space)*${blksize}/1024/1024) || '' else to_char(sum(space)*${blksize}/1024/1024) end as "TOTAL_SIZE_MB" ${HASHNONHTML} sum(space)*${blksize}/1024/1024 "TOTAL_SIZE_MB" from dba_recyclebin group by 1; set feedback on ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} PROMPT

${HASHHTML} PROMPT FLASHBACK RESTORE POINTS ${HASHHTML} PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 ${HASHNONHTML} PROMPT ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^^^^^^^^^^^ ${HASHNONHTML} PROMPT FLASHBACK RESTORE POINTS: ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^^^^^^^^^^^ col SCN for 999999999999999999 col time for a35 col RESTORE_POINT_TIME for a35 col name for a40 select NAME,SCN,TIME,STORAGE_SIZE/1024/1024/1024 STORAGE_SIZE_GB from v\$restore_point; ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} PROMPT

${HASHHTML} PROMPT HEALTH MONITOR ${HASHHTML} PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 ${HASHNONHTML} PROMPT ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^ ${HASHNONHTML} PROMPT HEALTH MONITOR: ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^ col DESCRIPTION for a80 col repair_script for a80 select name,type,status,description,repair_script from V\$HM_RECOMMENDATION where time_detected > sysdate -1; ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} PROMPT

${HASHHTML} PROMPT Monitored INDEXES ${HASHHTML} PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^^^^ ${HASHNONHTML} PROMPT Monitored INDEXES: ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^^^^ set linesize ${SQLLINESIZE} pages 1000 col Index_NAME for a40 col TABLE_NAME for a40 select io.name Index_NAME, t.name TABLE_NAME,decode(bitand(i.flags, 65536),0,'NO','YES') Monitoring, decode(bitand(ou.flags, 1),0,'NO','YES') USED,ou.start_monitoring,ou.end_monitoring from sys.obj$ io,sys.obj$ t,sys.ind$ i,sys.object_usage ou where i.obj# = ou.obj# and io.obj# = ou.obj# and t.obj# = i.bo#; --PROMPT --PROMPT To stop monitoring USED indexes use this command: --prompt select 'ALTER INDEX RA.'||io.name||' NOMONITORING USAGE;' from sys.obj$ io,sys.obj$ t,sys.ind$ i,sys.object_usage ou where i.obj# = ou.obj# and io.obj# = ou.obj# and t.obj# = i.bo# --prompt and decode(bitand(i.flags, 65536),0,'NO','YES')='YES' and decode(bitand(ou.flags, 1),0,'NO','YES')='YES' order by 1 --prompt / ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} PROMPT

${HASHHTML} PROMPT REDO LOG SWITCHES ${HASHHTML} PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 ${HASHNONHTML} PROMPT ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^^^^ ${HASHNONHTML} PROMPT REDO LOG SWITCHES: ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^^^^ set linesize ${SQLLINESIZE} col day for a11 SELECT to_char(first_time,'YYYY-MON-DD') day, to_char(sum(decode(to_char(first_time,'HH24'),'00',1,0)),'9999') "00", to_char(sum(decode(to_char(first_time,'HH24'),'01',1,0)),'9999') "01", to_char(sum(decode(to_char(first_time,'HH24'),'02',1,0)),'9999') "02", to_char(sum(decode(to_char(first_time,'HH24'),'03',1,0)),'9999') "03", to_char(sum(decode(to_char(first_time,'HH24'),'04',1,0)),'9999') "04", to_char(sum(decode(to_char(first_time,'HH24'),'05',1,0)),'9999') "05", to_char(sum(decode(to_char(first_time,'HH24'),'06',1,0)),'9999') "06", to_char(sum(decode(to_char(first_time,'HH24'),'07',1,0)),'9999') "07", to_char(sum(decode(to_char(first_time,'HH24'),'08',1,0)),'9999') "08", to_char(sum(decode(to_char(first_time,'HH24'),'09',1,0)),'9999') "09", to_char(sum(decode(to_char(first_time,'HH24'),'10',1,0)),'9999') "10", to_char(sum(decode(to_char(first_time,'HH24'),'11',1,0)),'9999') "11", to_char(sum(decode(to_char(first_time,'HH24'),'12',1,0)),'9999') "12", to_char(sum(decode(to_char(first_time,'HH24'),'13',1,0)),'9999') "13", to_char(sum(decode(to_char(first_time,'HH24'),'14',1,0)),'9999') "14", to_char(sum(decode(to_char(first_time,'HH24'),'15',1,0)),'9999') "15", to_char(sum(decode(to_char(first_time,'HH24'),'16',1,0)),'9999') "16", to_char(sum(decode(to_char(first_time,'HH24'),'17',1,0)),'9999') "17", to_char(sum(decode(to_char(first_time,'HH24'),'18',1,0)),'9999') "18", to_char(sum(decode(to_char(first_time,'HH24'),'19',1,0)),'9999') "19", to_char(sum(decode(to_char(first_time,'HH24'),'20',1,0)),'9999') "20", to_char(sum(decode(to_char(first_time,'HH24'),'21',1,0)),'9999') "21", to_char(sum(decode(to_char(first_time,'HH24'),'22',1,0)),'9999') "22", to_char(sum(decode(to_char(first_time,'HH24'),'23',1,0)),'9999') "23" from gv\$log_history where first_time > sysdate-1 GROUP by to_char(first_time,'YYYY-MON-DD') order by 1 asc; ${HASHHTML} PROMPT
${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} PROMPT

${HASHHTML} PROMPT Modified Parameters Since The Instance Startup ${HASHHTML} PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 ${HASHNONHTML} PROMPT ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ${HASHNONHTML} PROMPT Modified Parameters Since The Instance Startup: ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ col INS for 999 col name for a45 col VALUE for a80 col DEPRECATED for a10 select INST_ID INS,NAME,VALUE,ISDEFAULT "DEFAULT",ISDEPRECATED "DEPRECATED" from gv\$parameter where ISMODIFIED = 'SYSTEM_MOD' order by 1; ${HASHHTML} PROMPT
${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} ${HASHCRD}PROMPT

${HASHHTML} ${HASHCRD}PROMPT Cred Backup ${HASHHTML} ${HASHCRD}PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 ${HASHNONHTML} ${HASHCRD}PROMPT ${HASHNONHTML} ${HASHCRD}PROMPT ^^^^^^^^^^^^ ${HASHNONHTML} ${HASHCRD}PROMPT Cred Backup: ${HASHNONHTML} ${HASHCRD}PROMPT ^^^^^^^^^^^^ ${HASHCRD}col name for a35 ${HASHCRD}col HASH for a35 ${HASHCRD}col CREATION_DATE for a20 ${HASHCRD}col PASSWORD_LAST_CHANGED for a30 ${HASHCRD}col "CREATE_DATE||PASS_LAST_CHANGE" for a60 ${HASHNONHTML} ${HASHCRD}select name,PASSWORD HASH,CTIME ||' || '||PTIME "CREATE_DATE||PASS_LAST_CHANGE" from user\$ where PASSWORD is not null order by 1; ${HASHHTML} ${HASHCRD}select name,PASSWORD HASH,CTIME "CREATION_DATE",PTIME "PASSWORD_LAST_CHANGED" from user\$ where PASSWORD is not null order by 1; spool off exit; EOF ) fi # ################################################# # Reporting New Created Objects in the last 24Hours: # ################################################# NEWOBJCONTRAW=$(${ORACLE_HOME}/bin/sqlplus -S "/ as sysdba" << EOF set pages 0 feedback off echo off; select count(*) from dba_objects where created > sysdate-1 and owner <> 'SYS'; exit; EOF ) NEWOBJCONT=`echo ${NEWOBJCONTRAW} | awk '{print $NF}'` if [[ ${NEWOBJCONT} -ge ${NEWOBJCONTTHRESHOLD} ]] then VALNEWOBJCONT=$(${ORACLE_HOME}/bin/sqlplus -S "/ as sysdba" << EOF set linesize ${SQLLINESIZE} pages 1000 -- Enable HTML color format: ${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF spool ${DB_HEALTHCHK_RPT} app ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} PROMPT

${HASHHTML} PROMPT New Created objects [Last 24H] ${HASHHTML} PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 ${HASHNONHTML} prompt ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ${HASHNONHTML} prompt New Created objects [Last 24H] ... ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ${HASHNONHTML} prompt col owner for a30 col object_name for a30 col object_type for a19 col created for a20 select object_type,owner,object_name,to_char(created, 'DD-Mon-YYYY HH24:MI:SS') CREATED from dba_objects where created > sysdate-1 and owner <> 'SYS' order by owner,object_type; spool off exit; EOF ) fi # ############################################### # Reporting Modified Objects in the last 24Hours: # ############################################### MODOBJCONTRAW=$(${ORACLE_HOME}/bin/sqlplus -S "/ as sysdba" << EOF set pages 0 feedback off echo off; select count(*) from dba_objects where LAST_DDL_TIME > sysdate-1 and owner <> 'SYS'; exit; EOF ) MODOBJCONT=`echo ${MODOBJCONTRAW} | awk '{print $NF}'` if [[ ${MODOBJCONT} -ge ${MODOBJCONTTHRESHOLD} ]] then VALMODOBJCONT=$(${ORACLE_HOME}/bin/sqlplus -S "/ as sysdba" << EOF set linesize ${SQLLINESIZE} pages 1000 -- Enable HTML color format: ${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF spool ${DB_HEALTHCHK_RPT} app ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} PROMPT

${HASHHTML} PROMPT Modified objects in the Last 24H ${HASHHTML} PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 ${HASHNONHTML} prompt ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ${HASHNONHTML} prompt Modified objects in the Last 24H ... ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ${HASHNONHTML} prompt col owner for a30 col object_name for a30 col object_type for a19 col LAST_DDL_TIME for a20 select object_type,owner,object_name,to_char(LAST_DDL_TIME, 'DD-Mon-YYYY HH24:MI:SS') LAST_DDL_TIME from dba_objects where LAST_DDL_TIME > sysdate-1 and owner <> 'SYS' order by owner,object_type; spool off exit; EOF ) fi # ############################################### # Checking AUDIT RECORDS ON THE DATABASE: # ############################################### # Check if Checking Audit Records is ENABLED: case ${CHKAUDITRECORDS} in Y|y|YES|Yes|yes|ON|On|on) VAL70=$(${ORACLE_HOME}/bin/sqlplus -S "/ as sysdba" << EOF set pages 0 feedback off echo off; SELECT (SELECT COUNT(*) FROM dba_audit_trail where ACTION_NAME not like 'LOGO%' and ACTION_NAME not in ('SELECT','SET ROLE') and timestamp > SYSDATE-1) + (SELECT COUNT(*) FROM DBA_AUDIT_SESSION WHERE timestamp > SYSDATE-1 and returncode = 1017) + (SELECT COUNT(*) FROM dba_fga_audit_trail WHERE timestamp > SYSDATE-1) + (SELECT COUNT(*) FROM dba_objects where created > sysdate-1 and owner <> 'SYS') AUD_REC_COUNT FROM dual; exit; EOF ) VAL80=`echo ${VAL70} | awk '{print $NF}'` if [[ ${VAL80} -ge ${AUDITRECOTHRESHOLD} ]] then VAL90=$(${ORACLE_HOME}/bin/sqlplus -S "/ as sysdba" << EOF set linesize ${SQLLINESIZE} pages 1000 -- Enable HTML color format: ${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF spool ${LOG_DIR}/audit_records.log SET TIMING ON col OS_USERNAME for a20 col EXTENDED_TIMESTAMP for a36 col OWNER for a25 col OBJ_NAME for a25 col OS_USERNAME for a20 col USERNAME for a25 col USERHOST for a35 col ACTION_NAME for a25 col ACTION_OWNER_OBJECT for a55 col TERMINAL for a30 col ACTION_NAME for a20 col TIMESTAMP for a21 ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} PROMPT

${HASHHTML} PROMPT Failed Login Attempts in the last 24Hours ${HASHHTML} PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 ${HASHNONHTML} prompt ${HASHNONHTML} prompt ${HASHNONHTML} prompt ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ${HASHNONHTML} prompt Failed Login Attempts in the last 24Hours ... ${HASHNONHTML} prompt ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ${HASHNONHTML} prompt select to_char (EXTENDED_TIMESTAMP,'DD-MON-YYYY HH24:MI:SS') TIMESTAMP,OS_USERNAME,USERNAME,TERMINAL,USERHOST,ACTION_NAME from DBA_AUDIT_SESSION where timestamp > (sysdate -1) and returncode = 1017 order by 1; ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} PROMPT

${HASHHTML} PROMPT Audit records in the last 24Hours AUD$ ${HASHHTML} PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 ${HASHNONHTML} prompt ${HASHNONHTML} prompt ${HASHNONHTML} prompt ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ${HASHNONHTML} prompt Audit records in the last 24Hours AUD$... ${HASHNONHTML} prompt ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ${HASHNONHTML} prompt select extended_timestamp,OS_USERNAME,USERNAME,USERHOST,ACTION_NAME||' '||OWNER||' . '||OBJ_NAME ACTION_OWNER_OBJECT from dba_audit_trail where timestamp > SYSDATE-1 and ACTION_NAME not like 'LOGO%' and ACTION_NAME not in ('SELECT','SET ROLE') -- and USERNAME not in ('CRS_ADMIN','DBSNMP') -- and OS_USERNAME not in ('workflow') -- and OBJ_NAME not like '%TMP_%' -- and OBJ_NAME not like 'WRKDETA%' -- and OBJ_NAME not in ('PBCATTBL','SETUP','WRKIB','REMWORK') order by EXTENDED_TIMESTAMP; ${HASHHTML} SET PAGES 0 ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHHTML} PROMPT

${HASHHTML} PROMPT Fine Grained Auditing Data ${HASHHTML} PROMPT


${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHHTML} set pages 1000 ${HASHNONHTML} prompt ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^^^^^^^^^^^^ ${HASHNONHTML} prompt Fine Grained Auditing Data ... ${HASHNONHTML} PROMPT ^^^^^^^^^^^^^^^^^^^^^^^^^^ ${HASHNONHTML} prompt col sql_text for a70 col time for a36 col USERHOST for a21 col db_user for a15 select to_char(timestamp,'DD-MM-YYYY HH24:MI:SS') as time,db_user,userhost,sql_text,SQL_BIND from dba_fga_audit_trail where timestamp > SYSDATE-1 -- and policy_name='PAYROLL_TABLE' order by EXTENDED_TIMESTAMP; ${HASHDORM} ${HASHHTML} SET PAGES 0 ${HASHDORM} ${HASHHTML} SET MARKUP HTML OFF SPOOL OFF ${HASHDORM} ${HASHHTML} PROMPT

${HASHDORM} ${HASHHTML} PROMPT Dormant Accounts: [Accounts that did not login in the last ${DORMANT_INACTIVE_DAYS} days] ${HASHDORM} ${HASHHTML} PROMPT


${HASHDORM} ${HASHHTML} SET WRAP OFF ECHO OFF FEEDBACK OFF MARKUP HTML ON SPOOL ON HEAD ' ' TABLE "border='2' bordercolor='#E67E22'" ENTMAP OFF ${HASHDORM} ${HASHHTML} set pages 1000 ${HASHDORM} ${HASHNONHTML} prompt ${HASHDORM} ${HASHNONHTML} prompt ${HASHDORM} ${HASHNONHTML} prompt ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ${HASHDORM} ${HASHNONHTML} prompt Dormant Accounts: [Accounts that did not login in the last ${DORMANT_INACTIVE_DAYS} days] ... ${HASHDORM} ${HASHNONHTML} prompt ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ${HASHDORM} ${HASHNONHTML} prompt ${HASHDORM} select userid,max(ntimestamp#) LAST_LOGIN_DATE from aud$ where ntimestamp# < (sysdate - ${DORMANT_INACTIVE_DAYS}) group by userid order by LAST_LOGIN_DATE; spool off exit; EOF ) cat ${LOG_DIR}/audit_records.log >> ${DB_HEALTHCHK_RPT} fi ;; esac # Remove odd lines from the report: sed -i 's/^rows will be truncated//g' ${DB_HEALTHCHK_RPT} export LOGFILE=${DB_HEALTHCHK_RPT} export MSGSUBJECT="HEALTH CHECK REPORT: For Database [${DB_NAME_UPPER}] on Server [${SRV_NAME}]" echo ${MSGSUBJECT} ${MAILEXEC} "${MSGSUBJECT}" ${MAIL_LIST} < ${LOGFILE} ( echo "To: ${EMAIL};" echo "MIME-Version: 1.0" echo "Content-Type: text/html;" echo "Subject: ${MSGSUBJECT}" cat ${LOGFILE} ) | ${SENDMAIL} echo "HEALTH CHECK REPORT FOR DATABASE [${DB_NAME_UPPER}] WAS SAVED TO: ${DB_HEALTHCHK_RPT}" done echo "" # ############################# # De-Neutralize login.sql file: [Bug Fix] # ############################# # If login.sql was renamed during the execution of the script revert it back to its original name: if [[ -f ${USR_ORA_HOME}/login.sql_NeutralizedBy${SCRIPT_NAME} ]] then mv ${USR_ORA_HOME}/login.sql_NeutralizedBy${SCRIPT_NAME} ${USR_ORA_HOME}/login.sql fi # ############# # END OF SCRIPT # ############# # REPORT BUGS to: mahmmoudadel@hotmail.com # DOWNLOAD THE LATEST VERSION OF DATABASE ADMINISTRATION BUNDLE FROM: # http://dba-tips.blogspot.com/2014/02/oracle-database-administration-scripts.html # DISCLAIMER: THIS SCRIPT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT WITHOUT ANY WARRANTY. IT IS PROVIDED "AS IS".