KenntWas.de – Technische Tipps

Technische Informationen zu Linux, (Oracle-) Datenbanken und mehr

check_oracle_health unter Windows: zusätzliche Tipps

| 4 Comments

Das Nagios-Plugin check_oracle_health wurde ursprünglich für Linux geschrieben. Da es sich um ein Perlscript handelt, sollte es doch auch unter Windows lauffähig sein. Gerhard Lausser hat eine Anleitung für den Betrieb unter Windows geschrieben. Hier noch ein paar zusätzliche Tipps dazu.

Warum unter Windows?

Es kann mehrere Gründe geben, warum man das Nagios-Plugin (z.B. durch nrpe) unter Windows laufen lassen will / muss.

  • Auf dem Nagios-Server ist kein Oracle-Client installiert oder es gab Probleme bei der Installation der Oracle (Instant-) Clients.
  • Die Datenbanken sind – aus welchen Gründen auch immer – nicht direkt von den Nagios Servern erreichbar
  • Das Plugin soll vor dem produktiven Einsatz getestet werden

Perl

Vorsicht:

Oracle benutzt ggf. auch perl. Seid vorsichtig, dass Ihr Eure Umgebung nicht ‘zerschießt’!

Auf einem Windows Datenbankserver sollten keine zusätzlichen Tools (perl, cygwin) ‘einfach so’ installiert werden!

Für Windows gibt es

DBD::Oracle

Wenn check_oracle_health direkt auf die Datenbanken zugreifen soll, muss DBD::Oracle installiert werden.
Bei Verwendung des Parameters “–method sqlplus” ist DBD::Oracle nicht erforderlich, da dann alle Zugriffe über Oracle’s sqlplus erfolgen. sqlplus muss dann natürlich installiert sein.

configure; make install

Das unter Linux ganz normale “configure; make; make install” wird dem normalen Windows Benutzer schwer fallen.
In einer cygwin – Umgebung (Linux unter Windows) oder einem ‘richtigen’ Linux ist dies einfach zu bewerkstelligen.

Technisch wird bei diesem Vorgang aus check_oracle_health.pl und mehreren Moduldateien das Endergebnis check_oracle_health erstellt. Diese Datei ist alles, was genötigt wird; sie ist alleine lauffähig. Für alle, die kein Linux zur Hand haben, gibt es ausnahmsweise und ohne Gewähr hier die Version 1.6.9 in fertiger Form (.pl-Datei und .bat Datei als Alternative). Die offizielle Version und Dokumentation findet Ihr auf der check_oracle_health Homepage unter Downloads. Eine Aternative ist die Open Monitoring Distribution OMD (für Linux!), hier ist das Plugin auch schon fix-und-fertig mit dabei.

Umgebungsvariable PERL5LIB

Manche Oracle-Installationen setzen die Umgebungsvariable PERL5LIB auf die (alten) Perl-Libraries, die mit Oracle 10 mitgeliefert werden.

Die Umgebungsvariable muss man löschen:

set PERL5LIB=

Sonst bekommt man z.B. diese Fehlermeldung (Oracle’s perl.exe im Pfad ist zu alt!):

e:\...\check_oracle_health-1.6.9\plugins-scripts>.\check_oracle_health
Use of :unique is deprecated at G:\oracle\product\10.2.4\db_1\perl\5.8.3\lib/MSWin32-x86-multi-thread/Config.pm line 39.
Use of :unique is deprecated at G:\oracle\product\10.2.4\db_1\perl\5.8.3\lib/MSWin32-x86-multi-thread/Config.pm line 80.
Perl lib version (v5.8.3) doesn't match executable version (v5.12.4) at G:\oracle\product\10.2.4\db_1\perl\5.8.3\lib/MSW
in32-x86-multi-thread/Config.pm line 32.
Compilation failed in require at G:\oracle\product\10.2.4\db_1\perl\5.8.3\lib/MSWin32-x86-multi-thread/DynaLoader.pm lin
e 25.
BEGIN failed--compilation aborted at G:\oracle\product\10.2.4\db_1\perl\5.8.3\lib/MSWin32-x86-multi-thread/DynaLoader.pm
 line 25.
