Dazu wird zunächst ein Directory angelegt, welches das Alert-Log im XML-Format enthält:
create directory alert_log as '/u01/app/oracle/diag/rdbms/ora112/ora112/alert/';Leider ist das Alert-Log nicht well-formed, da es kein Root-Element besitzt; hier besteht also noch Handlungsbedarf.
Wenngleich man auch mit etwas PL/SQL ein Root-Element hinzufügen kann, habe ich mich hier dafür entschieden, zyklisch eine Kopie des Alert-Logs zu erstellen; diese Kopie wird dann mithilfe von Betriebssystem-Mitteln um ein Root-Element erweitert.
Unter Unix genügt es den Start- und End-Tag in jeweils einer Datei abzuspeichern, um dann eine Verkettung mit
cat
vorzunehmen.
touch start_tag echo "Jetzt kann man auf dieser Grundlage einen View erstellen, der mithilfe eines FLOWR-Ausdrucks, das Alert-Log relational aufbereitet:" > start_tag touch end_tag echo " " > start_tag cat start_tag log.xml end_tag > log_well_formed.xml
create view v_alert_log as ( select to_date(substr(x.log_time, 1, 19), 'YYYY-MM-DD"T"HH24:MI:SS') as log_time x.log_org_id, x.log_comp_id, x.log_msg_id, x.log_type, x.log_group, x.log_level, x.log_host_id, x.log_host_addr, x.log_pid, x.log_version, x.log_txt from xmltable ( 'for $i in //msg return $i' passing xmltype(bfilename('ALERT_LOG', 'log_well_formed.xml'), nls_charset_id('AL32UTF8')) columns "LOG_TIME" varchar2(255) path '/msg/@time', "LOG_ORG_ID" varchar2(255) path '/msg/@org_id', "LOG_COMP_ID" varchar2(255) path '/msg/@comp_id', "LOG_MSG_ID" varchar2(255) path '/msg/@msg_id', "LOG_TYPE" varchar2(255) path '/msg/@type', "LOG_GROUP" varchar2(255) path '/msg/@group', "LOG_LEVEL" integer path '/msg/@level', "LOG_HOST_ID" varchar2(255) path '/msg/@host_id', "LOG_HOST_ADDR" varchar2(255) path '/msg/@host_addr', "LOG_PID" integer path '/msg/@pid', "LOG_VERSION" varchar2(255) path '/msg/@version', "LOG_TXT" varchar2(4000) path '/msg/txt' ) x );Jede Änderung an der Quelle wird direkt durch den View reflektiert.
Eine mögliche Abfrage könnte zum Beispiel wie folgt aussehen:
select * from v_alert_log where log_txt like '%ORA-%' and sysdate - log_time <= 3;
Nett. Alternativ steht in 11g auch die interne View x$dbgalertext zur Verfügung, auf der man ebenfalls eine solche v_alert_log-View definieren könnte, wie das Neil Chandler vor einigen Wochen gezeigt hat: http://chandlerdba.wordpress.com/2012/03/26/exposing-the-oracle-alert-log-to-sql/
AntwortenLöschenViele Grüße
Martin Preiß