Thomas Kramer

IT-COW | Anleitungen

Icinga: Oracle-Datenbanken abfragen

By Administrator at Juni 19, 2010 00:49
Filed Under: Administration, Anleitungen, Workarounds

Es gibt ein PlugIn für Icinga/Nagios, das es erlaubt den Status von Oracle-Datenbanken übers Netzwerk abzufragen. Das Tool nennt sich check_oracle_health und ist wie check_logfiles von Herrn Lausser von der Firma ConSol entwickelt worden - dies ist die Homepage des Projekts: Link.

 

Wie man sieht gibt es weitere PlugIns dieser Art auch für die konkurrierenden Datenbanken MS SQL Server, MySQL und DB2. Die Installation der Version für Oracle war insgesamt nicht einfach, was aber nicht am PlugIn selbst lag sondern mehr an seinen Abhängigkeiten.

 

Installation

 

Für die Installation öffnet man das Terminal und wechselt als erstes auf den Root-Benutzer. Dann lädt man über folgenden Befehl - oder über oben genannte Webseite und den Webbrowser - das PlugIn herunter:

 

wget http://labs.consol.de/wp-content/uploads/2010/06/check_oracle_health-1.6.4.tar.gz

 

Mit tar -xvzf check_oracle_health-1.6.4.tar.gz wird das Archiv entpackt, anschließend führt man in dem darauf entstandenen Unterverzeichnis das Configure-Skript aus. An der Stelle war bei mir das Problem das immer noch nebenbei Nagios installiert ist, daher habe ich es mit folgenden erweiterten Optionen aufgerufen:

 

./configure  --with-nagios-user=icinga --with-nagios-group=icinga  --libexecdir=/usr/local/icinga/libexec/ --bindir=/usr/local/icinga/bin/

 

Danach dann das übliche

 

make

make install

 

eingegeben. Nun wurde in der Oracle-Datenbank ein zusätzlicher Benutzer eingerichtet - das macht man über die Web-Oberfläche von Oracle oder ein SQL-Tool wie Oracle SQL Developer, welches ich im Moment benutze (nachdem SQLTools unter Vista64 leider nicht mehr funktioniert). Das Skript dazu sieht folgendermaßen aus (dazu loggt man sich in Oracle als sys-Benutzer mit der SYSDBA-Rolle ein):

 

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;

Danach hatte ich noch etwas zu check_oracle_health übersehen: Dieses Plugin setzt die Installation der Perl-Module DBI und DBD::Oracle voraus - ist auf der Projektseite zu lesen. Das sind die Perl-Module für den Datenbankzugriff, DBD::Oracle entsprechend für Oracle, wie der Name schon sagt.

 

DBI war auf meinem Kubuntu 9.04-System bereits installiert, aber DBD::Oracle fehlte noch. An der Stelle fing es an etwas zeitaufwendiger zu werden, denn DBD::Oracle benötigt seinerseits natürlich den Oracle-Instantclient mit den Libraries. 

 

Die Pakete dazu können über den Link von Oracle heruntergeladen werden - direkt über wget zu beziehen geht leider nicht, weil eine Account-Abfrage notwendig ist. Das gilt aber für fast alle Downloads von Oracle. Es werden drei Pakete für DBD::Oracle benötigt:

 

  • Instant Client Package - Basic
  • Instant Client Package - SQL*Plus (wird zumindest benötigt um die Versionsnummer auszulesen)
  • Instant Client Package - SDK (Header-Dateien)

 

Leider liefert Oracle für Linux nur ZIP-Dateien oder RPM-Pakete aus. Für ein (K)ubuntu-System ist man daher darauf angewiesen die rpm-Pakete mit alien in ein deb-Paket zu konvertieren und dann mit sudo dpkg -i paketname.deb zu importieren. Leider hat es bei mir trotzdem nicht ganz reibungsfrei geklappt.

 

Die Header-Dateien des SDKs müssen unbedingt in /usr/include/oracle/11.2/client liegen damit es funktioniert - /usr/include/oracle/... gab es bei mir noch nicht und wenn die Dateien direkt in /usr/include/ liegen reicht das noch nicht aus. Also kopiert man, nachdem man das Verzeichnis erstellt hat, die Dateien dorthin (wenn nötig aus dem ZIP-Archiv). An der Stelle ist es übrigens etwas lästig das das Archiv-Programm Ark beim entpacken in ein root-privilegiertes Verzeichnis nicht einfach eine Passwort-Abfrage bringt, sondern mit einer Fehlermeldung absagt. Daher muss man zuerst in ein anderes Verzeichnis entpacken und dann über den Terminal-Befehl cp dorthin kopieren.

 