Compilation failed in require at G:\oracle\product\10.2.4\db_1\perl\5.8.3\lib/MSWin32-x86-multi-thread/Time/HiRes.pm lin
e 7.
Compilation failed in require at .\check_oracle_health line 3786.
BEGIN failed--compilation aborted at .\check_oracle_health line 3786.

oder diesen Fehler (PERL5LIB stört):

Perl lib version (v5.8.3) doesn't match executable version (v5.12.4) at ...

pl2bat

Mit pl2bat kann man sich aus check_oracle_health (dem vollständigen Perl-Script) eine Batchdatei check_oracle_health.bat erstellen lassen.

pl2bat check_oracle_health

Das macht den Aufruf und das Testen erheblich einfacher.
Wie oben schon beschrieben, gibt es u.U. Probleme mit der Umgebungsvariable PERL5LIB. Daher noch eine kleine Anpassung an der .bat-Datei

@rem = '--*-Perl-*--
@echo off

@rem MN: Unset PERL5LIB (otherwise Oracle's outdated libraries would be used)
@set PERL5LIB=

if "%OS%" == "Windows_NT" goto WinNT
perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9

Zusätzlich kann (und sollte?) man hier noch den absoluten Pfad zu dem ‘richtigen’ perl eintragen (2 Stellen!).

 

Vorsicht:

Die .bat-Datei unterstützt nur 9 Kommandozeilenparameter (%1 – %9). Das kann schon mal eng werden. sql-Statements lassen sich unter Windows nicht so einfach übergeben wie unter Linux (wegen der schlechten / fehlenden Quotes). Für die normalen Checks sollte es aber reichen.

perl2exe

Gerhard Lausser beschreibt in check_oracle_health unter Windows einen anderen Weg:

  • keine (zusätzliche) Perlinstallation auf dem Zielsystem
  • Vorbereitung auf einer anderen Maschine
  • Erzeugen von check_oracle_health.exe mit pp aus dem CPAN Modul PAR::Packer
  • Übertragen der .exe auf die Zielmaschine

Leider hat das bei mir nicht funktioniert. Mein Virenscanner mag keine Programme, die aus .pl-Dateien Executables erstellen.

SIGALRM unter Windows32

Unter Windows gibt es keine Signals. Dies ist anscheinend unter Win32 ein besonderes Problem.
(Siehe: http://www.perlmonks.org/?node_id=794938)

e:>.\check_oracle_health.bat --connect=//localhost:1521/nie1.world --username=nagios --password=nagios --mode=connection-time
CRITICAL - cannot connect to //localhost:1521/nie1.world.
Your vendor has not defined POSIX macro SIGALRM,
used at .\check_oracle_health.bat line 4700

Wenn dies Problem auftritt, wird check_oracle_health im ‘Native Mode’ (mit Zugriff DBD:.Oracle) nicht funktionieren.

Abhilfe: –method=sqlplus

Mit “–method=sqlplus” läuft das Programm auch unter win32.

Mit ‘normalem’ Connect (Eintrag in tnsnames.ora erforderlich):

e:>.\check_oracle_health.bat --method=sqlplus --connect=nagios/nagios@nie1.world  --mode=connection-time
OK - 0.30 seconds to connect as NAGIOS | connection_time=0.2956;1;5

oder mit EZCONNECT:

e:>.\check_oracle_health.bat --method=sqlplus --connect=//localhost:1521/nie1.world --username=nagios --password=nagios --mode=connection-time
OK - 0.23 seconds to connect as NAGIOS | connection_time=0.2325;1;5

In diesem Beispiel wird Easy-Connect (EZCONNECT) anstatt “–connect=user/passwort@servicename” verwendet.
Vorteil: Es wird keine tnsnames.ora benötigt. Nachteil: es muss auf Client und Server erlaubt sein (sqlnet.ora) bzw. darf dort nicht verboten sein.

Siehe auch: Check_oracle_health kann EZCONNECT von Gerhard Lausser.

Fazit

Es funktioniert. Spannend kann es bei eigenen Checks mit den Limitierungen auf der Kommandozeile unter Windows werden. Die Windows-Admin wünschen sich wahrscheinlich eine .exe, die stand-alone läuft. Die kann ich aber nicht bereitstellen.

 

 

4 Comments

  1. Hello Lausser,

    in the past I asked you related some error messages which shown by nagios regarding check_oracle_health plugin. Itself the plugin is installed and is running, but sometimes we receive error messages like

    **ePN /usr/local/nagios/libexec/check_oracle_health:’Can’t open /tmp/server::database::tablespace::freeVu1kJ.out:No such file or directory at (eval18)line 4631,chunk2.” You recommand to upgrade my actual version 1.6.4 to the newest one. But at the moment we use sles9 sp4 and have not the possibility to upgrade to sles11 sp1. So, we are not able to upgrade the plugin at the moment. Do you have any other solution for us to fix this problem?

    BR, Christina

    • @christina:
      this is not laussers’s site. Please have a look at
      http://labs.consol.de/lang/de/nagios/check_oracle_health/ for the documentation and download
      and
      the forum
      http://labs.consol.de/lang/de/forum/#/discussions
      for discussions.

      The actual version of check_oracle_health is 1.6.9, you are using 1.6.4.
      check_oracle_health uses some temporary files to cache some information between calls.
      In the actual version of the plugin they are stored in /var/tmp/check_oracle_health/…

      I dont’t know, whether sles 9 is supported by check_oracle_health (it might be a question of the perl-version SLES9 is using). You are using Oracle 9 – do you?

      Before anything else, you should check (in this order):
      - is there enough space on the filesystem (df -k /tmp)?
      - is /tmp/ writable by the plugin? (Unix-User has enough rights?)
      - call check_oracle_health by hand (any errors?)

      ./check_oracle_health --connect user/pass@yourdb --mode tablespace-free

      - has the oracle-user enough permissions in your db?
      sqlplus:

         select * from dba_free_space;
         select * from dba_tablespaces;
      

      if this does not solve the problem:
      - check out the newest version of http://labs.consol.de/lang/de/nagios/check_oracle_health/
      to a local folder
      - configure; make # (no make install yet)
      - test the plugin (does it work with perl/oracle of your system?)

      Sorry, my servers are updated to SLES10 or SLES 11. I can’t test anything for you on SLES9.

      Another possible solution:
      - leave your nagios server on SLES9
      - delegate the oracle-checks to another (newer) machine with check_nrpe (Windows or Unix) or check_nt (nsClient++, Windows)

      hope it helps
      Michael

      and please remember: this is not the official site :-)

  2. Can you please tell me how to compare two schemas in different oracle databases. Please write a post on this.

    Thanks,
    find command in unix

  3. A complete Schema-Diff is quite complex because there are many Objects in an Oracle-Database (Tablespaces,Users,Table (with Attributes), Synonyms, Triggers, Packages,…).
    If you only want to compare the tables, you could do something like
    #—————————–
    sqlfile=/tmp/sqltmp.$$

    cat > $sqlfile <<EOF
    set PAGESIZE 4096
    set HEADING OFF
    select table_name from user_tables order by 1;
    EOF

    sqlplus -s someuser/somepass@db1 < $sqlfile > /tmp/schema1.txt
    sqlplus -s someuser/somepass@db2 < $sqlfile > /tmp/schema2.txt

    diff /tmp/schema{1,2}.txt

    #—————————–
    Comparig the Table-Definitions too takes more effort.

Leave a Reply

Required fields are marked *.