check_oracle_health
Posted on July 3rd, 2009 by admin
Beschreibung
check_oracle_health ist ein Plugin, mit dem unterschiedliche Parameter einer Oracle-Datenbank überprüft werden können.
Dokumentation
Kommandozeilenparameter
- –connect=<sid> Der Datenbankname
- –user=<username> Der Datenbankuser
- –password=<password> Dessen Passwort
- –connect=<username/password@sid> Alternative zu den obigen Parametern.
- –connect=sysdba@<sid> Anmeldung mit / as sysdba (wenn der aufrufende User dazu privilegiert ist)
- –connect=/@token Anmeldung mit Hilfe des Password Store (setzt –method=sqlplus voraus)
- –mode=<modus> Mit dem mode-Parameter teilt man dem Plugin mit, was es tun soll. Siehe Liste der möglichen Werte weiter unten.
- –tablespace=<tablespacename> Hier kann die Prüfung auf einen einzigen Tablespace eingeschränkt werden. Fehlt dieser Parameter, dann werden sämtliche Tablespaces geprüft.
- –datafile=<datafilename> Hier kann die Prüfung auf ein einziges Datafile eingeschränkt werden. Fehlt dieser Parameter, dann werden sämtliche Datafiles geprüft.
- –name=<objektname> Hier kann die Prüfung auf ein einziges Objekt (Latch, Enqueue, Tablespace, Datafile) eingeschränkt werden. Fehlt dieser Parameter, dann werden sämtliche Objekte geprüft. (Anstelle von –tablespace oder –datafile kann und sollte dieser Parameter benutzt werden. Er dient dazu, die Aufrufschnittstelle des Plugins zu vereinheitlichen).
- –name2=<string> Verwendet man –mode=sql, dann erscheint das SQL-Statement in der Ausgabe und den Performancedaten. Mit dem Parameter name2 kann man dafür einen eigenen String vergeben.
- –regexp Durch diesen Schalter wird der Wert des –name Parameters als regulärer Ausdruck interpretiert.
- –warning=<range> Ermittelte Werte außerhalb dieses Bereichs lösen ein WARNING aus.
- –critical=<range> Ermittelte Werte außerhalb dieses Bereichs lösen ein CRITICAL aus.
- –absolute Bei im Laufe der Zeit ansteigenden Werten kann der Anstieg pro Sekunde oder mit dem Parameter –absolute die Differenz zwischen dem jetzigen und dem letzten Lauf betrachtet werden.
- –runas=<username> Mit diesem Parameter ist es möglich, das Script unter einer anderen Userkennung laufen zu lassen. (Interner Aufruf von sudo -u <username> <pfad zum plugin>.
- –environment <variable>=<wert> Damit kann man dem Script Environmentvariablen mitgeben. Z.b. –environment ORACLE_HOME=/u01/oracle. Mehrfachnennungen sind möglich.
- –method=<connectmethode> Mit diesem Parameter teilt man dem Plugin mit, wie es sich zur Datenbank verbinden soll. (tns für Verbindung per DBD::Oracle (default), sqlplus für Verbindung per sqlplus-Aufruf).
- –units=<%|KB|MB|GB> Die Angabe von Einheiten dient der "Verschönerung" von Ausgaben des mode=sql und der einfachen Angabe von Schwellwerten bei mode=tablespace-free
Um dem Plugin mitzuteilen, welche Werte es ermitteln und prüfen soll, benutzt man die Option –mode mit verschiedenen Schlüsselwörtern.
| Schlüsselwort | Bedeutung | Wertebereich |
| tnsping | Listener | |
| connection-time | Misst, wie lange Verbindungsaufbau und Login dauern | 0..n Sekunden (1, 5) |
| connected-users | Die Anzahl der an der Datenbank angemeldeten User | 0..n (50, 100) |
| sga-data-buffer-hit-ratio | Hitrate im Data Buffer Cache | 0%..100% (98:, 95:) |
| sga-library-cache-hit-ratio | Hitrate im Library Cache | 0%..100% (98:, 95:) |
| sga-dictionary-cache-hit-ratio | Hitrate im Dictionary Cache | 0%..100% (95:, 90:) |
| sga-latches-hit-ratio | Hitrate der Latches | 0%..100% (98:, 95:) |
| sga-shared-pool-reloads | Reload Rate im Shared Pool | 0%..100% (1, 10) |
| sga-shared-pool-free | Freier Speicher im Shared Pool | 0%..100% (10:, 5:) |
| pga-in-memory-sort-ratio | Prozentsatz der Sorts im Speicher | 0%..100% (99:, 90:) |
| invalid-objects | Anzahl fehlerhafter Objekte, Indices, Partitions | |
| stale-statistics | Anzahl der Objekte mit veralteten Optimizer Statistiken | n (10, 100) |
| tablespace-usage | Verbrauchter Speicherplatz im Tablespace | 0%..100% (90, 98) |
| tablespace-free | Freier Speicherplatz im Tablespace | 0%..100% (5:, 2:) |
| tablespace-fragmentation | Free Space Fragmentation Index | 100..1 (30:, 20:) |
| tablespace-io-balanc | IO-Verteilung unter den Datafiles eines Tablespaces | n (1.0, 2.0) |
| tablespace-remaining-time | Anzahl der verbleibenden Tage, bis ein Tablespace zu 100% belegt ist. Die Wachstumsrate wird aus den Daten der letzten 30 Tage berechnet. (mit dem Parameter –lookback können andere Zeiträume angegeben werden) | Tage (90:, 30:) |
| tablespace-can-allocate-next | Prüft, ob im Tablespace noch genügend Platz für das next Extent ist | |
| datafile-io-traffic | Anzahl der IO-Operationen von Datafiles pro Sekunde | n/sec (1000, 5000) |
| soft-parse-ratio | Der Anteil der soft-parse-Aufrufe | 0%..100% |
| switch-interval | Intervall zwischen RedoLog File Switches | 0..n Sekunden (600:, 60:) |
| retry-ratio | Retry-Rate im RedoLog Buffer | 0%..100% (1, 10) |
| redo-io-traffic | Redolog IO in MB/sec | n/sec (199,200) |
| roll-header-contention | Rollback Segment Header Contention | 0%..100% (1, 2) |
| roll-block-contention | Rollback Segment Block Contention | 0%..100% (1, 2) |
| roll-hit-ratio | Rollback Segment gets/waits Ratio | 0%..100% (99:, 98:) |
| roll-extends | Rollback Segment Extends | n, n/sec (1, 100) |
| roll-wraps | Rollback Segment Wraps | n, n/sec (1, 100) |
| seg-top10-logical-reads | Anzahl der Userprozesse unter den top 10 logical reads | n (1, 9) |
| seg-top10-physical-reads | Anzahl der Userprozesse unter den top 10 physical reads | n (1, 9) |
| seg-top10-buffer-busy-waits | Anzahl der Userprozesse unter den top 10 buffer busy waits | n (1, 9) |
| seg-top10-row-lock-waits | Anzahl der Userprozesse unter den top 10 row lock waits | n (1, 9) |
| event-waits | Waits/sec von System Events | n/sec (10,100) |
| event-waiting | Wieviel Prozent der verstrichenen Zeit hat ein Event mit Warten verbracht | 0%..100% (0.1,0.5) |
| enqueue-contention | Enqueue wait/request-Verhältnis | 0%..100% (1, 10) |
| enqueue-waiting | Wieviel Prozent der Zeit seit dem letzten Lauf hat ein Enqueue mit Warten verbracht | 0%..100% (0.00033,0.0033) |
| latch-contention | Latch misses/gets-Verhältnis. Mit –name wird ein Latchname oder eine Latchnummer übergeben. (Siehe list-latches) | 0%..100% (1,2) |
| latch-waiting | Wieviel Prozent der Zeit seit dem letzten Lauf hat ein Latch mit Warten verbracht | 0%..100% (0.1,1) |
| sysstat | Änderung/sec für beliebige Werte aus v$sysstat | n/sec (10,10) |
| sql | Ergebnis eines beliebigen SQL-Befehls, der eine Zahl zurückliefert. Der Befehl wird mit dem Parameter –name übergeben. Ein Label für Performancedaten kann mit dem Parameter –name2 übergeben werden. | n (1,5) |
| list-tablespaces | Gibt eine Liste der Tablespaces aus | |
| list-datafiles | Gibt eine Liste der Datafiles aus | |
| list-latches | Gibt eine Liste der Latch-Namen und -Nummern aus | |
| list-enqueues | Gibt eine Liste der Enqueue-Namen aus | |
| list-events | Gibt eine Liste der Events aus (v$system_event). Neben event_number/event_id wird eine verkürzte Form des Eventnamens ausgegeben, die z.b. für Nagios-Servicedescriptions verwendet werden kann. Bsp: lo_fi_sw_co = log file switch completion | |
| list-background-events | Gibt eine Liste der Background-Events aus | |
| list-sysstats | Gibt eine Liste der systemweiten Statistiken aus |
Messungen, die abhängig von einem Zeitintervall sind, können unterschiedlich aufgerufen werden. Zur Berechnung des Endergebnisses wird ein Anfangs- und ein Endwert sowie die Zeit zwischen den beiden Messungen benötigt. Ohne Angabe von weiteren Optionen wird als Ausgangswert der gemessene Wert des letzen Laufs verwendet. Die seither verstrichene Zeit entspricht i.d.R. dem normal_check_interval des entsprechenden Services.
Wenn nicht der Zuwachs pro Sekunde für das Resultat des Checks entscheidend sein soll, sondern die Differenz zwischen den zwei Messwerten, dann teilt man dies dem Plugin mit der Option –absolute mit. Das ist z.b. sinnvoll für Rollback Segment Wraps, die so selten auftreten, daß die Rate nahezu 0/sek ist. Trotzdem möchte man alarmiert werden, wenn die Zahl solcher Ereignisse wächst.
Die Schwellwerte sollten so gewählt werden, daß sie auch innerhalb eines retry_check_interval erreicht werden können, sonst wird nach jedem SOFT;1 wieder in den OK-Zustand gewechselt.
Es ist zu beachten, daß Schwellwerte entsprechend den Nagios Developer Guidelines anzugeben sind.
"10" bedeutet demzufolge "Alarm, wenn > 10" und
"90:" bedeutet "Alarm, wenn < 90"
Vorbereitung der Datenbank
Damit sich das Plugin die benötigten Informationen aus der Datenbank holen kann, muss ein Benutzer angelegt werden, der über folgende Berechtigungen verfügt:
[sourcecode language="sql"] create user nagios identified by oradbmon; grant create session to nagios; grant select any dictionary to nagios; grant select on V_$SYSSTAT to nagios; grant select on V_$INSTANCE to nagios; grant select on V_$LOG to nagios; grant select on SYS.DBA_DATA_FILES to nagios; grant select on SYS.DBA_FREE_SPACE to nagios; -- -- falls noch jemand Oracle 8.1.7 einsetzt... grant select on sys.dba_tablespaces to nagios; grant select on dba_temp_files to nagios; grant select on sys.v_$Temp_extent_pool to nagios; grant select on sys.v_$TEMP_SPACE_HEADER to nagios; grant select on sys.v_$session to nagios; [/sourcecode]
Beispiele
[sourcecode language="bash"]
nagios$ check_oracle_health --connect bba --mode tnsping
OK - connection established to bba.
nagios$ check_oracle_health --mode connection-time
OK - 0.17 seconds to connect |
connection_time=0.1740;1;5
nagios$ check_oracle_health --mode sga-data-buffer-hit-ratio
CRITICAL - SGA data buffer hit ratio 0.99% |
sga_data_buffer_hit_ratio=0.99%;98:;95:
nagios$ check_oracle_health --mode sga-library-cache-hit-ratio
OK - SGA library cache hit ratio 98.75% |
sga_library_cache_hit_ratio=98.75%;98:;95:
nagios$ check_oracle_health --mode sga-latches-hit-ratio
OK - SGA latches hit ratio 100.00% |
sga_latches_hit_ratio=100.00%;98:;95:
nagios$ check_oracle_health --mode sga-shared-pool-reloads
OK - SGA shared pool reloads 0.28% |
sga_shared_pool_reloads=0.28%;1;10
nagios$ check_oracle_health --mode sga-shared-pool-free
WARNING - SGA shared pool free 8.91% |
sga_shared_pool_free=8.91%;10:;5:
nagios$ check_oracle_health --mode pga-in-memory-sort-ratio
OK - PGA in-memory sort ratio 100.00% |
pga_in_memory_sort_ratio=100.00;99:;90:
nagios$ check_oracle_health --mode invalid-objects
OK - no invalid objects found |
invalid_ind_partitions=0 invalid_indexes=0
invalid_objects=0 unrecoverable_datafiles=0
nagios$ check_oracle_health --mode switch-interval
OK - Last redo log file switch interval was 18 minutes |
redo_log_file_switch_interval=1090s;600:;60:
nagios$ check_oracle_health --mode switch-interval --connect rac1
OK - Last redo log file switch interval was 32 minutes (thread 1)|
redo_log_file_switch_interval=1938s;600:;60:
nagios$ check_oracle_health --mode tablespace-usage
CRITICAL - tbs SYSTEM usage is 99.33%
tbs SYSAUX usage is 93.73%
tbs USERS usage is 8.75%
tbs UNDOTBS1 usage is 6.65% | 'tbs_users_usage_pct'=8%;90;98
'tbs_users_usage'=0MB;4;4;0;5
'tbs_undotbs1_usage_pct'=6%;90;98
'tbs_undotbs1_usage'=11MB;153;166;0;170
'tbs_system_usage_pct'=99%;90;98
'tbs_system_usage'=695MB;630;686;0;700
'tbs_sysaux_usage_pct'=93%;90;98
'tbs_sysaux_usage'=802MB;770;839;0;856
nagios$ check_oracle_health --mode tablespace-usage \
--tablespace USERS
OK - tbs USERS usage is 8.75% |
'tbs_users_usage_pct'=8%;90;98
'tbs_users_usage'=0MB;4;4;0;5
nagios$ check_oracle_health --mode tablespace-usage \
--name USERS
OK - tbs USERS usage is 8.75% |
'tbs_users_usage_pct'=8%;90;98
'tbs_users_usage'=0MB;4;4;0;5
nagios$ check_oracle_health --mode tablespace-free \
--name TEST
OK - tbs TEST has 97.91% free space left |
'tbs_test_free_pct'=97.91%;5:;2:
'tbs_test_free'=32083MB;1638.40:;655.36:;0.00;32767.98
nagios$ check_oracle_health --mode tablespace-free \
--name TEST --units MB --warning 100: --critical 50:
OK - tbs TEST has 32083.61MB free space left |
'tbs_test_free_pct'=97.91%;0.31:;0.15:
'tbs_test_free'=32083.61MB;100.00:;50.00:;0;32767.98
nagios$ check_oracle_health --mode tablespace-free \
--name TEST --warning 10: --critical 5:
OK - tbs TEST has 97.91% free space left |
'tbs_test_free_pct'=97.91%;10:;5:
'tbs_test_free'=32083MB;3276.80:;1638.40:;0.00;32767.98
nagios$ check_oracle_health --mode tablespace-remaining-time \
--tablespace ARUSERS --lookback 7
WARNING - tablespace ARUSERS will be full in 78 days |
'tbs_arusers_days_until_full'=78;90:;30:
nagios$ check_oracle_health --mode datafile-io-traffic \
--datafile users01.dbf
WARNING - users01.dbf: 1049.83 IO Operations per Second |
'dbf_users01.dbf_io_total_per_sec'=1049.83;1000;5000
nagios$ check_oracle_health --mode latch-contention \
--name 214
OK - SGA latch library cache (214) contention 0.08% |
'latch_214_contention'=0.08%;1;2
'latch_214_sleep_share'=0.00% 'latch_214_gets'=49995
nagios$ check_oracle_health --mode latch-contention \
--name 'library cache'
OK - SGA latch library cache (214) contention 0.08% |
'latch_214_contention'=0.08%;1;2
'latch_214_sleep_share'=0.00% 'latch_214_gets'=49937
nagios$ check_oracle_health --mode enqueue-contention --name TC
CRITICAL - enqueue TC: 19.90% of the requests must wait |
'TC_contention'=19.90%;1;10
'TC_requests'=2015 'TC_waits'=401
nagios$ check_oracle_health --mode latch-contention \
--name 'messages'
OK - SGA latch messages (17) contention 0.02% |
'latch_17_contention'=0.02%;1;2 'latch_17_gets'=4867
nagios$ check_oracle_health --mode latch-waiting \
--name 'user lock'
OK - SGA latch user lock (205) sleeping 0.000841% of the time |
'latch_205_sleep_share'=0.000841%
nagios$ check_oracle_health --mode event-waits \
--name 'log file sync'
OK - log file sync : 1.839511 waits/sec |
'log file sync_waits_per_sec'=1.839511;10;100
nagios$ check_oracle_health --mode event-waiting \
--name 'Log file parallel write'
OK - log file parallel write waits 0.045843% of the time |
rarr 'log file parallel write_percent_waited'=0.045843%;0.1;0.5
nagios$ check_oracle_health --mode sysstat \
--name 'transaction rollbacks'
OK - 0.000003 transaction rollbacks/sec |
'transaction rollbacks_per_sec'=0.000003;10;100
'transaction rollbacks'=4
nagios$ check_oracle_health --mode sql \
--name 'select count(*) from v\$session' --name2 sessions
CRITICAL - sessions: 21 | 'sessions'=21;1;5
nagios$ check_oracle_health --mode sql \
--name 'select 12 from dual' --name2 twelve --units MB
CRITICAL - twelfe: 12MB | 'twelfe'=12MB;1;5
nagios$ check_oracle_health --mode sql \
--name 'select 200,300,1000 from dual' \
--name2 'kaspar melchior balthasar' \
--warning 180 --critical 500
WARNING - kaspar melchior balthasar: 200 300 1000 |
'kaspar'=200;180;500 'melchior'=300;; 'balthasar'=1000;;
[/sourcecode]
Authentifizierung
Beispiel mit –runas und einem "external user"
Es gibt zwei User in der Datenbank:
- OPS$DBNAGIO IDENTIFIED EXTERNALLY
- NAGIOS IDENTIFIED BY ‘DBMONI’
Es gibt zwei Unix-User:
- qqnagio mit normalem Zugriff.
- dbnagio mit /bin/false als Login-Shell.
[sourcecode language="bash"]
qqnagio$ check_oracle_health --mode=connection-time \
--connect=nagios/dbmoni@BBA
OK - 0.21 seconds to connect as NAGIOS
dbnagio$ check_oracle_health --mode=connection-time \
--connect=BBA --runas=dbnagio \
--environment ORACLE_HOME=$ORACLE_HOME
OK - 0.17 seconds to connect as OPS$DBNAGIO
[/sourcecode]
Hintergrund dieses Beispiels ist folgendes Szenario mit einem SAP-Server:
Verbindung zur Datenbank ist ausschliesslich lokal erlaubt. Die Datenbank ist von außen per Netzwerk nicht erreichbar. Login mit Username und Passwort ist nicht möglich.
Nur durch das Betriebssystem authentifizierte DB-User (nur OPS$-User) dürfen sich anmelden.
Diese User dürfen sich nicht per ssh am Betriebssystem anmelden. (Deshalb /bin/false).
Da der Nagios-User qqnagio dazu berechtigt ist, fällt er als DB-User flach. Trotzdem läuft der NRPE, der letztlich das Plugin aufruft, unter dem qqnagio-Account.
Verwendung von Environmentvariablen
Man kann den Parameter –connect (und ggf. –user und –password) ganz weglassen, wenn man die entsprechenden Daten in Environmentvariablen bereitstellt. Seit der Version 3.x kann man Servicedefinitionen in Nagios um eigene Attribute (custom object variables) erweitern. Diese tauchen dann bei der Ausführung des Checkcommands im Environment auf.
Die Environmentvariablen heissen:
- NAGIOS__SERVICEORACLE_SID (_oracle_sid in der Servicedefinition)
- NAGIOS__SERVICEORACLE_USER (_oracle_user in der Servicedefinition)
- NAGIOS__SERVICEORACLE_PASS (_oracle_pass in der Servicedefinition)
Installation
Dieses Plugin setzt die Installation der Perl-Module DBI und DBD::Oracle voraus.
Nach dem Auspacken des Archivs wird ./configure aufgerufen. Mit ./configure –help können Optionen angezeigt werden, die für den Bau des Plugins einige Defaulteinstellungen liefern.
- –prefix=BASEDIRECTORY Geben Sie hier das Verzeichnis an, in dem check_oracle_health liegen soll. (default: /usr/local/nagios)
- –with-nagios-user=SOMEUSER Dieser User wird der Eigentümer der Datei check_oracle_health sein. (default: nagios)
- –with-nagios-group=SOMEGROUP Die Gruppe des check_oracle_health Binaries. (default: nagios)
- –with-perl=PATHTOPERL Geben sie hier den Pfad zum Perl-Interpreter an, den sie benutzen möchten. (default: perl im PATH)
Download
check_oracle_health-1.6.3.tar.gz
check_oracle_health-1.6.3.shar.gz
Manche tar-Versionen haben Probleme wegen der langen Dateinamen. In diesem Fall entpacken sie bitte das shar-Paket mit cat check_oracle_health-xxx.shar.gz | gzip -d | sh
Changelog
- 2009-09-09 1.6.3
tablespace-can-allocate-next wurde optimiert.
Ungültige statefile-Namen gefixt. Danke Franky van Liedekerke.
Bugfix in tablespace-usage unter Oracle 8.1.x
switch-interval now arbeitet jetzt exakter. Danke Naquada.
Passwörter erscheinen nicht mehr in Fehlermeldungen. Danke Jens Seiffert.
Bugfix im mode sql. (Dezimalzahlen der Form .5 führten zu Fehlern). Danke Shane Jordan.
Bugfix in sga-latches-hitratio, Thresholds wurden ignoriert. Danke Yannik Charton.
Der Parameter –user heisst jetzt –username (user funktioniert aber noch)
- 2009-04-05 1.6.2 Bugfix in tablespace-usage/free wg. nicht-autoextensible TEMP-Tablespaces. (Danke Daniel Graef)
- 2009-03-27 1.6.1 –mode=tablespace-usage|free erkennt jetzt offline Tablespaces. (Danke Daniel Graef)
- 2009-03-11 1.6 Suport für DBD::SQLRelay. Mode sql kann jetzt mehrere Werte liefern (Danke Juergen Lesny). Login als "sys" möglich (Danke Joerg Horchler). Bugfix bei warning/critical=0 (Danke Danijel Tasov)
- 2008-10-28 1.5.0.1 Bugfix wg. , statt . in Dezimalzahlen. mode=sql Ergebnisse werden auf 2 Stellen gerundet. Bugfix in mode=sga-shared-pool-free. (Danke Birk Bohne)
- 2008-10-15 1.5 Neue Authentifizierungen mit password store und als sysdba. Neuer Mode tablespace-free. Neuer Parameter –units für mode=sql und mode=tablespace-free. Mode switch-interval berücksichtigt RAC (Danke Harald Zahn).
- 2008-09-19 1.4.2.1 Neuer Parameter –regexp ergänzt –name. Bugfix in tablespace-usage (>100% bei resize datafile)
- 2008-09-10 1.4.1 neuer Mode tablespace-can-allocate-next, Handling von gesperrten Accounts, Timeout-Bugfix, Encode, expired Extents im UNDO-Tablespace werden berücksichtigt, Bugfix wg. mode=sql und Null-Werten (Danke Viktor Käfer), mode=top10* optimiert.
- 2008-07-09 1.4.0.1 Bugfixes#(–name=0, –method=sqlplus), bei –invalid-objects und –stale-statistics werden jetzt Thresholds berücksichtigt (Danke Konrad Barck)
- 2008-07-03 1.4 Statesdir ist jetzt /var/tmp/check_oracle_health, Bugfixes in latch-contention, systats und roll-extends. Performanceverbesserungen.
- 2008-07-01 1.3.1.1 Bugfix in method=sqlplus und os$user, Bugfix in tablespace-usage bei Temp-Tablespaces, bessere Performancedaten für pga-in-memory-sort-ratio
- 2008-06-26 1.3.1 Code cleanup, Bugfix in connected-users Thresholds
- 2008-06-24 1.3 data-buffer/library/dictionary-cache-hitratio sind jetzt genauer, tablespace-usage berücksichtigt autoextents, sqlplus, code aufgeräumt
- 2008-06-20 1.2.7 bugfixes in top10-x und pga-in-memory-sort. Neuer Mode sql. Unrecoverable datafiles aus invalid-objects entfernt (bekommt später eigenen Mode)
- 2008-06-16 1.2.6.1 neue Modes sysstat list-sysstats
- 2008-06-14 1.2.6 neue Modes event-waited event-waits list-events
- 2008-06-11 1.2.5.1 internes Umkrempeln
- 2008-06-03 1.2.5 neue Modes latch-contention enqueue-contention enqueue-waiting connected-users list-latches list-enqueues
- 2008-05-27 1.2.4.1 neue Modes list-tablespaces und list-datafiles (keine Monitoringfunktion)
- 2008-05-27 1.2.4 neue Modes datafile-io-traffic und redo-io-traffic
- 2008-05-25 1.2.3.1 stale-statistics laufen jetzt auch unter 9.x
- 2008-05-25 1.2.3 neue Modes –roll-block-contention, –roll-hit-ratio, Bugfix in –switch-interval
- 2008-05-23 1.2.2.1 Modes, die mind. 10.x erfordern werden bei 9.x,8.x abgeschaltet.
- 2008-05-21 1.2.2 Bugfix in –environment
- 2008-05-19 1.2.1 sga-buffer-cache-hit-ratio zeigt jetzt Prozent (thx Maik Ihde), neue Parameter –runas –environment, Unterstützung von externally authenticated users, Bugfix in tablespace-remaining-time
- 2008-05-06 1.2 connection timeout handling, stale-statistics
- 2008-05-02 1.1 tablespace-remaining-time, tablespace-io-balance
- 2008-04-16 1.0 erste öffentliche Version
Copyright
2008 Gerhard Laußer
Check_oracle_health wird unter der GNU General Public License zur Verfügung gestellt. GPL
Autor
Gerhard Laußer (gerhard.lausser@consol.de) beantwortet gerne Fragen zu diesem Plugin.
38 Responses to “check_oracle_health”
-
Marco Says:
October 7th, 2009 at 12:58Hallo,
ich teste gerade Ihr Tool. Ich bin sehr begeistert davon, denn es nimmt mir viel Abreit ab. Leider habe ich ein kleines Problem mit dem mode sql ./check_oracle_health –connect ‘(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=172.16.102.103)(PORT=1521))(CONNECT_DATA=(SID=XYZ)))’ –user nagios –password oradbmon09 –mode sql –name ’select count(*) from v$session’ –name2 sessions –warning 100 –critical 150 ERgebnis: WARNING – sessions: 21 | ’sessions’=21;20;30
In Nagios eingebunden bekomme ich als Status Information nur OK – sessions: Hier müßte eigentlich ja auch die Warning kommen.
Skript:
define command{ command_name check_oracle_per_sql command_line $USER1$/check_oracle_health –connect ‘(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=$HOSTADDRESS$)(PORT=1521))(CONNECT_DATA=(SID=$ARG3$)))’ –user $ARG1$ –password $ARG2$ –mode sql –name ’select count(*) from v\$session’ –name2 sessions –warning 5 –critical 10 }
define service{ use local-service host_name test2_ch service_description Count Open Sessions2 check_command check_oracle_per_sql!nagios!abc!xyz }
Performance Daten werden auch nicht geschrieben.
Der Mode Tablespace funktioniert bei mir.
Gruß Marco
[Reply]
-
lausser Says:
October 8th, 2009 at 10:24Hallo, das liegt daran, dass Nagios empfindlich auf das Dollarzeichen in seinen Konfigdateien reagiert. Mit –name ’select count(*) from v$$session’ in der Command-Definition sollte es funktionieren. Eine Alternative wäre, SQL-Statements, die Sonderzeichen beinhalten, vorher zu encodieren. Das geht zwar auf Kosten der Lesbarkeit, dafür muss man sich aber keine Gedanken mehr bzgl. einfache/doppelte Hochkommata, Escapen etc. machen.
echo 'select count(*) from v$session' | check_oracle_health --mode encode select%20count%28%2A%29%20from%20v%24sessioncommand_line $USER1$/check_oracle_health ..... --name select%20count%28%2A%29%20from%20v%24session ....Gerhard
[Reply]
-
Marco Says:
October 9th, 2009 at 8:50Wunderbar es funktionert.
Eine Frage habe ich noch. Kann es sein, dass für einige Abfragen keine Performancedaten geschrieben werden? z.B. für sga-shared-pool-reloads ?
Marco
[Reply]
-
Marco Says:
October 9th, 2009 at 9:29Wenn ich keine Schwellwerte mitgebe, dann schreibt er nichts. Gebe ich welche an, dann werden auch Performancedaten geschrieben.
[Reply]
-
Marco Says:
October 9th, 2009 at 12:25Ich habe die gleiche Version. Bei mir war es so, dass er keine Performance-Daten nach “/usr/local/nagios/share/perfdata” geschrieben hat. Nachdem ich die Schwellwerte angegeben habe, ging es. Lag vielleich an mir.
Eine Frage habe ich nun doch schon wieder: Ich möchte mir “sga-data-buffer-hit-ratio” ausgeben lassen. Ergebnis: CRITICAL – SGA data buffer hit ratio 43.73% | sga_data_buffer_hit_ratio=43.73%;98:;95: Unter SQLPLUS kommt folgendes raus: SELECT ROUND((1-(phy.value / (cur.value + con.value)))*100,2) “Cache Hit Ratio” FROM v$sysstat cur, v$sysstat con, v$sysstat phy WHERE cur.name = ‘db block gets’ AND con.name = ‘consistent gets’ AND phy.name = ‘physical reads’;
Cache Hit Ratio
86.36Interpretier ich etwas falsch?
[Reply]
lausser Reply:
October 9th, 2009 at 16:07“db block gets” und die anderen Werte werden stur hochgezählt. Mit deinem SQL-Statement errechnest du die Hitratio über die gesamte Laufzeit der Instanz. Der Wert wird irgendwann sehr ungenau bzw. ändert sich nur sehr langsam. Bei check_oracle_health werden die Deltas dieser Zähler (zwischen dem aktuellen und dem letzten Lauf des Plugins) zur Berechnung verwendet. So bekommst du immer einen aktuellen Wert. (Den Mittelwert im check_interval).
[Reply]
-
Marco Says:
October 15th, 2009 at 15:04Ich habe schon wieder eine Frage: Kann ich mit “tablespace-usage” auch einige Tablespace excluden? Ich möchte alle TBS’s außer z.B. sysaux, system überwachen. Geht das?
[Reply]
lausser Reply:
October 15th, 2009 at 15:17Der Parameter –regexp sorgt dafür, dass der Parameter –name (mit dem man normalerweise einen Tablespace gezielt abfragt) als regulärer Ausdruck interpretiert wird. Wenn du also –name so formulierst, dass der Pattern alle Namen matcht ausser SYSTEM und SYSAUX, dann werden die beiden nicht angezeigt.
… –name=’^(?!(SYSTEM|SYSAUX))’ –regexp
Gerhard
[Reply]
-
Manuel Says:
October 18th, 2009 at 3:22HAllo aus Spanien , Wo kann ich check_oracle_health download ?’
DAnke
[Reply]
lausser Reply:
October 18th, 2009 at 16:11Ungefähr 80cm nach oben scrollen bis zur Überschrift “Download”.
[Reply]
-
guzik Says:
October 28th, 2009 at 11:35Hi, I’ve got a problem with check_oracle_health plugin. Status information in my Nagios: **ePN /usr/lib64/nagios/plugins/check_oracle_health: “Can’t exec “/usr/sbin/p1.pl”: Permission denied at (eval 1) line 5254,”. Few of check working fine, rest has got a problem. From console there is no problem to execute script. What can I do to correct check services?
[Reply]
lausser Reply:
October 29th, 2009 at 20:34Hi, please add one line in the first 10 lines of the plugin:
# nagios: -epn
This prevents Nagios from executing check_oracle_health with the embedded Perl interpreter. I will add this to the next release of the plugin as the default. Gerhard[Reply]
-
Steffen Poulsen Says:
November 9th, 2009 at 17:29I tried to run check_oracle_health at an install using perl, version 5.005_03 – and it barked at me:
Use of reserved word “our” is deprecated at check_oracle_health.pl line 9. Bareword “our” not allowed while “strict subs” in use at check_oracle_health.pl line 9. Unquoted string “our” may clash with future reserved word at check_oracle_health.pl line 9. Array found where operator expected at check_oracle_health.pl line 9, at end of line (Do you need to predeclare our?) syntax error at check_oracle_health.pl line 9, near “our @ISA ” Global symbol “@ISA” requires explicit package name at check_oracle_health.pl line 9. BEGIN not safe after errors–compilation aborted at check_oracle_health.pl line 80.
We are very fond of your plugin and would like to use it at this install also – is there per incidence a drag-and-drop replacement for the “our @ISA”-construct that would allow the check to run at this old install also?
Best regards, Steffen Poulsen
[Reply]
lausser Reply:
November 11th, 2009 at 22:35I think, this would require a major rewrite of the plugin. Can’t you run it on the Nagios server and check the database with a remote connection? Gerhard
[Reply]
-
SweetBiene91 Says:
November 11th, 2009 at 0:57hey ho bin so einsam jemand lust zu chattn oder so
[Reply]
lausser Reply:
November 11th, 2009 at 13:50Versuch’s mal hiermit: irc server : irc.irclink.net port : 6667 channel : #nagios
[Reply]
-
Manfred Says:
November 12th, 2009 at 18:17Gibt es eine Option (z.B. quiet) welche nur die Werte ausgeben läßt, welche ein warning oder critical ausgeben? Bei über 30 Tablespaces (bei –mode=tablespace-free) ist es fast unmöglich den zu finden, welcher das Warning ausgelöst hat. Ausserdem wird die Ausgabe in Nagios sehr unübersichtlich und viel zu lange. Ich habe schon im Source versucht, ein “if” einzubauen um die Ausgabe zu unterdrücken, bin damit aber gescheitert – da dann die Warnings selbst ausbleiben. Z.B. der orignal Nagios check der Filesysteme gibt auch nur die aus, welche warning oder critical sind.
[Reply]
lausser Reply:
November 12th, 2009 at 19:01Ich würde in dem Fall empfehlen, check_multi zu verwenden. Das hat ausserdem den Vorteil, dass Schwellwerte im check_multi-Konfigfile geändert werden können, ohne dass man Nagios neu starten muss. Wenn man die Tablespacenamen als Label angibt, so erhält man eine knappe Ausgabe 30 plugins checked, 1 critical (TBS_1), 1 warning (TBS_25), 0 unknown, 28 ok
[Reply]
-
fsom Says:
November 20th, 2009 at 15:54Tolles Script! Funktioniert soweit alles, nur bei mode=sql komme ich nicht weiter (v1.6.3): ./check_oracle_health –connect=DB –user=xxxxxx –password=yyyyyy –mode=sql –name=”select count(*) from v$session where status = ‘ACTIVE’”
Use of uninitialized value in numeric gt (>) at /usr/lib/nagios/plugins/check_oracle_health line 3615. Use of uninitialized value in numeric gt (>) at /usr/lib/nagios/plugins/check_oracle_health line 3616. OK – select count(*) from v where status = ‘active’:
ich bekomme nichts von dem SQL Befehl zurück. Mache ich etwas falsch ? danke, fsom
[Reply]
lausser Reply:
November 20th, 2009 at 16:42Du musst das Dollarzeichen entwerten. Dein Statement: from v$session where… Ausgabe: from v where… Für die Shell sieht $session wie eine Variable aus und da diese nicht existiert, macht sie einen Leerstring draus. Schreib stattdessen …from v\$session…. Wenn das SQL-Statement komplizierter ist und viele solcher Sonderzeichen enthält, kann man es auch encodieren. Dazu rufst du check_oracle_health mit dem Parameter “–mode encode” auf. Es liest dann von der Standardeingabe. Du tippst dein Statement (ohne auf Entwertung von Sonderzeichen achten zu müssen und schliesst es mit RETURN ab.
$ check_oracle_health --mode encode select count(*) from v$session where status = 'ACTIVE' select%20count%28%2A%29%20from%20v%24session%20where%20status%20%3D%20%27ACTIVE%27
Als Ausgabe erhältst du das Statement in encodierter Form, das du nun bei –name angeben kannst, ohne auf Dollar- oder irgendwelche Anführungszeichen achten zu müssen.[Reply]
-
Bas de Klerk Says:
November 28th, 2009 at 17:55Hi,
thx for your greate plugin. Saves me a lot of time!
One small problem I’m having in version 1.6.3 is that the sga-data-bufer-hit-ratio sometimes drops to 0%… no clue why but sometimes it does. If I calculate it by hand using statement below the values are fine. If you need any add. info please let me know. For now I’ve made a workaround using mod=sql
Regards Bas
SELECT ((P1.value + P2.value – P3.value) / (P1.value + P2.value))*100 ratio FROM v$sysstat P1, v$sysstat P2, v$sysstat P3 WHERE P1.name = ‘db block gets’ AND P2.name = ‘consistent gets’ AND P3.name = ‘physical reads’;
[Reply]
-
lausser Says:
November 28th, 2009 at 20:48I use the deltas (the difference to the counter value when check_oracle_health was run last time) for the calculation. E.g. the “physical reads” i use for the calculation is “value of physical reads now – value of physical reads approx. 5 minutes ago.” This way the hitrate reflects the current state of the buffer cache. In your formula you use the counters which increased since the database was started, so it’s an average hitrate over the whole lifetime. But isn’t it more interesting to get the current hitrate? When you get 0% sometimes, it actually means a hitrate of 0% (at least during the last check_interval).This is some kind of a “negative spike”. But i understand the problem. I will introduce a parameter “–lookback” which takes a number of minutes as argument. This way, you can for example measure the hitrate during the last 30 minutes, which is pretty up to date, but gives you much smoother results.
[Reply]
-
Andreas Says:
December 12th, 2009 at 8:44Hallo, bei mir funktionieren nur run 50% der Abfragen: z.B. TNSPING, CON.-TIME, CON.-USERS, invalid-objects . Aber bei einigen Abfragen z.B. sga-data-buffer-hit-ratio erhalte ich in Nagios folgende Fehlermeldung: **ePN /usr/lib/nagios/plugins/check_oracle_health: printf() on closed filehandle STATE at (eval 1) line 3841,. “-epn” habe ich schon eingebaut. auf der Kommandozeile funktioniert die Abfrage aber. Danke!
[Reply]
lausser Reply:
December 12th, 2009 at 14:45Kann es sein, dass du check_oracle_health auf der Kommandozeile als root ausgeführt hast? Das Plugin merkt sich nämlich Zwischenergebnisse im Verzeichnis /var/tmp/check_oracle_health, welches automatisch angelegt wird. Falls das Verzeichnis root gehört, kann ein check_oracle_health-Prozess, der unter der Nagios-Kennung läuft, da nicht mehr hineinschreiben. Die Fehlermeldung weist darauf hin. Ein “chown -R nagios:nagios /var/tmp/check_oracle_health” sollte das Problem lösen.
[Reply]
-
Erlon Says:
December 14th, 2009 at 14:41Where I find the download link?
[Reply]
-
Erlon Says:
December 14th, 2009 at 16:54But does not exist the Topic Download!
[Reply]
-
Erlon Says:
December 14th, 2009 at 20:41Ok, I can see now. I didn’t see before because, i was seeing the page in english, and in english this link dont exists.
[Reply]
-
Don Seiler Says:
January 8th, 2010 at 1:14Are there plans for ASM checks, such as disk group free space (v$asm_diskgroup.usable_file_mb)?
[Reply]
lausser Reply:
January 8th, 2010 at 11:40No, i actually have no plans (mostly because i’m too occupied with other things). But if you look in the contribs subdirectory, you’ll find a description how you can extend check_oracle_health with your own custom modes. You simply put the code (mostly the sql stements) in a separate file which is sourced at runtime. Perhaps you want to play around with this and post the result. If it works, i will gladly add it to the core plugin.
[Reply]
Don Seiler Reply:
January 14th, 2010 at 0:16@lausser, I’d love to do this if I have some time later. Thanks.
[Reply]
-
Millet JC Says:
January 13th, 2010 at 11:29Hello All
I’ve a small compilation error on a Solaris system. I’m not expert but think that it’s linked to my environment :
./configure work with success.
make give me this error :
Making all in plugins-scripts make: Fatal error: Don’t know how to make target
Nagios/DBD/Oracle/Server/Instance/SGA/SharedPool/DictionaryCache.pm' Current working directory /tmp/check_oracle_health-1.6.3/plugins-scripts *** Error code 1 The following command caused the error: failcom='exit 1'; \ for f in x $MAKEFLAGS; do \ case $f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=echo all-recursive | sed s/-recursive//; \ list='plugins-scripts t'; for subdir in $list; do \ echo "Making $target in $subdir"; \ if test "$subdir" = "."; then \ dot_seen=yes; \ local_target="$target-am"; \ else \ local_target="$target"; \ fi; \ (cd $subdir && make $local_target) \ || eval $failcom; \ done; \ if test "$dot_seen" = "no"; then \ make "$target-am" || exit 1; \ fi; test -z "$fail" make: Fatal error: Command failed for targetall-recursive’[Reply]
Millet JC Reply:
January 13th, 2010 at 11:29@Millet JC, Making all in plugins-scripts make: Fatal error: Don’t know how to make target
Nagios/DBD/Oracle/Server/Instance/SGA/SharedPool/DictionaryCache.pm' Current working directory /tmp/check_oracle_health-1.6.3/plugins-scripts *** Error code 1 The following command caused the error: failcom='exit 1'; \ for f in x $MAKEFLAGS; do \ case $f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=echo all-recursive | sed s/-recursive//; \ list='plugins-scripts t'; for subdir in $list; do \ echo "Making $target in $subdir"; \ if test "$subdir" = "."; then \ dot_seen=yes; \ local_target="$target-am"; \ else \ local_target="$target"; \ fi; \ (cd $subdir && make $local_target) \ || eval $failcom; \ done; \ if test "$dot_seen" = "no"; then \ make "$target-am" || exit 1; \ fi; test -z "$fail" make: Fatal error: Command failed for targetall-recursive’[Reply]
lausser Reply:
January 13th, 2010 at 16:01Looks like your tar-command does not support filenames which exceed 100 characters (i think SuSE has such a tar). Instead of the tar.gz please download the shar.gz and unpack it with [sourcecode]cat check_oracle_health-xxx.shar.gz | gzip -d | sh[/sourcecode]
[Reply]
-
Rascal Says:
January 25th, 2010 at 20:44Hallo, ich bin kein Datenbänker, sondern nur “Überwacher”, daher meine Frage: Gibt es eine Möglichkeit den Datenbank-Connect durch das Plugin zu erhalten? Durch den ständigen Auf- und Abbau der Verbindung, schwellen die Logdateien auf der DB an? Oder muss da was an der Datenbank-Config gemacht werden?
[Reply]
-
lausser Says:
January 26th, 2010 at 13:13Mit http://sqlrelay.sourceforge.net/ kann man einen Proxy laufen lassen, der die Verbindung aufrecht hält. Dadurch entfallen dann die Login-Meldungen in der Logdatei.
check_oracle_health --method sqlrelay --connect <proxy-ip>:<proxy-port> --username <proxy-user> --password <proxy-password> ...
[Reply]


lausser Reply:
October 9th, 2009 at 9:39
Das kann ich nicht nachvollziehen.
$ check_oracle_health --user nagios --password $ORAPW --connect NAPRAX --mode sga-shared-pool-reloads OK - SGA shared pool reload ratio 0.85% | sga_shared_pool_reload_ratio=0.85%;1;10 $ check_oracle_health -V check_oracle_health (1.6.3)Verwendest du die neueste Version? Gerhard[Reply]