Das Basic-Paket und SQL*Plus müssen in /usr/lib/oracle/11.2/client liegen.

 

Nach den Kopiervorgängen erstellt man die System-Variablen ORACLE_HOME und LD_LIBRARY_PATH:

 

export ORACLE_HOME=/usr/lib/oracle/11.2/client/

export LD_LIBRARY_PATH=/usr/lib/oracle/11.2/client/:/usr/lib/oracle/11.2/client/lib/

 

Hinweis: 11.2 ist natürlich meine Oracle-Versionsnummer bzw. die aktuelle Instantclient-Version, die obigen Pfade können bei euch daher anders aussehen. Ein Doppelpunkt trennt die Pfade voneinander, mit Export (ohne Parameter) könnt Ihr auch die aktuellen Variablen auflisten - wie SET bei Windows. An der Stelle auch wichtig: diese Variablen gelten pro Terminal-Sitzung, wenn Ihr die Variablen in einem Terminal-Tab setzt sind die in einem anderen Tab nicht direkt verfügbar - selbst wenn ihr dort mit demselben Account angemeldet seid. Ergänzung 20.06.2010: ich nehme an das die Variablen verfügbar sind sobald die andere Terminal-Sitzung neu gestartet wird - wenn ja ist das genauso wie bei Windows, es wird zwar gespeichert ist aber in den anderen Sitzungen erst verfügbar wenn diese neu gestartet werden.

 

Dann wollte ich DBD::Oracle installieren, aber es funktionierte immer noch nicht. Zwei kleine Probleme traten noch auf, zum einen musste ich das Paket libaio1 nachinstallieren:

 

apt-get install libaio1

 

Als weiteres zeigte mir das Installationsskript von DBD::Oracle an, das es sqlplus nicht finden konnte. Das Problem waren mangelnde Zugriffsrechte auf sqlplus, diese habe ich mit

 

chmod 777 /usr/lib/oracle/11.2/client/sqlplus

 

behoben - siehe Link. Sicherlich sollte man in einer Firma die Rechte restriktiver behandeln, aber für private Zwecke reicht 777 aus. Danach kann man dann endlich

 

apt-get install cpan

cpan

install DBD::Oracle

 

ausführen und es damit lauffähig machen. Alternativ kann man aber auch

 

wget http://search.cpan.org/CPAN/authors/id/P/PY/PYTHIAN/DBD-Oracle-1.24b.tar.gz

tar xvzf DBD-Oracle-1.24b.tar.gz

cd DBD-Oracle-1.24

perl Makefile.PL

make

make install

 

ausführen.

 

Test von check_oracle_health

 

Anschließend kann das PlugIn endlich getestet werden:

 

/usr/local/icinga/libexec/check_oracle_health --connect IP-Adresse:Port/SID --username nagios --password oradbmon --mode tnsping

 

Das Passwort wurde über den identified by-Eintrag weiter oben spezifiziert und kann später noch mit alter user nagios identified by $Passwort$; geändert werden. Die Modi, die check_oracle_health beherrscht, können über die Projektseite eingesehen werden.

 

Icinga/Nagios-Anpassung

 

In der Datei commands.cfg von Icinga habe ich dann folgenden Befehl ergänzt:


define command{

           command_name check_oracle_health

           command_line $USER1$/check_oracle_health --connect $HOSTADDRESS$:1521/SID --username nagios --password oradbmon --mode $ARG1$

}


1521 ist der Standard-Port von Oracle, SID ist der Identifier der Oracle-Instanz.

 

In der Datei windows.cfg habe ich danach folgende Service-Definitionen neu erstellt:


define service{

           use                                           generic-service

           service_description                 Oracle-TNSPing

           host_name                               $RECHNER$

           check_command                     check_oracle_health!tnsping

           max_check_attempts              1

}


define service{

           use                                            generic-service

           service_description                  Oracle-Connection-Time

           host_name                                $RECHNER$

           check_command                      check_oracle_health!connection-time

           max_check_attempts               1

}


