Dieser Beitrag ist inspiriert von den Artikeln Teil 1. Protokollieren von Ereignissen in Oracle PL / SQL und Teil 2. Identifizieren von Ereignissen, die in Oracle PL / SQL auftreten . Zunächst möchte ich als Spezialist für Leistungsoptimierung und Fehlerbehebung einige Nuancen kommentieren.
1. Ebenen der Protokollausführlichkeit
Dem gezeigten System fehlt die Flexibilität bei der Konfiguration der Protokollierung: sowohl der Detaillierungsgrad als auch der Ort, an dem sie ausgegeben werden sollen. Es war möglich, Funktionen von bekannten Protokollierungssystemen a la java.util.logging (SLF4j, log4j und deren Variationen für andere Sprachen / Systeme usw.) auszuleihen und flexibel zu konfigurieren, für welchen Code von welcher Nachrichtenebene und wohin Rette sie. Beispielsweise können Sie in derselben log4plsql die Ausgabe in der Datei alert.log und in der Tracedatei konfigurieren (mithilfe von `dbms_system.ksdwrt ()`).
2. Benutzerdefinierte Fehler und Meldungen
Aus dem innersten Oracle-Fehlersystem konnte die Verwendung von UTL_LMS.FORMAT_MESSAGE ausgeliehen werden . Übrigens können die Fehler (und Ereignisse) selbst mit sys.standard.sqlerrm (N) angezeigt werden:
SQL> select sys.standard.sqlerrm(-1476) errmsg from dual;
ERRMSG
-------------------------------------
ORA-01476: divisor is equal to zero
Beispiele: err_by_code.sq l, trace_events.sql
, , , , , - , exception handler . .
3.
, , - , . `after servererror on database/schema
`. .
, , , , , Oracle.
, Nenad Noveljic c "TNS-12599: TNS:cryptographic checksum mismatch
" callstack:
, "ERRORSTACK", "ACTIONS", "CALLSTACK":
12599 - (event), callstack - call , level 2 - , lifetime 1 - .
Tanel Poder :
, , "trace()" shortstack():
callstack:
alter system set events '12599 trace("stack is: %\n", shortstack())';
:
alter system set events 'kg_event[12599]{occurence: start_after 1, end_after 1} trace("stack is: %\n", shortstack())';
, : 1 .
"ORA-01476: divisor is equal to zero":
alter system set events 'kg_event[1476]{occurence: start_after 1, end_after 1} trace("stack is: %\n", shortstack())';
kg_event - Kernel Generic event, 1476 - ORA-1476. :
SQL> alter session set events 'kg_event[1476]{occurence: start_after 1, end_after 1} trace("stack is: %\n", shortstack())';
Session altered.
SQL> select 1/0 x from dual;
select 1/0 x from dual
*
ERROR at line 1:
ORA-01476: divisor is equal to zero
SQL> select 1/0 x from dual;
select 1/0 x from dual
*
ERROR at line 1:
ORA-01476: divisor is equal to zero
SQL> select 1/0 x from dual;
select 1/0 x from dual
*
ERROR at line 1:
ORA-01476: divisor is equal to zero
:
# cat ORA19_ora_12981.trc
Trace file /opt/oracle/diag/rdbms/ora19/ORA19/trace/ORA19_ora_12981.trc
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.9.0.0.0
Build label: RDBMS_19.9.0.0.0DBRU_LINUX.X64_200930
ORACLE_HOME: /opt/oracle/product/19c/dbhome_1
System name: Linux
Node name: b7c493c7f9b0
Release: 3.10.0-1062.12.1.el7.x86_64
Version: #1 SMP Tue Feb 4 23:02:59 UTC 2020
Machine: x86_64
Instance name: ORA19
Redo thread mounted by this instance: 1
Oracle process number: 66
Unix process pid: 12981, image: oracle@b7c493c7f9b0
*** 2021-05-08T14:12:27.000816+00:00 (PDB1(3))
*** SESSION ID:(251.9249) 2021-05-08T14:12:27.000846+00:00
*** CLIENT ID:() 2021-05-08T14:12:27.000851+00:00
*** SERVICE NAME:(pdb1) 2021-05-08T14:12:27.000855+00:00
*** MODULE NAME:(sqlplus.exe) 2021-05-08T14:12:27.000859+00:00
*** ACTION NAME:() 2021-05-08T14:12:27.000862+00:00
*** CLIENT DRIVER:(SQL*PLUS) 2021-05-08T14:12:27.000865+00:00
*** CONTAINER ID:(3) 2021-05-08T14:12:27.000868+00:00
stack is: dbgePostErrorKGE<-dbkePostKGE_kgsf<-kgeade<-kgeselv<-kgesecl0<-evadiv<-kpofcr<-qerfiFetch<-opifch2<-kpoal8<-opiodr<-ttcpip<-opitsk<-opiino<-opiodr<-opidrv<-sou2o<-opimai_real<-ssthrdmain<-main<-__libc_start_main
, , alter system set events 'trace[sql_mon.*] [SQL: ...] disk=high,memory=high,get_time=highres';
, / real-time SQL (RTSM - Real Time SQL Monitor).
, , , , . - , .