Überwachung der Alert-Datei unter Linux

31.
Mai
2017
Veröffentlicht von: Matthias Meyer

Hier nun die Ergänzung zum Monatstipp <link internal-link>Mai 2017 für die Überwachung der Alert-Datei unter Linux-Systemen.

Hier nun die Ergänzung zum Monatstipp Öffnet externen Link in neuem FensterMai 2017 für die Überwachung der Alert-Datei unter Linux-Systemen.

Damit E-Mails verschickt werden können, muss zunächst noch SMTP unter Linux eingerichtet werden. Dazu editieren Sie als Root-User die Datei mail.rc unter /etc und setzen den Parameter smtp auf Ihren Ihren Mail-Server.

$> su -
$> vi /etc/mail.rc

-- Tragen Sie folgende Zeile ein und speichern die Änderung ab
set smtp=<name_oder_ip_des_mail_servers>

-- Zum Testen führen Sie folgenden Befehl aus
$> echo "Dies ist ein Test" | mailx -r <absender_mail_adresse> -s "Betreff: Fehler in Alertlog" <empfänger_mail_adresse>

Wie Sie sehen können, nutzen wir mailx als E-Mail-Programm. Sie können natürlich auch ein beliebiges anderes Programm verwenden, müssen evtl. nur den Aufruf zum E-Mail versenden anpassen.

Das folgende Shell-Skript (alertlog_check.sh) stellt das Pendant zum Powershell-Skript unter Windows dar. Auch dieses dient nur als Vorlage und kann an die Wünsche und Bedürfnisse des ausführenden DBAs angepasst werden. Die fettgedruckten Parameter sind an Ihre jeweilige Umgebung anzupassen.

# pattern to search for
regex_err='ORA-|TNS-|Checkpoint not|WARNING|Starting ORACLE instance|Shutting down instance|Resize operation|alter database|ALTER SYSTEM SET'
# timerange in minutes to search for patterns
timerange=15
# fullpath of alertlog
alertfile="<$ORACLE_BASE>/diag/rdbms/<$ORACLE_UNQNAME>/<$ORACLE_SID>/trace/alert_<$ORACLE_SID>.log"
# number of lines each block has
maxblocklines=50
# mail - from
from="<sender_mail_adresse>"
# mail - to
to="<empfänger_mail_adresse>"

rgx_date_12_1='^[A-Z]{1}[a-z]{2} [A-Z]{1}[a-z]{2}'
rgx_date_12_2='^[0-9]{4}-[0-9]{2}-[0-9]{2}'
found=1
triggered=0
blocklength=2
maxlines=$(sed -n '$=' $alertfile)

get_date() {
    date --date="$1" +"%Y-%m-%d %H:%M:%S"
}

while (( $found )) ;
do
    block=$(tail -n $blocklength $alertfile)
    while IFS= read -r line
    do
        if [[ $line =~ $rgx_date_12_1 ]] || [[ $line =~ $rgx_date_12_2 ]] ;
        then
            if [[ $(get_date "$line") < $(date -d "${timerange} minutes ago" '+%Y-%m-%d %H:%M:%S') ]] ;
            then
                found=0
                continue
            fi
            if (( ! $found )) ;
            then
                if [[ $(get_date "$line") > $(date -d "${timerange} minutes ago" '+%Y-%m-%d %H:%M:%S') ]] ;
                then
                    alert_date="$line"
                    triggered=1
                    continue
                else
                    triggered=0
                fi
            fi
        fi
        if (( $triggered )) ;
        then
            if [[ $line =~ $regex_err ]] ;
            then
                err_out+=$'\n'
                err_out+="$alert_date $line"
            fi
        fi
    done <<< "$block"
    blocklength=$[$blocklength+$maxblocklines]
    if [[ $blocklength -gt $maxlines ]] ; then break; fi
done

if [ ! -z "$err_out" ] ; then echo "$err_out" | mailx -r "$from" -s "$(hostname) - Error in alertlog" "$to"; fi

