Oracle Datenbank mit Zabbix überwachen
Aus znilwiki
Bei einem Kunden sollte ich eine Überwachung der Oracle Datenbank einrichten.
Insbesondere sollten die Tabelspaces überwacht werden.
Leider scheinen die Lösungen auf www.zabbix.com älter zu sein und haben eben keine Tablespaces.
Gefunden habe ich dann etwas hier: http://bicofino.io/blog/monitoring-oracle-with-zabbix/
Ich habe die Lösung mal für meine Ubuntu/Zabbix Kombi umgesetzt und das ganze hier beschrieben:
Voraussetzungen
- Oracle Client muss installiert werden ( http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html )
- cx_Oracle für Python muss installiert werden ( http://cx-oracle.sourceforge.net/ )
- PyOra muss installiert / eingerichtet werden ( https://github.com/bicofino/Pyora )
Installation
Vorhandene Oracle Version abfragen
LINUX:
Meldet euch per SSH am Oracle-Server an und gebt folgenden Befehl ein:
echo $ORACLE_HOME
Beispielausgabe:
/oracle/ora112
Bedeutet Version 11.2
Wer es noch genauer haben will:
su - oracle sqlplus
Beispielausgabe:
SQL*Plus: Release 11.2.0.3.0 Production on Di Nov 29 09:28:19 2016 Copyright (c) 1982, 2011, Oracle. All rights reserved. Benutzernamen eingeben:
Oracle Client installieren
Den Client findet Ihr unter
http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html
den 64 Bit-Client unter
https://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html
Dort müsst Ihr den passenden (64 oder 32 Bit) auswählen.
Ob Ihr ein 32 oder 64Bit Linux habt stellt ihr auf der Bash mit
root@zabbix:~# uname -m x86_64
fest. x86_64
bedeutet das es ein 64 Bit System ist, alle anderen Werte bedeuten 32 Bit (z.B. i686
).
Ich habe hier ein 64 Bit System und entsprechend den Instant Client for Linux x86-64 genommen.
Ihr müsst die Pakete für
- Instant Client Package - Basic:
- Instant Client Package - SDK:
- Instant Client Package - SQL*Plus
herunterladen. Ihr könnt zwischen .zip und .rpm wählen. Wir nehmen dir .rpm Versionen.
Ich habe hier ein 10g Datenbank, entsprechend waren es die Dateien
oracle-instantclient-basic-10.2.0.5-1.x86_64.rpm oracle-instantclient-devel-10.2.0.5-1.x86_64.rpm oracle-instantclient-sqlplus-10.2.0.5-1.x86_64.rpm
die wir nun auf unseren Zabbix Server hochladen.
Dort installieren wir diese mittels alien
Wenn alien
> auf eurem System fehlt könnt Ihr es mit
apt-get install alien
nachinstallieren.
Die drei Oracle-Pakete installieren wir mit
alien -i oracle-instantclient-basic-10.2.0.5-1.x86_64.rpm alien -i oracle-instantclient-devel-10.2.0.5-1.x86_64.rpm alien -i oracle-instantclient-sqlplus-10.2.0.5-1.x86_64.rpm
Nach erfolgreicher Installation der 3 Pakete könnt Ihr mit
sqlplus username/password@//NameDesServers:1521/SID sqlplus64 username/password@//NameDesServers:1521/SID
Testen (einer der beiden Befehle je nach Version)
Hinweis: Es kann sein das SID nicht funktioniert - dann müsst Ihr ggf. den Namen der Datenbank einsetzen. Gibt es eine Meldung wie TNS:no listener
so passt der Datenbankname und/oder der Port nicht.
listener.ora
auf dem Oracle Server (z.B. unter /oracle/ora112/network/admin/listener.ora
Gibt es dabei einen Fehler
sqlplus: error while loading shared libraries: libsqlplus.so: cannot open shared object file: No such file or directory
müsst Ihr die Datei
/etc/ld.so.conf.d/oracle.conf
erstellen und bearbeiten, z.B. mit
touch /etc/ld.so.conf.d/oracle.conf nano /etc/ld.so.conf.d/oracle.conf
und dort gleich am Anfang die Zeile
/usr/lib/oracle/10.2.0.5/client64/lib/
hinzufügen - den Pfad müsst Ihr ermitteln und er hängt von eurer Version ab (das 10.2.0.5 und client64 ist wahrscheinlich anders.
Im Anschluss noch mal die Konfiguration des Clients aufrufen:
ldconfig
Gibt es danach den Fehler:
sqlplus: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory
fehlt müsst ihr diese fehlende Library mit
apt-get install libaio1
installieren (man beachte die 1 am Ende)
Danach sollte der sqlplus
Test klappen.
sqlplus username/password@//NameDesServers:1521/SID
Ausgabe
SQL*Plus: Release 11.1.0.7.0 - Production on Wed Oct 16 15:45:41 2013 Copyright (c) 1982, 2008, Oracle. All rights reserved. Connected to: Oracle Database 10g Release 10.2.0.4.0 - 64bit Production
ldconfig anpassen
Nach einem Hinweis von Timo noch die nachfolgenden Ergänzung - sonst meldet das cx_Oracle Script einen Fehler:
Wir legen eine neue Datei an:
nano /etc/ld.so.conf.d/oracle.conf
mit folgendem Inhalt:
/usr/lib/oracle/11.2/client64/lib/
Den Pfad müsst Ihr an eure Version anpassen, ggf. abfragen mit
ls -l /usr/lib/oracle/
Im Anschluß noch ein
ldconfig
Unter Ubuntu 20.04 mit Python 2.7
- Python 2.7 installieren und zum Default machen: https://www.how2shout.com/linux/how-to-install-python-2-7-on-ubuntu-20-04-lts/
- pip für 2.7 installieren: https://linuxize.com/post/how-to-install-pip-on-ubuntu-20.04/
cx_Oracle wird dann mit folgenden Befehl installiert:
pip2 install cx_Oracle==7.3
cx_Oracle installieren
Das Script von Bico Fino braucht die cx-Oracle Bibliothek für Python, die findet ihr hier:
http://cx-oracle.sourceforge.net/
Neuer Weg
apt install python-pip pip install cx_Oracle
Test:
python -c 'import cx_Oracle'
sollte KEINE Fehlermeldung etc. erzeugen.
Alter Weg
Dort müsst ihr die passende Version zum Betriebssystem (64 oder 32 Bit), zur Oracle Installation und zur vorhandenen Python-Version auswählen.
Die Oracle Version wisst Ihr hoffentlich oder fragt den Datenbank-Admin
Wenn Ihr im vorherigen Abschnitt den Verbindugstest gemacht hat steht das da auch gleich nach dem Login auf dem Oracle-Server:
Connected to: Oracle Database 10g Release 10.2.0.4.0 - 64bit Production
Die Python Version fragt ihr einfach in der Shell ab:
root@zabbix:~# python --version Python 2.7.1+
So, ich habe hier ein 64Bit Ubuntu, eine Oracle-Datenbank Version 10g und Python Version 2.7
Also lade ich mir unter http://cx-oracle.sourceforge.net/ das Paket
•CentOS 5 x86_64 RPM (Oracle 10g, Python 2.7)
herunter. Das hies bei mir
cx_Oracle-5.1.2-10g-py27-1.x86_64.rpm
welchen wir nun wieder af den Server schieben und mit
alien -i cx_Oracle-5.1.2-10g-py27-1.x86_64.rpm
Installieren.
Testen können wir das nun mit
python -c 'import cx_Oracle'
Wenn es hierbei einen Fehler gibt:
root@zabbix:~# python -c 'import cx_Oracle' Traceback (most recent call last): File "<string>", line 1, in <module> ImportError: No module named cx_Oracle
Dann liegt es daran daß das Paket die Datei cx_Oracle.so an den falschen Ort gepackt hat, nämlich nach
/usr/lib/python2.7/site-packages/
es gehört aber nach
/usr/lib/python2.7/dist-packages/
Das Problem lösen wir indem wir es zusätzlich an den richtigen Ort verlinken:
ln /usr/lib/python2.7/site-packages/cx_Oracle.so /usr/lib/python2.7/dist-packages/cx_Oracle.so ln /usr/lib/python2.7/site-packages/cx_Oracle-5.1.2-py2.7.egg-info /usr/lib/python2.7/dist-packages/cx_Oracle-5.1.2-py2.7.egg-info
so liegt die gleiche Datei an beiden Orten (es immer die gleiche Datei)
Nun noch einmal testen:
python -c 'import cx_Oracle'
und die Ausgabe sollte ...
root@zabbix:~/oracle-files# python -c 'import cx_Oracle'
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: libpython2.7.so.1.0: cannot open shared object file: No such file or directory
Arggh der nächste Fehler ... den Ihr bestimmt nicht habt ...
Ok, den beheben wir mit
ln /usr/lib/libpyglib-2.0-python2.7.so.0.0.0 /usr/lib/libpython2.7.so.1.0
und dann sollte nach
python -c 'import cx_Oracle'
einfach nichts passieren!
pyora.py installieren
Ihr geht auf https://github.com/bicofino/Pyora und ladet euch die pyora.py
herunter.
Nun weichen wir ein wenig von dem ab was der Entwickler sich gedacht hat. Dieser hat das Script über den Agenten eingebunden,
wir nutzen einfach das "externalscripts" Verzeichnis von Zabbix und starten es auch als "External Check":
Kopiert die Datei pyora.py
in das Verzeichnis "externalscripts" eurer Zabbix-Installation.
Wenn ihr nach Standard installiert habt findet Ihr es unter
/usr/local/share/zabbix/externalscripts
Das ist der Pfad der in eurer zabbix_server.conf
definiert ist:
### Option: ExternalScripts # Full path to location of external scripts. # Default depends on compilation options. # # Mandatory: no # Default: # ExternalScripts=${datadir}/zabbix/externalscripts ExternalScripts=/usr/local/share/zabbix/externalscripts
Und Ihr müsst die Datei noch ausführbar machen:
chmod +x pyora.py
1. Test
Wenn Ihr per puTTY in das Verzeichnis wechselt könnt Ihr einen kleine Test mit eurer Datenbank machen:
./pyora.py "--username" "benutzer" "--password" "12334" "--address" "database.znil.local" "--database" "TEST23" "bufbusywaits"
Beispielausgabe:
13649089
Prima! Wenn eine Zahl zurückkommt etc. läuft es.
2. Test
./pyora.py --username "benutzer" --password "12345" --address 123.123.123.123 --database "DATABASE" "version"
Beispielausgabe:
Integration in Zabbix
In Zabbix importiert Ihr nun das Template ... das vom pyora.py Programmierer funktioniert auf Agentenbasis, ich habe sein Template genommen und auf External Check umgebaut:
Template-znil-Oracle-Pyora.zip
znil-Oracle-Pyora.zip => Export aus Zabbix 4.4.1
Dann legt Ihr einen Host an bzw. bearbeitet einen vorhandenen:
Statt des DNS-Namens könnt Ihr auch die IP nehmen.
Nun noch das Template mit dem Host verknüpfen:
Nach etwas Geduld kommen die Werte rein:
So, Scheiss Linux ... soviel fummelei bis ich endlich die richtigen Versionen von Oracle Client, cx_oracle und die Abhängigkeiten zusammen hatte .. man man unter Windows wäre die Installation eines Programmes ein Witz gewesen ...
--Bernhard Linz 16:54, 21. Okt. 2013 (CEST)