dba:oracle:scripts:check_remote_oracle
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revision | |||
dba:oracle:scripts:check_remote_oracle [2023/01/31 08:28] – removed - external edit (Unknown date) 127.0.0.1 | dba:oracle:scripts:check_remote_oracle [2023/01/31 08:28] (current) – ↷ Page moved from dba:oracle:check_remote_oracle to dba:oracle:scripts:check_remote_oracle dodger | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== [SCRIPT] Nagios check plugin for oracle ====== | ||
+ | ====== Description ====== | ||
+ | Script used as plugin for Nagios to remotely check Oracle. | ||
+ | This script is a complete rewrite of [[http:// | ||
+ | |||
+ | ====== Instructions ====== | ||
+ | ===== Install ===== | ||
+ | Download script code and copy to your nagios plugins home, for example: | ||
+ | < | ||
+ | |||
+ | Then you'll have to add it to nagios and enable checks through it. | ||
+ | |||
+ | ===== Configuration ===== | ||
+ | Required variables (not passed through CLI): | ||
+ | ^ Variable ^ Default value ^ Description ^ | ||
+ | | <code sql> | ||
+ | | <code sql> | ||
+ | |||
+ | You can create the NAGIOS user issuing the following commands: | ||
+ | <code SQL> | ||
+ | CREATE USER " | ||
+ | PROFILE " | ||
+ | IDENTIFIED BY " | ||
+ | TEMPORARY TABLESPACE " | ||
+ | ACCOUNT UNLOCK ; | ||
+ | |||
+ | grant CONNECT, SELECT_CATALOG_ROLE to " | ||
+ | </ | ||
+ | |||
+ | Control specific grants: | ||
+ | * SGA: | ||
+ | <code sql> | ||
+ | GRANT SELECT ON SYS.V_$SGASTAT TO VOXELADMIN ; | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | For a better understand of the usage, this script will do something like: | ||
+ | <code bash> | ||
+ | ssh ora01.ciberterminal.net | ||
+ | sqlplus ' | ||
+ | SELECT 1+1 FROM DUAL; | ||
+ | </ | ||
+ | |||
+ | **Note**: This user is not user in the // | ||
+ | |||
+ | ===== Testing ===== | ||
+ | You can test it by executing it: | ||
+ | <code bash> | ||
+ | bash check_remote_oracle | ||
+ | </ | ||
+ | |||
+ | I will show the instructions: | ||
+ | <code > | ||
+ | $ bash check_remote_oracle | ||
+ | Usage: | ||
+ | ./ | ||
+ | ./ | ||
+ | ./ | ||
+ | ./ | ||
+ | ./ | ||
+ | ./ | ||
+ | ./ | ||
+ | ./ | ||
+ | ./ | ||
+ | ./ | ||
+ | ./ | ||
+ | ./ | ||
+ | ./ | ||
+ | ./ | ||
+ | </ | ||
+ | |||
+ | For example, checking the statistics of the dataguard: | ||
+ | <code bash> | ||
+ | $ bash check_remote_oracle -H scan01.ciberterminal.net --sessions | ||
+ | OK - DBSID Concurrent Active Sessions Count: 4 |Sessions=4; | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Check Descriptions ===== | ||
+ | ==== --tns ==== | ||
+ | Check remote TNS server, that is: '' | ||
+ | ==== --db ==== | ||
+ | Check remote database (search /bin/ps for PMON process) | ||
+ | ==== --login ==== | ||
+ | Attempt a dummy login and alert if not ORA-01017: invalid username/ | ||
+ | ==== --sessions ==== | ||
+ | Check remote database concurrent active sessions: | ||
+ | <code SQL> | ||
+ | select count(SES.SID) | ||
+ | from V$SESSION SES, V$SQLAREA SQL, V$SESSION_WAIT WA, V$PROCESS P | ||
+ | where SES.STATUS=' | ||
+ | AND SES.SQL_ID=SQL.SQL_ID | ||
+ | AND SES.SID=WA.SID | ||
+ | and SES.paddr=p.addr | ||
+ | and UPPER(SES.USERNAME) not in ( ' | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | ==== --cache ==== | ||
+ | Check remote database for library and buffer cache hit ratios: | ||
+ | <code SQL> | ||
+ | SELECT (1-(pr.value/ | ||
+ | from v$sysstat pr, v$sysstat dbg, v$sysstat cg | ||
+ | where pr.name=' | ||
+ | and dbg.name=' | ||
+ | and cg.name=' | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | ==== --parsing ==== | ||
+ | Check remote database for Soft/Hard parse ratios: | ||
+ | <code SQL> | ||
+ | SELECT VALUE FROM V$SYSSTAT WHERE NAME = 'parse count (total)' | ||
+ | SELECT VALUE FROM V$SYSSTAT WHERE NAME = 'parse count (hard)' | ||
+ | SELECT VALUE FROM V$SYSSTAT WHERE NAME = 'parse count (failures)' | ||
+ | SELECT VALUE FROM V$SYSSTAT WHERE NAME = 'parse count (describe)' | ||
+ | </ | ||
+ | |||
+ | ==== --tablespace ==== | ||
+ | Check remote database for **< | ||
+ | <code SQL> | ||
+ | SELECT | ||
+ | REAL_FREE_MB FREE_MB | ||
+ | FROM ( | ||
+ | SELECT MAXUSAGE.TABLESPACE_NAME, | ||
+ | MAXUSAGE.MAX_MB, | ||
+ | CASE WHEN MAXUSAGE.ACTUAL_DATAFILE_MB < MAXUSAGE.MAX_MB THEN | ||
+ | MAX_MB-(ACTUAL_DATAFILE_MB-FREE_MB) | ||
+ | ELSE | ||
+ | FREE_MB | ||
+ | END REAL_FREE_MB | ||
+ | FROM | ||
+ | ( | ||
+ | select TABLESPACE_NAME, | ||
+ | SUM(case when MAXBYTES > 0 then MAXBYTES else BYTES END)/ | ||
+ | SUM(BYTES)/ | ||
+ | FROM DBA_DATA_FILES | ||
+ | GROUP BY TABLESPACE_NAME | ||
+ | ) MAXUSAGE, | ||
+ | ( | ||
+ | select TABLESPACE_NAME, | ||
+ | FROM dba_free_space | ||
+ | GROUP BY TABLESPACE_NAME | ||
+ | ) FREEUSAGE | ||
+ | WHERE MAXUSAGE.TABLESPACE_NAME=FREEUSAGE.TABLESPACE_NAME | ||
+ | AND MAXUSAGE.TABLESPACE_NAME = '< | ||
+ | ) | ||
+ | ; | ||
+ | </ | ||
+ | ==== --undo ==== | ||
+ | Check remote database for **UNDO** usage : | ||
+ | <code SQL> | ||
+ | select | ||
+ | TOTALSPACE.TOTAL-NVL(USEDSPACE.USED, | ||
+ | FROM ( | ||
+ | SELECT TABLESPACE_NAME, | ||
+ | FROM DBA_DATA_FILES WHERE TABLESPACE_NAME = (SELECT value FROM V\\\$parameter WHERE name = ' | ||
+ | GROUP BY TABLESPACE_NAME | ||
+ | ) TOTALSPACE | ||
+ | LEFT OUTER JOIN | ||
+ | ( | ||
+ | SELECT TABLESPACE_NAME, | ||
+ | FROM DBA_UNDO_EXTENTS | ||
+ | WHERE (STATUS=' | ||
+ | AND TABLESPACE_NAME = (SELECT value FROM V\\\$parameter WHERE name = ' | ||
+ | GROUP BY TABLESPACE_NAME | ||
+ | ) USEDSPACE | ||
+ | ON TOTALSPACE.TABLESPACE_NAME=USEDSPACE.TABLESPACE_NAME | ||
+ | ; | ||
+ | </ | ||
+ | ==== --diskgroup ==== | ||
+ | Check remote database for **< | ||
+ | <code SQL> | ||
+ | SELECT TOTAL_MB, NVL(FREE_MB, | ||
+ | FROM V$ASM_DISKGROUP | ||
+ | WHERE NAME='< | ||
+ | </ | ||
+ | |||
+ | ==== --dgstats ==== | ||
+ | Dataguard statistics (Apply & Transport Lag). | ||
+ | This check is done **ON THE STANDBY** (the master does not have information on **V$DATAGUARD_STATS**. | ||
+ | So ORACLE_SID and HOSTNAME must be the STANDBY ones. | ||
+ | |||
+ | <code SQL> | ||
+ | SELECT * FROM V$DATAGUARD_STATS WHERE NAME LIKE ' | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== --redogen ==== | ||
+ | Daily REDO generation statistics. | ||
+ | Something like that: | ||
+ | <code SQL> | ||
+ | SELECT A.DAY, Round(A.COUNT# | ||
+ | FROM | ||
+ | ( | ||
+ | SELECT To_Char(First_Time,' | ||
+ | FROM v$log_history | ||
+ | GROUP BY To_Char(First_Time,' | ||
+ | ORDER BY 1 DESC | ||
+ | ) A, | ||
+ | ( | ||
+ | SELECT Avg(BYTES) AVG# | ||
+ | FROM v$log | ||
+ | ) B | ||
+ | ORDER BY DAY | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | ====== Script code ====== | ||
+ | <file bash check_remote_oracle> | ||
+ | #! /bin/bash | ||
+ | # | ||
+ | # latigid010@yahoo.com | ||
+ | # 01/06/2000 | ||
+ | # | ||
+ | # enricm@gmail.com | ||
+ | # 16/04/2012 | ||
+ | # | ||
+ | # dodger@ciberterminal.net | ||
+ | # 03/10/2013: Complete rewrite of this f*****shit | ||
+ | # | ||
+ | # This Nagios plugin was created to check Oracle status on a remote site through SSH | ||
+ | # | ||
+ | |||
+ | |||
+ | ######################################################################## | ||
+ | # | ||
+ | # CONSTANTS | ||
+ | # | ||
+ | ######################################################################## | ||
+ | |||
+ | # EXIT STATUS | ||
+ | STATE_OK=0 | ||
+ | STATE_WARNING=1 | ||
+ | STATE_CRITICAL=2 | ||
+ | STATE_UNKNOWN=3 | ||
+ | STATE_DEPENDENT=4 | ||
+ | # /EXIT STATUS | ||
+ | |||
+ | REVISION=" | ||
+ | |||
+ | |||
+ | # colors | ||
+ | LIGHTGREEN=" | ||
+ | LIGHTRED=" | ||
+ | WHITE=" | ||
+ | RESET=" | ||
+ | |||
+ | |||
+ | ######################################################################## | ||
+ | # | ||
+ | # / CONSTANTS | ||
+ | # | ||
+ | ######################################################################## | ||
+ | |||
+ | |||
+ | ######################################################################## | ||
+ | # | ||
+ | # FUNCTIONS | ||
+ | # | ||
+ | ######################################################################## | ||
+ | |||
+ | |||
+ | # | ||
+ | # $0 ORACLE_SID BACKUP_METHOD | ||
+ | # | ||
+ | # Where ORACLE_SID allowed: ${LIGHTGREEN}${KNOWNSIDS[*]}${RESET} | ||
+ | # And BACKUP_METHOD allowed: ${LIGHTGREEN}${KNOWNTYPE[*]}${RESET}\n" | ||
+ | # # VERY INITIAL CHECKS | ||
+ | |||
+ | support() { | ||
+ | printf " | ||
+ | } | ||
+ | |||
+ | print_revision() { | ||
+ | echo "$1 v$2 (nagios-plugins 1.4.15)" | ||
+ | printf "%sThe nagios plugins come with ABSOLUTELY NO WARRANTY. You may redistribute\ncopies of the plugins under the terms of the GNU General Public License.\nFor more information about these matters, see the file named COPYING.\n" | ||
+ | } | ||
+ | |||
+ | print_usage() { | ||
+ | echo " | ||
+ | ${PROGPATH}/ | ||
+ | ${PROGPATH}/ | ||
+ | ${PROGPATH}/ | ||
+ | ${PROGPATH}/ | ||
+ | ${PROGPATH}/ | ||
+ | ${PROGPATH}/ | ||
+ | ${PROGPATH}/ | ||
+ | ${PROGPATH}/ | ||
+ | ${PROGPATH}/ | ||
+ | ${PROGPATH}/ | ||
+ | ${PROGPATH}/ | ||
+ | ${PROGPATH}/ | ||
+ | ${PROGPATH}/ | ||
+ | ${PROGPATH}/ | ||
+ | " | ||
+ | |||
+ | } | ||
+ | |||
+ | print_help() { | ||
+ | print_revision $PROGNAME $REVISION | ||
+ | echo "" | ||
+ | print_usage | ||
+ | echo " | ||
+ | Check Oracle status | ||
+ | |||
+ | --tns SID/IP Address | ||
+ | Check remote TNS server | ||
+ | --db SID | ||
+ | Check remote database (search /bin/ps for PMON process) | ||
+ | --sessions SID | ||
+ | Check remote database concurrent active sessions | ||
+ | --login SID | ||
+ | | ||
+ | --cache | ||
+ | Check remote database for library and buffer cache hit ratios | ||
+ | --parsing | ||
+ | Check remote database for Soft/Hard parse ratios | ||
+ | --tablespace | ||
+ | Check remote database for tablespace capacity in ORACLE_SID | ||
+ | --undo | ||
+ | Check remote database for UNDO tablespace capacity in ORACLE_SID | ||
+ | --diskgroup | ||
+ | Check remote database for diskgroup capacity in ORACLE_ASM_SID (Tipically +ASM1/2...) | ||
+ | --dgstats | ||
+ | | ||
+ | --redogen | ||
+ | Daily check for yesterday' | ||
+ | --help | ||
+ | Print this help screen | ||
+ | --version | ||
+ | Print version and license information | ||
+ | |||
+ | If the plugin doesn' | ||
+ | variable is set, that ORACLE_HOME/ | ||
+ | tnsnames.ora file is locatable and is properly configured on your Oracle server. | ||
+ | |||
+ | If you want to use a default Oracle home, add in your oratab file: | ||
+ | *:/ | ||
+ | " | ||
+ | } | ||
+ | |||
+ | usage() | ||
+ | { | ||
+ | # Information options | ||
+ | case " | ||
+ | " | ||
+ | print_help | ||
+ | exit $STATE_OK | ||
+ | ;; | ||
+ | " | ||
+ | print_revision $PROGNAME $REVISION | ||
+ | exit $STATE_OK | ||
+ | ;; | ||
+ | *) | ||
+ | print_usage | ||
+ | exit $STATE_OK | ||
+ | ;; | ||
+ | esac | ||
+ | } | ||
+ | |||
+ | |||
+ | return_values() | ||
+ | { | ||
+ | local let VALUE=$1 | ||
+ | if [ ${VALUE} -gt ${CRITICAL} ] ; then | ||
+ | MSG=" | ||
+ | RETURNCODE=${STATE_CRITICAL} | ||
+ | elif [ ${VALUE} -gt ${WARNING} ] ; then | ||
+ | MSG=" | ||
+ | RETURNCODE=${STATE_WARNING} | ||
+ | elif [ ${VALUE} -le ${WARNING} ] ; then | ||
+ | MSG=" | ||
+ | RETURNCODE=${STATE_OK} | ||
+ | else | ||
+ | MSG=" | ||
+ | RETURNCODE=${STATE_UNKNOWN} | ||
+ | fi | ||
+ | echo ${MSG} | ||
+ | return ${RETURNCODE} | ||
+ | } | ||
+ | |||
+ | |||
+ | get_remote_oraclehome() | ||
+ | { | ||
+ | # Hunt down a reasonable ORACLE_HOME | ||
+ | ORATABLIST=" | ||
+ | |||
+ | for ORATAB in ${ORATABLIST} ; do | ||
+ | ORACLE_HOME=$(${SSH} "cat ${ORATAB}" | ||
+ | [[ " | ||
+ | done | ||
+ | return 1 | ||
+ | } | ||
+ | |||
+ | check_tns() | ||
+ | { | ||
+ | local AUX=" | ||
+ | local TNSCHECK=" | ||
+ | # echo ${TNSCHECK} | ||
+ | if [[ " | ||
+ | return ${STATE_OK} | ||
+ | else | ||
+ | return ${STATE_CRITICAL} | ||
+ | fi | ||
+ | } | ||
+ | |||
+ | check_db() | ||
+ | { | ||
+ | local PMONCHECK=" | ||
+ | if [ ${PMONCHECK} -ge 1 ] ; then | ||
+ | # echo " | ||
+ | return ${STATE_OK} | ||
+ | else | ||
+ | # echo " | ||
+ | return ${STATE_CRITICAL} | ||
+ | fi | ||
+ | } | ||
+ | |||
+ | check_login() | ||
+ | { | ||
+ | local AUX=" | ||
+ | local LOGINCHECK=" | ||
+ | if [ ${LOGINCHECK} -ge 1 ] ; then | ||
+ | # echo " | ||
+ | return ${STATE_OK} | ||
+ | else | ||
+ | # echo " | ||
+ | return ${STATE_CRITICAL} | ||
+ | fi | ||
+ | } | ||
+ | |||
+ | # THIS FUNCTION IS PERSONALIZED FOR VOXEL | ||
+ | # TSDG variable must be " | ||
+ | check_asessions() | ||
+ | { | ||
+ | local let RETURNCODE=${STATE_UNKNOWN} | ||
+ | local let MAXINDEX=0 | ||
+ | local let i=0 | ||
+ | local let x=0 | ||
+ | local let TOTALSESSIONS=0 | ||
+ | declare -a RESSULTARRAY | ||
+ | case ${ORACLE_SID^^} in | ||
+ | " | ||
+ | local QUERY=" | ||
+ | SET PAGES 0 | ||
+ | SET FEED OFF | ||
+ | set numf 99999 | ||
+ | select count(*) from V\\\$SESSION where USERNAME=' | ||
+ | select count(*) from V\\\$SESSION where USERNAME=' | ||
+ | " | ||
+ | ;; | ||
+ | " | ||
+ | local QUERY=" | ||
+ | SET PAGES 0 | ||
+ | SET FEED OFF | ||
+ | set numf 99999 | ||
+ | select count(*) from V\\\$SESSION where USERNAME=' | ||
+ | select count(*) from V\\\$SESSION where USERNAME=' | ||
+ | select count(*) from V\\\$SESSION where USERNAME=' | ||
+ | select count(*) from V\\\$SESSION where USERNAME=' | ||
+ | " | ||
+ | ;; | ||
+ | * ) | ||
+ | echo " | ||
+ | return ${STATE_CRITICAL} | ||
+ | ;; | ||
+ | esac | ||
+ | |||
+ | local AUX=" | ||
+ | local RESSULT=" | ||
+ | |||
+ | |||
+ | if [[ " | ||
+ | echo " | ||
+ | return ${STATE_CRITICAL} | ||
+ | fi | ||
+ | |||
+ | for i in ${RESSULT} ; do | ||
+ | let TOTALSESSIONS+=$i | ||
+ | RESSULTARRAY[$x]=$i | ||
+ | [ $i -gt ${RESSULTARRAY[$MAXINDEX]} ] && MAXINDEX=$x | ||
+ | let x++ | ||
+ | done | ||
+ | |||
+ | MSG=" | ||
+ | RETURNCODE=$? | ||
+ | |||
+ | |||
+ | case ${ORACLE_SID^^} in | ||
+ | " | ||
+ | echo " | ||
+ | return ${RETURNCODE} | ||
+ | ;; | ||
+ | " | ||
+ | AUX=" | ||
+ | AUX=" | ||
+ | AUX=" | ||
+ | AUX=" | ||
+ | AUX=" | ||
+ | |||
+ | echo " | ||
+ | return ${RETURNCODE} | ||
+ | ;; | ||
+ | * ) | ||
+ | echo " | ||
+ | return ${STATE_CRITICAL} | ||
+ | ;; | ||
+ | esac | ||
+ | |||
+ | } | ||
+ | |||
+ | |||
+ | |||
+ | #This a statistics-only control, so it always return OK unless it can't connect to Oracle | ||
+ | check_redogen() | ||
+ | { | ||
+ | local let RETURNCODE=${STATE_UNKNOWN} | ||
+ | local QUERY=" | ||
+ | SET PAGES 0 | ||
+ | SET FEED OFF | ||
+ | set numf 9999999999 | ||
+ | SELECT Round(A.COUNT# | ||
+ | FROM ( | ||
+ | SELECT To_Char(First_Time,' | ||
+ | FROM v\\\$log_history | ||
+ | WHERE To_Char(First_Time,' | ||
+ | GROUP BY To_Char(First_Time,' | ||
+ | ORDER BY 1 DESC | ||
+ | ) A, | ||
+ | ( | ||
+ | SELECT Avg(BYTES) AVG# | ||
+ | FROM v\\\$log | ||
+ | ) B | ||
+ | /" | ||
+ | local AUX=" | ||
+ | local RESSULT=" | ||
+ | |||
+ | |||
+ | if [[ " | ||
+ | echo " | ||
+ | return ${STATE_CRITICAL} | ||
+ | fi | ||
+ | |||
+ | echo "OK - ${ORACLE_SID} Redo generation: ${RESSULT} |RedoGen=${RESSULT}" | ||
+ | return 0 | ||
+ | } | ||
+ | |||
+ | |||
+ | check_cache() | ||
+ | { | ||
+ | local let RETURNCODE=${STATE_UNKNOWN} | ||
+ | local QUERY=" | ||
+ | SET PAGES 0 | ||
+ | SET FEED OFF | ||
+ | set numf 9999999.99 | ||
+ | SELECT (1-(pr.value/ | ||
+ | from v\\\$sysstat pr, v\\\$sysstat dbg, v\\\$sysstat cg | ||
+ | where pr.name=' | ||
+ | and dbg.name=' | ||
+ | and cg.name=' | ||
+ | /" | ||
+ | local AUX=" | ||
+ | local LIBHITS=" | ||
+ | |||
+ | local QUERY=" | ||
+ | SET PAGES 0 | ||
+ | SET FEED OFF | ||
+ | set numf 9999999.99 | ||
+ | select sum(lc.pins)/ | ||
+ | from v\\\$librarycache lc | ||
+ | /" | ||
+ | local AUX=" | ||
+ | local CACHEHITS=" | ||
+ | |||
+ | |||
+ | if [[ " | ||
+ | echo " | ||
+ | return ${STATE_CRITICAL} | ||
+ | fi | ||
+ | |||
+ | if ! [[ " | ||
+ | echo " | ||
+ | return ${STATE_CRITICAL} | ||
+ | fi | ||
+ | |||
+ | if [[ ${CACHEHITS/ | ||
+ | MSG=" | ||
+ | RETURNCODE=${STATE_CRITICAL} | ||
+ | elif [[ ${CACHEHITS/ | ||
+ | MSG=" | ||
+ | RETURNCODE=${STATE_WARNING} | ||
+ | elif [[ ${CACHEHITS/ | ||
+ | MSG=" | ||
+ | RETURNCODE=${STATE_OK} | ||
+ | else | ||
+ | MSG=" | ||
+ | RETURNCODE=${STATE_UNKNOWN} | ||
+ | fi | ||
+ | echo " | ||
+ | return ${RETURNCODE} | ||
+ | } | ||
+ | |||
+ | |||
+ | check_parsing() | ||
+ | { | ||
+ | local let RETURNCODE=${STATE_UNKNOWN} | ||
+ | |||
+ | local QUERY=" | ||
+ | SET PAGES 0 | ||
+ | SET FEED OFF | ||
+ | set numf 99999999999999 | ||
+ | SELECT VALUE FROM V\\\$SYSSTAT WHERE NAME = 'parse count (total)' | ||
+ | SELECT VALUE FROM V\\\$SYSSTAT WHERE NAME = 'parse count (hard)' | ||
+ | SELECT VALUE FROM V\\\$SYSSTAT WHERE NAME = 'parse count (failures)' | ||
+ | SELECT VALUE FROM V\\\$SYSSTAT WHERE NAME = 'parse count (describe)' | ||
+ | local AUX=" | ||
+ | local RESSULT=" | ||
+ | |||
+ | if [[ " | ||
+ | echo " | ||
+ | return ${STATE_CRITICAL} | ||
+ | fi | ||
+ | |||
+ | # PARSING INDEXES like possitional parameter | ||
+ | # TOTAL=1 | ||
+ | # HARD=2 | ||
+ | # FAIL=3 | ||
+ | # DESCRIBE=4 | ||
+ | |||
+ | SOFTPARSE=" | ||
+ | HARDPARSE=" | ||
+ | FAILEDPARSE=" | ||
+ | |||
+ | if [[ ${SOFTPARSE/ | ||
+ | MSG=" | ||
+ | RETURNCODE=${STATE_CRITICAL} | ||
+ | elif [[ ${SOFTPARSE/ | ||
+ | MSG=" | ||
+ | RETURNCODE=${STATE_WARNING} | ||
+ | elif [[ ${SOFTPARSE/ | ||
+ | MSG=" | ||
+ | RETURNCODE=${STATE_OK} | ||
+ | else | ||
+ | MSG=" | ||
+ | RETURNCODE=${STATE_UNKNOWN} | ||
+ | fi | ||
+ | echo " | ||
+ | return ${RETURNCODE} | ||
+ | } | ||
+ | |||
+ | generic_space_check() | ||
+ | { | ||
+ | local CHECK=" | ||
+ | local OBJECTNAME=" | ||
+ | case ${CHECK,,} in | ||
+ | " | ||
+ | local QUERY=" | ||
+ | SET PAGES 0 | ||
+ | SET FEED OFF | ||
+ | set numf 9999999.99 | ||
+ | select | ||
+ | TOTALSPACE.TOTAL-NVL(USEDSPACE.USED, | ||
+ | FROM ( | ||
+ | SELECT TABLESPACE_NAME, | ||
+ | FROM DBA_DATA_FILES WHERE TABLESPACE_NAME = (SELECT value FROM V\\\$parameter WHERE name = ' | ||
+ | GROUP BY TABLESPACE_NAME | ||
+ | ) TOTALSPACE | ||
+ | LEFT OUTER JOIN | ||
+ | ( | ||
+ | SELECT TABLESPACE_NAME, | ||
+ | FROM DBA_UNDO_EXTENTS | ||
+ | WHERE (STATUS=' | ||
+ | AND TABLESPACE_NAME = (SELECT value FROM V\\\$parameter WHERE name = ' | ||
+ | GROUP BY TABLESPACE_NAME | ||
+ | ) USEDSPACE | ||
+ | ON TOTALSPACE.TABLESPACE_NAME=USEDSPACE.TABLESPACE_NAME | ||
+ | ;" | ||
+ | OBJECTNAME=UNDO | ||
+ | ;; | ||
+ | " | ||
+ | local QUERY=" | ||
+ | SET PAGES 0 | ||
+ | SET FEED OFF | ||
+ | SET NUMF 99999999.99 | ||
+ | SELECT | ||
+ | REAL_FREE_MB FREE_MB | ||
+ | FROM ( | ||
+ | SELECT MAXUSAGE.TABLESPACE_NAME, | ||
+ | MAXUSAGE.MAX_MB, | ||
+ | CASE WHEN MAXUSAGE.ACTUAL_DATAFILE_MB < MAXUSAGE.MAX_MB THEN | ||
+ | MAX_MB-(ACTUAL_DATAFILE_MB-FREE_MB) | ||
+ | ELSE | ||
+ | FREE_MB | ||
+ | END REAL_FREE_MB | ||
+ | FROM | ||
+ | ( | ||
+ | select TABLESPACE_NAME, | ||
+ | SUM(case when MAXBYTES > 0 then MAXBYTES else BYTES END)/ | ||
+ | SUM(BYTES)/ | ||
+ | FROM DBA_DATA_FILES | ||
+ | GROUP BY TABLESPACE_NAME | ||
+ | ) MAXUSAGE, | ||
+ | ( | ||
+ | select TABLESPACE_NAME, | ||
+ | FROM dba_free_space | ||
+ | GROUP BY TABLESPACE_NAME | ||
+ | ) FREEUSAGE | ||
+ | WHERE MAXUSAGE.TABLESPACE_NAME=FREEUSAGE.TABLESPACE_NAME | ||
+ | AND MAXUSAGE.TABLESPACE_NAME = ' | ||
+ | ) | ||
+ | ;" | ||
+ | ;; | ||
+ | " | ||
+ | local QUERY=" | ||
+ | SET PAGES 0 | ||
+ | SET FEED OFF | ||
+ | SET NUMF 9999999999 | ||
+ | SELECT TOTAL_MB, NVL(FREE_MB, | ||
+ | FROM V\\\$ASM_DISKGROUP | ||
+ | WHERE NAME=' | ||
+ | ;; | ||
+ | * ) | ||
+ | echo " | ||
+ | return ${STATE_CRITICAL} | ||
+ | ;; | ||
+ | esac | ||
+ | |||
+ | local AUX=" | ||
+ | local RESSULT=" | ||
+ | |||
+ | if [[ " | ||
+ | echo " | ||
+ | return ${STATE_CRITICAL} | ||
+ | fi | ||
+ | |||
+ | |||
+ | local TOTAL=" | ||
+ | local FREE=" | ||
+ | local USED=" | ||
+ | |||
+ | local PERCENT=" | ||
+ | MSG=" | ||
+ | RETURNCODE=$? | ||
+ | |||
+ | echo " | ||
+ | return ${RETURNCODE} | ||
+ | } | ||
+ | |||
+ | asmfs_space_check() | ||
+ | { | ||
+ | |||
+ | local OBJECTNAME=" | ||
+ | local AUX=" | ||
+ | local RESSULT=" | ||
+ | |||
+ | if [[ ! " | ||
+ | echo " | ||
+ | return ${STATE_CRITICAL} | ||
+ | fi | ||
+ | |||
+ | local TOTAL=" | ||
+ | local FREE=" | ||
+ | local USED=" | ||
+ | local PERCENT=" | ||
+ | local WARNINGVALUE=" | ||
+ | local CRITICALVALUE=" | ||
+ | |||
+ | MSG=" | ||
+ | RETURNCODE=$? | ||
+ | |||
+ | echo " | ||
+ | return ${RETURNCODE} | ||
+ | } | ||
+ | |||
+ | |||
+ | # This check needs SYS/ AS SYSDBA priviledge as connect to the standby (supposed to be in mount state) | ||
+ | dataguard_stats_new() | ||
+ | { | ||
+ | local ORAENVSID=" | ||
+ | local let RETURNCODE=${STATE_UNKNOWN} | ||
+ | local SQLPLUS=" | ||
+ | local TRANSPORTLAG="" | ||
+ | local APPLYLAG="" | ||
+ | |||
+ | local QUERY=" | ||
+ | SET PAGES 0 | ||
+ | SET FEED OFF | ||
+ | set numf 99999999999999 | ||
+ | SELECT VALUE FROM V\\\$DATAGUARD_STATS ;" | ||
+ | |||
+ | local AUX=" | ||
+ | local RESSULT=" | ||
+ | |||
+ | if [[ " | ||
+ | echo " | ||
+ | return ${STATE_CRITICAL} | ||
+ | fi | ||
+ | |||
+ | TRANSPORTLAG=" | ||
+ | APPLYLAG=" | ||
+ | |||
+ | # echo " | ||
+ | # echo " | ||
+ | |||
+ | |||
+ | TRANSPORTLAGSECONDS=$(echo " | ||
+ | APPLYLAGSECONDS=$(echo " | ||
+ | |||
+ | if [ ${TRANSPORTLAGSECONDS} -gt ${APPLYLAGSECONDS} ] ; then | ||
+ | MSG=" | ||
+ | RETURNCODE=$? | ||
+ | else | ||
+ | MSG=" | ||
+ | RETURNCODE=$? | ||
+ | fi | ||
+ | |||
+ | echo " | ||
+ | return ${RETURNCODE} | ||
+ | |||
+ | } | ||
+ | |||
+ | |||
+ | ######################################################################## | ||
+ | # | ||
+ | # / FUNCTIONS | ||
+ | # | ||
+ | ######################################################################## | ||
+ | |||
+ | |||
+ | ######################################################################## | ||
+ | # | ||
+ | # VARIABLES | ||
+ | # | ||
+ | ######################################################################## | ||
+ | |||
+ | PROGNAME=$(basename $0) | ||
+ | PROGPATH=$(dirname $0) | ||
+ | |||
+ | |||
+ | [ $# -le 1 ] && usage $* | ||
+ | |||
+ | |||
+ | REMOTE_SERVER=$2 && shift 2 | ||
+ | |||
+ | if [[ ! ${REMOTE_SERVER} ]] | ||
+ | then | ||
+ | echo "No remote server specified!!!" | ||
+ | exit ${STATE_UNKNOWN} | ||
+ | fi | ||
+ | |||
+ | # Checking for non-standard user to connect | ||
+ | if [[ " | ||
+ | then | ||
+ | ORACLE_OSUSER=$2 && shift 2 | ||
+ | else | ||
+ | ORACLE_OSUSER=" | ||
+ | fi | ||
+ | |||
+ | SSH=" | ||
+ | |||
+ | ORACLEUSER=" | ||
+ | ORACLEUSERPASSWORD=" | ||
+ | |||
+ | ######################################################################## | ||
+ | # | ||
+ | # / VARIABLES | ||
+ | # | ||
+ | ######################################################################## | ||
+ | |||
+ | ######################################################################## | ||
+ | # | ||
+ | # MAIN | ||
+ | # | ||
+ | ######################################################################## | ||
+ | |||
+ | # CLEANING THE COMMAND | ||
+ | COMMAND=" | ||
+ | ORACLE_SID=" | ||
+ | [[ ! " | ||
+ | |||
+ | |||
+ | if [ $# -eq 4 ] ; then | ||
+ | CRITICAL=$3 | ||
+ | WARNING=$4 | ||
+ | elif [ $# -eq 5 ] ; then | ||
+ | TSDG=$3 | ||
+ | CRITICAL=$4 | ||
+ | WARNING=$5 | ||
+ | fi | ||
+ | |||
+ | if [[ " | ||
+ | if [ ${WARNING} -gt ${CRITICAL} ] ; then | ||
+ | echo " | ||
+ | exit $STATE_UNKNOWN | ||
+ | fi | ||
+ | fi | ||
+ | |||
+ | # if the check is not for asmfs, then a ORACLE_HOME is necessary | ||
+ | if [[ ! " | ||
+ | get_remote_oraclehome | ||
+ | RES=$? | ||
+ | if [ ${RES} -ne ${STATE_OK} ] ; then | ||
+ | echo " | ||
+ | exit $STATE_UNKNOWN | ||
+ | fi | ||
+ | fi | ||
+ | |||
+ | # SQLPLUS FOR CONNECTIONS | ||
+ | SQLPLUS=" | ||
+ | ORAENV=" | ||
+ | |||
+ | case " | ||
+ | " | ||
+ | check_tns | ||
+ | RES=$? | ||
+ | if [ ${RES} -eq ${STATE_OK} ] ; then | ||
+ | echo "OK - reply time ${BASH_REMATCH[1]} from ${ORACLE_SID}" | ||
+ | else | ||
+ | echo " | ||
+ | fi | ||
+ | ;; | ||
+ | " | ||
+ | check_db | ||
+ | RES=$? | ||
+ | if [ ${RES} -eq ${STATE_OK} ] ; then | ||
+ | echo "OK - ${ORACLE_SID} Database running" | ||
+ | else | ||
+ | echo " | ||
+ | fi | ||
+ | ;; | ||
+ | " | ||
+ | | ||
+ | RES=$? | ||
+ | if [ ${RES} -eq ${STATE_OK} ] ; then | ||
+ | echo "OK - ${ORACLE_SID} dummy login connected" | ||
+ | else | ||
+ | echo " | ||
+ | fi | ||
+ | ;; | ||
+ | " | ||
+ | check_sessions | ||
+ | RES=$? | ||
+ | ;; | ||
+ | " | ||
+ | check_cache | ||
+ | RES=$? | ||
+ | ;; | ||
+ | " | ||
+ | check_parsing | ||
+ | RES=$? | ||
+ | ;; | ||
+ | " | ||
+ | generic_space_check undo | ||
+ | RES=$? | ||
+ | ;; | ||
+ | " | ||
+ | generic_space_check tablespace " | ||
+ | RES=$? | ||
+ | ;; | ||
+ | " | ||
+ | generic_space_check diskgroup " | ||
+ | RES=$? | ||
+ | ;; | ||
+ | " | ||
+ | ASMFS_DISK=${ORACLE_SID} | ||
+ | asmfs_space_check ${ASMFS_DISK} | ||
+ | RES=$? | ||
+ | ;; | ||
+ | |||
+ | " | ||
+ | # | ||
+ | dataguard_stats_new | ||
+ | RES=$? | ||
+ | ;; | ||
+ | " | ||
+ | check_redogen | ||
+ | RES=$? | ||
+ | ;; | ||
+ | |||
+ | *) | ||
+ | exit $STATE_UNKNOWN | ||
+ | ;; | ||
+ | esac | ||
+ | |||
+ | |||
+ | # EXIT STATUS | ||
+ | # STATE_OK=0 | ||
+ | # STATE_WARNING=1 | ||
+ | # STATE_CRITICAL=2 | ||
+ | # STATE_UNKNOWN=3 | ||
+ | # STATE_DEPENDENT=4 | ||
+ | # /EXIT STATUS | ||
+ | |||
+ | #WIP | ||
+ | exit ${RES} | ||
+ | </ |