Montag, 15. Juli 2013

Wie überwache ich Oracle Datenbanken auf Schwellenwerte

Da wir auf Oracle für unsere Applikationen einsetzen, sollen diese natürlich auch überwacht werden.

Das geht relativ einfach mit SQL-Querys, benötigt wird dazu der Oracle Instant Client:
Da ich ein Fan von Automatisierung bin, habe ich für die Installation unter Ubuntu 12.04 (Debian sollte ebenfalls funktionieren, für CentOS/Oracle/Rehadt muss nur das Umwandeln der RPM Pakete auskommentiert werden) ein Skript erstellt.

Das Skript nutzt in der aktuellen Version eine Art Deploymentserver um die RPM Pakete abzuholen, mit geringem Aufwand kann man aber die Aufrufe von wget auch gegen ein cp o.ä. austauschen.
Vor der Nutzung müssen noch die entsprechenden Variablen angepasst werden:
  • Optional: proxy server
  • IP des Deployment Servers
Zusätzlich gibt es noch Abfragen ob der Instant Client mit PHP (interessant für Abfragen mittels PHP-Skripte) oder ohne und in x64 oder x86 installiert werden soll.

Hier das Skript als Download: prepare_ora_inst.sh


#!/bin/bash
# Author: oliver.skibbe (at) gmail.com
# Purpose: install oracle instant client 
# Date: 2013-05-21 15:00

# Variables
SRC=/usr/src
# deployment server, oracle instant client rpms should be there
deploymentserver="deploymentip/dns"
# http / https
http_type="http"
# basic auth
auth="user:password"
# proxy server for pecl/apt
proxy=""

# oracle versions
major=11.2
minor=0.3.0-1
# ora files
files=('basic' 'devel' 'sqlplus')

echo "####################################################"
echo -e "#### Oracle Instant Client Version $major.$minor ####"
echo "####################################################"

echo "Do you want to install 64-bit or 32-bit oracle instant client? 1/2"
read answer

case "$answer" in 
    1)
        arch=x86_64
        shortarch=64
    ;;
    2)
        arch=i386
        shortarch=
    ;;
    *)
        echo "Wrong answer..try again"
        exit 1
esac

echo "Do you want to install php extension? y/N"
read phpanswer
case "$phpanswer" in
        y*|Y*)
        echo "Installing php extension"
        php=true
        ;;
        *)
        echo "Not installing php extension"
        php=false
esac

if [ "x$proxy" = "x" ]; then
    echo "Adding proxy to apt.conf"
    if [ -d /etc/apt/apt.conf.d/ ] ; then
        echo "Acquire::http::Proxy \"$proxy\";" >> /etc/apt/apt.conf.d/99proxy.conf
    else 
        echo "Acquire::http::Proxy \"$proxy\";" >> /etc/apt/apt.conf
fi

# refresh sources
apt-get update

# install rpm to deb converter
apt-get install alien libaio1

for file in ${files[@]}
do
    filename=oracle-instantclient$major-$file-$major.$minor.$arch.rpm
    wget -c --no-proxy -O $SRC/$filename $http_type://$auth@$deploymentserver/deployment/global/oracle/$filename
    if [ $? != 0 ] ; then
        echo "Downloading $filename from $http_type://$deploymentserver/deployment/global/oracle/ failed!"
        exit 1
    fi
    alien -i $SRC/$filename
done

# libs
echo "/usr/lib/oracle/$major/client$shortarch/lib" > /etc/ld.so.conf.d/oracle.conf
ldconfig
ORACLE_HOME=/usr/lib/oracle/$major/client$shortarch

# log directory
mkdir /usr/include/oracle/$major/client$shortarch/log

# includes
ln -s /usr/include/oracle/$major/client$shortarch $ORACLE_HOME/include

# path variables
cat << EOT > /etc/profile.d/oracle.sh 
export ORACLE_HOME=$ORACLE_HOME
export PATH=\$PATH:\$ORACLE_HOME/bin
EOT
chmod +x /etc/profile.d/oracle.sh

if [ $php = true ] ; then
    echo "php oracle stuff"
    export ORACLE_HOME=$ORACLE_HOME
    if [ "x$proxy" = "x" ]; then
        pear config-set http_proxy $proxy
    fi
    pecl install oci8
    echo "extension=oci8.so" > /etc/php5/apache2/conf.d/oci8.ini

    service apache2 reload
fi

exit 0


Nach dem Ausführen des Skripts sollte die Installation des Oracle Instant Clients erfolgreich erledigt sein, anschließend kümmern wir uns nun um den Abfrageteil:

Hier das Beispiel-Skript als Download:  check_oracle_abfrage.php (Username, Password, IP/DNS, DBName und die Abfrage müssen noch angepasst werden!)

#!/usr/bin/php
<?php
// oracle database
$oracleuser = "user";
$oraclepass = "pass";
$instance = "ip/dbname";

$warn = $argv[1];
$crit = $argv[2];

// connect oracle database
$conn = oci_connect($oracleuser,$oraclepass,$instance);

$query = "select count(*) from table where export_date is null";
$abfrage = oci_parse($conn,$query);
oci_execute($abfrage);
$row = oci_fetch_array ($abfrage, OCI_BOTH);

$count = $row[0];

if ( $count >= $crit ) {
        $exitCode = 2;
        $exitString = "CRITICAL";
} else if ( $count >= $warn ) {
        $exitCode = 1;
        $exitString = "WARNING";
} else {
        $exitCode = 0;
        $exitString = "OK";
}

$perfData = "auftraege=$count;$warn;$crit";

// return values
echo $exitString . " {$count} Auftraege|" . $perfData;
exit($exitCode);

?>


Das Skript muss nun noch ausführbar gemacht (chmod +x) oder direkt via php aufgerufen werden.

 Anschließend solltet ihr ein funktionierendes Oracle Abfragesystem haben.


Bei Fragen bitte einfach melden.

Keine Kommentare:

Kommentar veröffentlichen