Überwachung von Oracle-Datenbanken mit check_oracle_health G erha rd L a uß er ConSol* Software GmbH, München 07.09.08 www.consol.de Wer bin ich? Gerhard Laußer aus München arbeite bei der Firma ConSol* „lausser“ im Nagios-Portal 07.09.08 www.consol.de Oracle?? Hää???? Architekturübersicht Database process SGA Database process Database Database process process Instance Database process Database 07.09.08 www.consol.de Oracle?? Hääääää??? SGA Client Data Buffer Cache Shared Pool Library Cache Redo Buffer Dictionary Cache DBF 07.09.08 RDO RDO RDO www.consol.de Entstehungsgeschichte Kundenanforderung mit etlichen Punkten. Es gab ein paar Oracle-Plugins. Die deckten nur wenige der Anforderungen ab. Die unterschieden sich stark bei den Aufrufparametern. Da sowieso viel zu entwickeln war, musste etwas neues her Ein Plugin, das alle Anforderungen abdeckt mit konsistenten Kommandozeilenparametern mit Performancedaten mit leicht erweiterbarer Struktur 07.09.08 www.consol.de Wo bekomme ich es her? http://www.consol.de/opensource/nagios/check-oracle-health 07.09.08 www.consol.de Auspacken und Zusammenbauen tar zxvf check_oracle_health-1.4.0.1.tar.gz unzip check_oracle_health-1.4.0.1.zip sh check_oracle_health-1.4.0.1.shar cd check_oracle_health-1.4.0.1 ./configure –help ..... --libexecdir=DIR ...... --with-nagios-user=USER --with-nagios-group=GROUP --with-statefiles-dir=PATH --with-perl=PATH program executables [PREFIX/libexec] set user name to run nagios set group name to run nagios sets directory for the state files (default=/var/tmp/check_oracle_health) sets path to perl executable (default= perl im $PATH) ...... Ein funktionierendes DBD::Oracle oder zumindest eine funktionierende Oracle-ClientInstallation muss natürlich auch vorhanden sein. 07.09.08 www.consol.de So sieht's aus Der einfachste Fall: ist die Datenbank/Listener erreichbar? $ check_oracle_health --connect=ora10 --mode=tnsping OK - connection established to ora10. Der zweiteinfachste Fall: kann man sich einloggen und wie lange dauert das? $ check_oracle_health --connect=nagios/oramon@ora10 --mode=connection-time OK - 0.10 seconds to connect as NAGIOS | connection_time=0.1046;1;5 07.09.08 www.consol.de Der Connectstring mit Username und Passwort ausführlich: check_oracle_health –-connect=<sid> --username=<user> --password=<pass> ... oder zusammengesetzt: check_oracle_health –-connect=<username>/<passwort>@<sid> ... oder mit custom variables in der Servicedefinition: export NAGIOS__SERVICEORACLE_SID=<sid> export NAGIOS__SERVICEORACLE_USER=<user> export NAGIOS__SERVICEORACLE_PASS=<pass> check_oracle_health ... 07.09.08 # _oracle_sid # _oracle_user # _oracle_pass www.consol.de Der Connectstring bei „external authentification“ Es geht auch ohne Passwort mit „external authentification“ (z.b. bei SAP): CREATE USER OPS$SEPP IDENTIFIED EXTERNALLY; sepp$ export ORACLE_SID=ora10 sepp$ sqlplus / SQL> sepp$ check_oracle_health –-connect=<sid> ... OK - 0.14 seconds to connect as OPS$SEPP | connection_time=0.1422;1;5 07.09.08 www.consol.de Benötigte Privilegien create user nagios identified by 'dingsbums'; 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; 07.09.08 www.consol.de Komponenten des Plugins Das endgültige Plugin wird aus lauter einzelnen Perl-Modulen zusammengebaut: Nagios/DBD/Oracle/Server.pm Nagios/DBD/Oracle/Server/Database.pm Nagios/DBD/Oracle/Server/Database/Tablespace.pm Nagios/DBD/Oracle/Server/Database/Tablespace/Datafile.pm Nagios/DBD/Oracle/Server/Database/Tablespace/Segment.pm Nagios/DBD/Oracle/Server/Instance.pm Nagios/DBD/Oracle/Server/Instance/SGA.pm Nagios/DBD/Oracle/Server/Instance/SGA/DataBuffer.pm Nagios/DBD/Oracle/Server/Instance/SGA/SharedPool.pm Nagios/DBD/Oracle/Server/Instance/SGA/SharedPool/DictionaryCache.pm Nagios/DBD/Oracle/Server/Instance/SGA/SharedPool/LibraryCache.pm Nagios/DBD/Oracle/Server/Instance/SGA/RollbackSegments.pm Nagios/DBD/Oracle/Server/Instance/SGA/Latch.pm Nagios/DBD/Oracle/Server/Instance/SGA/RedoLogBuffer.pm Nagios/DBD/Oracle/Server/Instance/PGA.pm Nagios/DBD/Oracle/Server/Instance/Enqueue.pm Nagios/DBD/Oracle/Server/Instance/Event.pm Nagios/DBD/Oracle/Server/Instance/Sysstat.pm Nagios/DBD/Oracle/Server/Instance/Waitevent.pm 07.09.08 www.consol.de Warum so viele Perl-Module? Neue Funktionalität soll schnell implementiert werden können. Man muss sich nicht durch seitenweise Code wühlen. Eventuell vorhandene (firmenspezifische) Scripts können möglicherweise in einem eigenem Modul untergebracht werden. 07.09.08 www.consol.de Nochmal ein Beispiel, bevor's losgeht Wieviele User sind angemeldet? Es kann vorkommen, daß Firewalls die Verbindung zum User hin abbrechen, aber die Datenbank davon nichts mitbekommt. $ check_oracle_health --mode=connected-users OK - 38 connected users | connected_users=38;50;100 07.09.08 www.consol.de Der Parameter --mode Was genau das Plugin messen/bewerten soll, gibt man mit dem Kommandozeilenparameter --mode an: --mode=tnsping --mode=connected-users --mode=sga-data-buffer-hit-ratio --mode=stale-statistics --mode=tablespace-usage ..... Sinnvolle Vorschläge sind ausdrücklich erwünscht! 07.09.08 www.consol.de Kategorien von Checks Die Modes lassen sich grob einteilen: Verbindung/Sessions Performance/Cachehitraten/SGA Integrität Tablespaces/Datafiles IO Latches/Enqueues Events/Stats SQL 07.09.08 www.consol.de DB-Verbindung / Sessions $ check_oracle_health --connect=ora10 --mode=tnsping OK - connection established to ora10. $ check_oracle_health --connect=nagios/oradbmon@ora10 --mode=connection-time OK - 0.10 seconds to connect as SYSTEM | connection_time=0.0954;1;5 $ check_oracle_health --connect=nagios/oradbmon@ora10 --mode=connected-users OK - 21 connected users | connected_users=21;50;100 07.09.08 www.consol.de Performence / SGA # das kennt jeder DBA: Data Buffer Cache (Datenblöcke im RAM?) $ check_oracle_health --mode=sga-data-buffer-hit-ratio OK - SGA data buffer hit ratio 100.00% | sga_data_buffer_hit_ratio=100.00%;98:;95: # Bereits geparste SQL Statements $ check_oracle_health --mode=sga-library-cache-hit-ratio CRITICAL - SGA library cache hit ratio 86.73% | sga_library_cache_hit_ratio=86.73%;98:;95: # Bereits verwendete Datenbankobjekte, Tabellen, Spaltennamen $ check_oracle_health --mode=sga-dictionary-cache-hit-ratio OK - SGA dictionary cache hit ratio 98.41% | sga_dictionary_cache_hit_ratio=98.41%;95:;90: # Schutz von Objekten im Speicher vor konkurrierendem Zugriff $ check_oracle_health --mode=sga-latches-hit-ratio OK - SGA latches hit ratio 99.97% | sga_latches_hit_ratio=99.97%;98:;95: 07.09.08 www.consol.de Performance # Der Shared Pool umfasst den Library Cache, Dictionary Cache,... check_oracle_health --mode=sga-shared-pool-free OK - SGA shared pool free 21.48% | sga_shared_pool_free=21.48%;10:;5: # Objekt wurde gesucht, war nicht vollst. im Lib.Cache und musste neu geladen werden. check_oracle_health --mode=sga-shared-pool-reloads OK - SGA shared pool reloads 0.67% | sga_shared_pool_reloads=0.67%;1;10 # Werden die Sort-Operationen im RAM ausgeführt? 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: # Sind SQL-Statements ohne Reload wiederverwendbar (mehr ? Variable verwenden) check_oracle_health --mode=soft-parse-ratio WARNING - Soft parse ratio 97.53% | soft_parse_ratio=97.53%;98:;90: 07.09.08 www.consol.de Integrität z.b. Trigger oder PL/SQL referenziert eine Tabelle, die gelöscht wurde $ check_oracle_health --mode=invalid-objects CRITICAL - 25 invalid objects | invalid_ind_partitions=0 invalid_indexes=0 invalid_objects=25 Aktuelle Statistiken helfen dem Optimizer. $ check_oracle_health --mode=stale-statistics WARNING - 19 objects with stale statistics | stale_stats_objects=19;10;100 07.09.08 www.consol.de Tablespaces Mit –mode=list-tablespaces kann man sich einen Überblick verschaffen $ check_oracle_health --mode=list-tablespaces SYSAUX SYSTEM TEMP UNDOTBS1 USERS XD73S_DAT_TAB OK - have fun 07.09.08 www.consol.de Tablespaces $ check_oracle_health --mode=tablespace-usage OK - tbs XD73S_DAT_TAB usage is 59.51%, tbs USERS usage is 76.82%, tbs UNDOTBS1 usage is 0.00%, tbs TEMP usage is 0.00%, tbs SYSTEM usage is 2.48%, tbs SYSAUX usage is 1.58% | 'tbs_xd73s_dat_tab_usage_pct'=59%;90;98 'tbs_xd73s_dat_tab_usage'=2975MB; 4500;4900;0;5000 'tbs_xd73s_dat_tab_alloc'=3000MB;;;0;5000 'tbs_users_usage_pct'=76%; 90;98 'tbs_users_usage'=25172MB;29491;32112;0;32767 'tbs_users_alloc'=29547MB;;;0;32767 'tbs_undotbs1_usage_pct'=0%;90;98 'tbs_undotbs1_usage'=0MB;29491;32112;0;32767 'tbs_undotbs1_alloc'=1135MB;;;0;32767 'tbs_temp_usage_pct'=0%;90;98 'tbs_temp_usage'=0MB;29491;32112;0;32767 'tbs_temp_alloc'=588MB;;;0;32767 'tbs_system_usage_pct'=2%;90;98 'tbs_system_usage'=811MB;29491;32112;0;32767 'tbs_system_alloc'=820MB;;;0;32767 'tbs_sysaux_usage_pct'=1%;90;98 'tbs_sysaux_usage'=516MB;29491;32112;0;32767 'tbs_sysaux_alloc'=540MB;;;0;32767 Das ist unübersichtlich und kann sehr leicht länger als 1024 Bytes werden (Schnipp!) Anm. Mit dem Parameter -3 wird bei > 200 Zeichen das Nagios 3.x Format verwendet. Wenns unbedingt in einen einzigen Service reinsoll, dann check_multi verwenden. 07.09.08 www.consol.de Tablespaces Mit dem Parameter –name kann man einzelne Objekte herauspicken $ check_oracle_health --mode=tablespace-usage --name=USERS OK - tbs USERS usage is 76.82% | 'tbs_users_usage_pct'=76%;90;98 'tbs_users_usage'=25172MB;29491;32112;0;32767 'tbs_users_alloc'=29547MB;;;0;32767 $ check_oracle_health --mode=tablespace-usage --name=XD73S_DAT_TAB --warning=50 WARNING - tbs XD73S_DAT_TAB usage is 59.51% | 'tbs_xd73s_dat_tab_usage_pct'=59%;50;98 'tbs_xd73s_dat_tab_usage'=2975MB;2500;4900;0;5000 'tbs_xd73s_dat_tab_alloc'=3000MB;;; 0;5000 07.09.08 www.consol.de Tablespaces # Free Space Fragmentation Index. (Nur noch für DICTIONARY managed Tablespaces relevant) # 100=ideal check_oracle_health -–mode=tablespace-fragmentation --tablespace=ARSYSTEM OK - tbs ARSYSTEM fsfi 70.91 | 'tbs_arsystem_fsfi'=70.91;30:;20:;0;100 07.09.08 www.consol.de Tablespaces # Ist physical IO gleichmäßig über die Datafiles verteilt? check_oracle_health –-mode=tablespace-io-balance –tablespace=PERFSTAT CRITICAL - PERFSTAT datafiles PERFSTAT3.dbf,PERFSTAT2.dbf io unbalanced (106.872241) | tbs_PERFSTAT_io_cv'=12.94%;50.00;100.00 cv = relative Standardabweichung zum. Je mehr sich die IOs der einzelnen Datafiles vom Mittelwert entfernen, desto größer wird cv. Ausschlaggebend für den Exitcode ist nicht Gesamt-cv, sondern die Abweichung des Datafiles, welches am meisten aus der Reihe tanzt, genauer gesagt das prozentuale Verhältnis der Abweichung vom Mittelwert im Verhältnis zur Standardabweichung. (im Bsp. 106% Abw. vom cv) Es werden nur die Ausreisser unter den Datafiles angezeigt. Für Alarmierung eher ungeeignet, besser nur zur Langzeitbeobachtung verwenden. 07.09.08 www.consol.de Tablespaces # Wie lange noch, bis der Tablespace voll ist? check_oracle_health –-mode=tablespace-remaining-time --tablespace=SYSLOG CRITICAL - tablespace SYSLOG will be full in 28 days 'tbs_syslog_days_until_full'=28;90:;30: Hier kommt noch der Parameter –lookback=<Anzahl von Tagen> zum Tragen. Welcher Zeitraum wird zur Berechnung herangezogen? (default: 30) # Dictionary managed Tablespaces $ check_oracle_health –mode=tablespace-can-allocate-next --name=XD73S_DAT_TAB OK - tablespace XD73S_DAT_TAB free extents are large enough Seit längerem sind locally managed Tablespaces der Standard, die sowas automatisch regeln. 07.09.08 www.consol.de Datafiles $ check_oracle_health --mode=list-datafiles XD73S_DAT_TAB.dbf sysaux01.dbf system01.dbf temp01.dbf undotbs01.dbf users01.dbf OK - have fun 07.09.08 www.consol.de Datafiles $ check_oracle_health --mode=datafile-io-traffic OK - users01.dbf: 0.01 IO Operations per Second, undotbs01.dbf: 0.00 IO Operations per Second, temp01.dbf: 0.00 IO Operations per Second, system01.dbf: 0.00 IO Operations per Second, sysaux01.dbf: 0.00 IO Operations per Second, XD73S_DAT_TAB.dbf: 0.00 IO Operations per Second | 'dbf_users01.dbf_io_total_per_sec'=0.01;1000;5000 'dbf_undotbs01.dbf_io_total_per_sec'=0.00;1000;5000 'dbf_temp01.dbf_io_total_per_sec'=0.00;1000;5000 'dbf_system01.dbf_io_total_per_sec'=0.00;1000;5000 'dbf_sysaux01.dbf_io_total_per_sec'=0.00;1000;5000 'dbf_XD73S_DAT_TAB.dbf_io_total_per_sec'=0.00;1000;500 $ check_oracle_health --mode=datafile-io-traffic --name=users01.dbf OK - users01.dbf: 119.26 IO Operations per Second |'dbf_users01.dbf_io_total_per_sec'=119.26;1000;5000 Damit lassen sich schöne Graphen malen. 07.09.08 www.consol.de Rollback Segmente Segmente im UNDO-Tablespace. Werden benutzt, um Änderungen von Daten wieder rückgängig zu machen. check_oracle_health --mode=roll-hit-ratio OK - Rollback segment hit ratio is 100.00% | rollback_segment_hit_ratio=100.00%;99:;98: # 100 – waits/gets; Wenn < 99% , dann braucht man mehr Rollbacksegmente check_oracle_health --mode=roll-header-contention CRITICAL - Rollback segment header contention is 49.62% | rollback_segment_header_contention=49.62%;1;2 # mehr Segmente! (außer man verwendet UNDO Tablespaces) check_oracle_health --mode=roll-block-contention CRITICAL - Rollback segment block contention is 23.42% | rollback_segment_block_contention=23.42%;1;2 # größere Segmente! 07.09.08 www.consol.de Rollback Segmente check_oracle_health –mode=roll-wraps OK - Rollback segment wraps 0.00/sec | rollback_segment_wraps=23;1;100 rollback_segment_wraps_rate=0.00;1;100 # größere Segmente verwenden check_oracle_health --mode=roll-extends OK - Rollback segment extends 0.00/sec | rollback_segment_extends=10;1;100 rollback_segment_extends_rate=0.00;1;100 Am besten jemanden fragen, der sich damit auskennt... 07.09.08 www.consol.de Redo Logs $ check_oracle_health --mode=redo-switch-interval OK - Last redo log file switch interval was 1781 minutes | redo_log_file_switch_interval=106882s;600:;60: $ check_oracle_health --mode=redo-retry-ratio OK - Redo log retry ratio is 0.000229% | redo_log_retry_ratio=0.000229%;1;10 # LGWR retries : entries; >1% = Redo Log Buffer vergrößern $ check_oracle_health --mode=redo-io-traffic OK - Redo log io is 0.000002 MB/sec | redo_log_io_per_sec=0.000002;100;200 07.09.08 www.consol.de Top 10 aus v$segstat Gibt es Userprozesse unter den Top10 auf Segment-Ebene? $ check_oracle_health --mode=seg-top10-logical-reads WARNING - 5 user processes among the top10 logical reads | users_among_top10_logical_reads=5;1;9 $ check_oracle_health --mode=seg-top10-physical-reads WARNING - 7 user processes among the top10 physical reads | users_among_top10_physical_reads=7;1;9 $ check_oracle_health --mode=seg-top10-buffer-busy-waits OK - 1 user processes among the top10 buffer busy waits | users_among_top10_buffer_busy_waits=1;1;9 $ check_oracle_health --mode=seg-top10-row-lock-waits OK - 1 user processes among the top10 row lock waits | users_among_top10_row_lock_waits=1;1;9 07.09.08 www.consol.de Statistiken In der View v$sysstats sammelt Oracle unzählige Meßwerte $ check_oracle_health --mode=list-sysstats 286 CCursor + sql area evicted 12 CPU used by this session 11 CPU used when call started 108 CR blocks created 344 bytes received via SQL*Net from client 66 physical write bytes 139 redo blocks written <- das interessiert mich 189 transaction rollbacks ...... 07.09.08 www.consol.de Statistiken $ check_oracle_health --mode=sysstat --name=139 OK - 0.375000 redo blocks written/sec | 'redo blocks written_per_sec'=0.375000;10;100 'redo blocks written'=3 Vorsicht! Die Zahl ist nicht bei allen Oracle-Versionen gleich. Besser man verwendet den Namen $ check_oracle_health --mode=sysstat --name="redo blocks written" OK - 1.000000 redo blocks written/sec | 'redo blocks written_per_sec'=1.000000;10;100 'redo blocks written'=11 Und wenn der Name viele Ramschzeichen enthält und man sich die Servicedefinition einfach machen will: echo „redo blocks written“ | check_oracle_health –mode=encode redo%20blocks%20written $ check_oracle_health --mode=sysstat --name=redo%20blocks%20written OK - 0.468750 redo blocks written/sec | 'redo blocks written_per_sec'=0.468750;10;100 'redo blocks written'=15 07.09.08 www.consol.de Events Wenn ein SQL-Statement ausgeführt wird, wird es gelegentlich unterbrochen und muss warten. Ein bestimmter „Event“ muss passieren, bevor das Statement weiter ausgeführt werden kann. $ check_oracle_health –mode=list-background-events 2326919048 da_fi_in_wr Data file init write 1989349184* sg_mm_sl_fo_co_sh SGA: MMAN sleep for component shrink 2161531084 bu_bu_wa buffer busy waits 4078387448 co_fi_pa_wr control file parallel write 3213517201 co_fi_se_re control file sequential read 1729366244 cu_pi_s_wa_on_x cursor: pin S wait on X 506183215 db_fi_sc_re db file scattered read 2652584166 db_fi_se_re db file sequential read 1307477558 db_fi_si_wr db file single write $ check_oracle_health –mode=list-events noch viel, viel mehr ..... in der zweiten Spalte steht ein (eindeutig) verkürzter Name, der alternativ zum langen Namen angegeben werden kann. 07.09.08 www.consol.de Events Beispiel: Wie oft und wie lange wird gewartet, bis ein Datenblock in den Data Buffer geladen wurde. $ check_oracle_health --mode=event-waiting --name=bu_bu_wa OK - buffer busy waits waits 0.001305% of the time | 'buffer busy waits_percent_waited'=0.001305%;0.1;0.5 Die Zeit, die sämtliche Datenbankprozesse mit Warten verbracht haben im Verhältnis zur verstrichenen Zeit seit dem letzten Lauf. $ check_oracle_health --mode=event-waits --name=bu_bu_wa OK - buffer busy waits : 0.005979 waits/sec | 'buffer busy waits_waits_per_sec'=0.005979;10;100 Hardcore-DBAs fragen. Die wissen sicher, auf welche Events man ein Auge haben sollte. (buffer busy waits, db file scattered read, db file sequential read, free buffer waits, latch free, log buffer space, log file sync, enqueue, SQL*Net more data from client, SQL*Net more data to client, write complete wait) 07.09.08 www.consol.de Latches Latches sind Sperren auf niedriger Ebene, die Speicher und Strukturen vor konkurrierender Veränderung schützen. $ check_oracle_health --mode=list-latches|more 000 event range base latch 001 post/wait queue 002 hot latch diags 003 process allocation 004 session allocation 005 session switching 006 process group creation 007 session idle bit 008 client/application info 009 longop free list parent DBA fragen, welche Latches er beobachten will oder für sämtliche Latches Kurven malen lassen. 07.09.08 www.consol.de Latches $ check_oracle_health --mode=latch-contention --name=214 OK - SGA latch library cache (#214) contention 0.03% | 'latch_214_contention'=0.03%;1;2 'latch_214_gets'=10555 # wie oft wollten Prozesse und konnten nicht (v$latch misses : gets) # am besten im Zusammenhang mit der absoluten Anzahl von gets sehen. $ check_oracle_health --mode=latch-waiting --name=214 OK - SGA latch library cache (#214) sleeping 0.000105% of the time | 'latch_214_sleep_share'=0.000105%;0.1;1;0;100 # wie lange mussten Prozesse auf ihren exclusiven Zugriff warten 07.09.08 www.consol.de Enqueues Enqueues sind ähnlich wie Latches. Die auf ein Latch wartenden Prozesse kommen rein zufällig zum Zug (Timer wakeup, retry, spin), Enqueues sind FIFOs. $ check_oracle_health --mode=list-enqueues AF AS CF ... Beispiel: TM = Table Lock $ check_oracle_health --mode=enqueue-contention --name=TM OK - enqueue TM DML Enqueue: 0.00% of the requests must wait | 'TM_contention'=0.00%;1;10 'TM_requests'=725 'TM_waits'=0 $ check_oracle_health --mode=enqueue-waiting --name=TM OK - enqueue TM DML Enqueue: waiting 0.0000% of the time | 'TM_ms_waited'=0 'TM_pct_waited'=0.000000%;0.0003333;0.003333 07.09.08 www.consol.de SQL Statements Mit –mode=sql lassen sich beliebige SQL-Statements ausführen. Wichtig ist, daß sie ein numerisches Ergebnis liefern, welches mit den Schwellwerten verglichen werden kann. Beispiel: in der Tabelle „lzamqdetektoren“ gibt es ein Feld „datumdb“, welches auf den Zeitpunkt des Inserts des jeweiligen Datensatzes gesetzt wird. max(datumdb) ist somit die Zeit des letzten Inserts. Es soll gewarnt/alarmiert werden, wenn seit über 5/15 Minuten keine neuen Daten mehr eingetragen wurden. SELECT (sysdate - max(datumdb)) * 24 * 60 from lzamqdetektoren liefert die Minuten seit dem letzten Eintrag. check_oracle_health –mode=sql --name=select%20nvl%28%28sysdate%20%2D%20max %28datumdb%29%29%20%2A%2024%20%2A%2060%2C%209999%29%20from %20lzamqdetektoren –name2=lzamqlast –warning=5 --critical=15 CRITICAL - lzamqlast: 69151.670000 | 'lzamqlast'=69151.670000;5;15 Der Parameter name2 „verschönert“ die Ausgabe. Ohne ihn würde das SQL-Statement erscheinen. 07.09.08 www.consol.de War's das? TODO Clusterzeugs Lokale Prozesse Unterstützung von http://sqlrelay.sourceforge.net/ 07.09.08 www.consol.de