define service{

          use                                              generic-service

          service_description                    Oracle-connected-Users

          host_name                                  $RECHNER$

          check_command                        check_oracle_health!connected-users

          max_check_attempts                 1

}


define service{

         use                                               generic-service

         service_description                     Oracle-Tablespace-belegt

         host_name                                   $RECHNER$

         check_command                         check_oracle_health!tablespace-usage

         max_check_attempts                  1

}


define service{

         use                                                generic-service 

         service_description                      Oracle-Tablespace-frei

         host_name                                    $RECHNER$

         check_command                          check_oracle_health!tablespace-free

         max_check_attempts                   1

}


define service{

         use                                                 generic-service

         service_description                       Oracle-Tablespace-Tage

         host_name                                     $RECHNER$

         check_command                           check_oracle_health!tablespace-remaining-time

         max_check_attempts                    1

}

 

$RECHNER$ muss natürlich schon durch euren Rechner-Namen, gemäß eurer Host-Definition, ersetzt werden.

 

Danach hatte ich über

 

/etc/init.d/icinga restart

 

Icinga neu gestartet. Ergänzend musste ich noch eine neue Firewall-Regel auf meinem Windows-Rechner erstellen, weil ich Oracle bis dato nur direkt auf diesem System benutzt hatte. Oracle läuft bislang nicht auf meinem Server, sondern als Testinstallation auf meinem normalen Arbeitsrechner.

 

Im Web-Interface sah es bei mir nun so aus:

 

 

Zur Erläuterung der neuen Services kann man auch wieder die Projektseite aufrufen. Ich habe also zusammenfassend diese sechs neue Services hinzufügt:

 

  • 1. Oracle-TNSPing
  • 2. Oracle-Connection-Time
  • 3. Oracle-connected-Users
  • 4. Oracle-Tablespace-belegt
  • 5. Oracle-Tablespace-frei
  • 6. Oracle-Tablespace-Tage

 

Service 1 führt einen TNSPing aus, also einen Ping zu dem Listener-Dienst von Oracle. Nummer 2 misst wie performant die Verbindung ist, 3 zeigt auf wieviele User gerade eingeloggt sind - wobei ich die bei mir aufgelistete Zahl nicht nachvollziehen kann. Mit 4 und 5 wird aufgelistet wie es um den benutzten und freien Speicherplatz des Tablespaces steht und 6 zeigt auf wie lange es noch dauern wird bis der Tablespace wahrscheinlich voll ist.

 

Ergänzungen

 

Vista loggt bei mir öfters den System-Fehler mit der EventID 4226 und folgener Message: TCP/IP hat das Sicherheitslimit erreicht, das für die Anzahl gleichzeitiger TCP-Verbindungsversuche festgelegt wurde.

 

Es wurde ein Programm entwickelt um die von MS festgelegte Anzahl maximal (gleichzeitig) zugelassener Verbindungen von Vista zu erhöhen, den UAC Auto Patcher. Bei mir habe ich es noch nicht getestet, denn es scheint nicht ganz ungefährlich (Link) zu sein. Das Problem ist, das Icinga eine Menge gleichzeitiger Anfragen durchführen kann. Mehr als das ein Fehler geloggt wird passiert aber nicht falls der Check nicht zustande gekommen ist, bei der nächsten Abfrage funtioniert es dann wieder. Trotzdem will ich das Programm später noch testen.

 

Meine vorangegangenen eigenen Blog-Postings zu Icinga sind hier einsehbar:

 

  • Icinga & NSClient++ und Postfix: Link
  • Icinga - erweiterte Konfiguration: Link
  • Icinga - Webinterface und Notifications: Link

 

Mein allgemeiner Reminder zur Oracle-Namensauflösung und -Konfiguration ist hier einsehbar. In Bezug auf Oracle und ODBC (und den Windows-64-Bit-Versionen) ist auch einiges zu beachten: Link.

 

Weitere Links

 

  • offizielles PDF von ConSol zu check_oracle_health: Link
  • alternative Installation von DBD::Oracle (statt alien): Link
  • weitere Oracle-Skripte: Link
  • Übersicht über die System-Tabellen von Oracle: Link
  • Unterschiede zwischen Oracle-Benutzer SYS und SYSTEM (u. a.): Link

 

Tag-Wolke

Monats-Liste