Zum zeitgesteuerten Aufruf dieses Skripts werden im Folgenden zwei Alternativen vorgestellt:

  • über einer DBMS_SCHEDULER-Job (analog zur Windows-Variante)
  • als Cronjob über die Crontab von Linux

Variante 1: Über einen DBMS_SCHEDULER-Job

Da auf eine Betriebssystemdatei zugegriffen werden soll, muss zunächst ein Oracle Credential eingerichtet werden. Hier wird der OS-User oracle verwendet.


SQL> conn system

SQL> BEGIN
  DBMS_CREDENTIAL.CREATE_CREDENTIAL(
    credential_name => 'oracle_alert_cred',
    username        => 'oracle',
    password        => '<ihr_passwort>',
    enabled         => TRUE);
END;
/

Nun werden über das Package DBMS_SCHEDULER ein Progamm, ein Scheduler und ein Job erzeugt, so dass alle 15 Minuten das Check-Skript aufgerufen werden soll.


SQL> BEGIN
  DBMS_SCHEDULER.CREATE_PROGRAM (
    program_name        => 'alertlog_prog',
    program_type        => 'executable',
    program_action      => '/home/oracle/scripts/alertlog_check.sh',
    number_of_arguments => 0,
    enabled             => TRUE,
    comments            => 'Alertdatei-Monitoring');
END; 
/

SQL> BEGIN
  DBMS_SCHEDULER.CREATE_SCHEDULE (
    schedule_name   => 'alertlog_schedule',
    start_date      => systimestamp,
    repeat_interval => 'FREQ=minutely; interval=15',
    comments        => 'Alertlog-Monitoring');
END;
/

SQL> BEGIN
  DBMS_SCHEDULER.CREATE_JOB(
    job_name        => 'alertlog_job',
    program_name    => 'alertlog_prog',
    schedule_name   => 'alertlog_schedule',
    enabled         => TRUE,
    credential_name => 'oracle_alert_cred');
  COMMIT;
END;
/

-- Falls Sie den Job sofort ausführen wollen, dann hiermit
SQL> exec dbms_scheduler.run_job(job_name=>'alertlog_job');

Hier noch einige nützliche Abfragen zu dem, was Sie gerade eingerichtet haben:


SQL> SELECT * FROM user_scheduler_credentials;

SQL> SELECT program_name, enabled FROM user_scheduler_programs;

SQL> SELECT schedule_name, start_date, repeat_interval, comments
       FROM dba_scheduler_schedules;

SQL> SELECT job_name, program_name, schedule_name, last_start_date,
            next_run_date, enabled, state, run_count
       FROM dba_scheduler_jobs;

SQL> SELECT * FROM user_scheduler_job_run_details
      ORDER BY log_date DESC;


Variante 2: Über einen Crontab-Job

Der Nachteil der ersten Variante ist, dass das Überwachungsskript aus der Datenbank heraus aufgerufen werden soll. Ist diese nicht verfügbar, kann der Job auch nicht gestartet werden und es wird keine E-Mail verschickt.
Aus diesem Grund ist die zweite Variante sinnvoller, bei der ein Cronjob über die Tabelle Crontab eingerichtet wird. Somit werden Sie auch dann benachrichtigt, wenn die Instanz abgestürzt sein sollte.

$> su - oracle
$> crontab -e

# Das folgende Skript soll alle 15 Minuten aufgerufen werden
*/15 * * * * /home/oracle/scripts/alertlog_check.sh

Bei Fragen oder weiterer Unterstützung dürfen Sie uns gerne kontaktieren. Viel Spaß beim Überwachen!

Jede Menge Know-how für Sie!

In unserer Know-How Datenbank finden Sie mehr als 300 ausführliche Beiträge zu den Oracle-Themen wie DBA, SQL, PL/SQL, APEX und vielem mehr.
Hier erhalten Sie Antworten auf Ihre Fragen.