Datenbankfehler speichern und monitoren

Sie möchten auftretende Fehler in der Datenbank monitoren? Dazu eignet sich beispielsweise die Speicherung von Datenbankfehlern in einer Tabelle, die sich später jederzeit abfragen läßt. Das folgende Skript nutzt dazu einen Datenbank-Trigger, der nach dem Auftreten eines Datenbankfehlers automatisch vom Oracle-Server ausgeführt wird.

Oracle Database Error mittels Trigger speichern
DEFINE Monitoring_Owner=system
clear screen
SET verify off
SET linesize 80
PROMPT ===================================================
PROMPT = 
PROMPT =  Audit  zu Datenbank-Fehlern
PROMPT =  
PROMPT ===================================================
PROMPT
PROMPT Speicherung von Datenbankfehlern IN der Tabelle
PROMPT save_err_audit. Folgende Informationen werden 
PROMPT gespeichert: Fehler-Informationen, Zeitpunkt des 
PROMPT Fehler, DB-Benutzer, OS-Benutzer, Quellcomputer, 
PROMPt Prozess und verursachendes Programm.
PROMPT
PROMPT Falls die Tabelle save_err_audit bereits existiert, 
PROMPT wird Sie neu erstellt.
PROMPT Wollen Sie fortfahren?
PROMPT
PROMPT Weiter mit Enter / Beenden mit STRG + C
PROMPT
PAUSE
PROMPT
 
DECLARE 
   l_OBJECT_NAME	dba_objects.object_name%TYPE;
BEGIN
   BEGIN
      SELECT object_name
      INTO   l_object_name
      FROM   DBA_OBJECTS
      WHERE  object_name = 'SAVE_ERR_AUDIT'
      AND    owner = upper('&Monitoring_Owner');
   EXCEPTION 
      WHEN NO_DATA_FOUND THEN NULL;
   END;
   IF l_object_name = 'SAVE_ERR_AUDIT' THEN 
      EXECUTE IMMEDIATE 
                'DROP TABLE &Monitoring_Owner..SAVE_ERR_AUDIT';
   END IF;
END;
/
 
CREATE TABLE &Monitoring_Owner..save_err_audit (
	errOR     VARCHAR2(30),
	timestamp DATE,
	username  VARCHAR2(30),
	osuser    VARCHAR2(30),
	  	machine   VARCHAR2(64),
	process   VARCHAR2(8),
	program   VARCHAR2(48));
 
CREATE OR REPLACE TRIGGER 
          &Monitoring_Owner..catch_err_trigger 
	  after servererrOR ON DATABASE
DECLARE
	v_user     VARCHAR2(30);
	v_osuser   VARCHAR2(30);
	v_machine  VARCHAR2(64);
	v_process  VARCHAR2(8);
	v_program  VARCHAR2(48);
BEGIN
	SELECT username, osuser, 
                 machine, process, program
	INTO   v_user, v_osuser, 
                 v_machine, v_process, v_program
	FROM   sys.v_$session
	WHERE  audsid = userenv('sessionid');
 
	INSERT INTO save_err_audit
	  VALUES (dbms_standard.server_error(1),
                 sysDATE,v_user,
	         v_osuser,
                 v_machine,
                 v_process,
                 v_program);
END;
/
 
DESC &Monitoring_Owner..save_err_audit 
 
PROMPT Abfrage bspw. mit: SELECT * FROM save_err_audit;
PROMPT ===================================================

 

Tritt nun beispielsweise ein ORA-1555 (Snapshoot too old) auf, so können Sie auf genauere Informationen der Monitoring-Tabelle zurückgreifen. Die darin gespeicherten Informationen lassen sich natürlich noch gemäß Ihren Anforderungnen anpassen, indem Sie den Trigger und den Tabellenaufbau erweitern.