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