Hier nun die Ergänzung 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!