Расширение текстовых синонимов числовых диагностических событий¶
В продолжение Текстовые синонимы числовых диагностических событий, рассмотрим, как добавить новые синонимы для числовых диагностических событий в версии Oracle Database 19c.
Исходные и целевые данные¶
Исходная структура ksdtevt может быть просмотрена с помощью bide:
bide dump-table ksdtevt --format name:string code:L
+---------------------+-------+
| name | code |
+---------------------+-------+
| LOGON | 10029 |
| LOGOFF | 10030 |
| DEADLOCK | 60 |
| NOTIFYCRS | 39505 |
| CONTROL_FILE | 10000 |
| DB_FILES | 10222 |
| BEGIN | 10010 |
| END | 10011 |
| PQ_KILL_TEST | 10370 |
| PQ_KILL_TEST_PROC | 10372 |
| PQ_KILL_TEST_CODE | 10373 |
| KXFX | 10390 |
| SORT_END | 10032 |
| SORT_RUN | 10033 |
| PARSE_SQL_STATEMENT | 10035 |
| CREATE_REMOTE_RWS | 10036 |
| ALLOC_REMOTE_RWS | 10037 |
| QUERY_BLOCK_ALLOC | 10038 |
| TYPE_CHECK | 10039 |
| KFTRACE | 15199 |
| KFDEBUG | 15194 |
| KFSYNTAX | 15195 |
| KEWA_ASH_TRACE | 13740 |
| kea_debug_event | 13698 |
| KEH_TRACE | 13700 |
| 0 | 0 |
+---------------------+-------+
Целью данной заметки будет добавление двух новых синонимов для кодов ошибок ORA-942 и ORA-1400:
| name | code |
|---|---|
NO_SUCH_TABLE |
942 |
CANNOT_INSERT_NULL |
1400 |
Попытки использования данных синонимов завершаются с ошибками ORA-49100/ORA-49108:
SQL> alter session set events 'no_such_table errorstack(1)';
ERROR:
ORA-49100: Failed to process event statement [no_such_table errorstack(1)]
ORA-49108: Event Name [NO_SUCH_TABLE] not found
SQL> alter session set events 'cannot_insert_null incident("NULL_INSERTION")';
ERROR:
ORA-49100: Failed to process event statement [cannot_insert_null
incident("NULL_INSERTION")]
ORA-49108: Event Name [CANNOT_INSERT_NULL] not found
Реализация¶
-
Создать файл
ksdtevt.cсо следующим содержимым:ksdtevt.cКак видно, в файл включены текущие данные, а также два новых синонима.typedef struct { char *alias; long code; } ksdtevt_struct; ksdtevt_struct ksdtevt[27] = {{"LOGON", 10029}, {"LOGOFF", 10030}, {"DEADLOCK", 60}, {"NOTIFYCRS", 39505}, {"CONTROL_FILE", 10000}, {"DB_FILES", 10222}, {"BEGIN", 10010}, {"END", 10011}, {"PQ_KILL_TEST", 10370}, {"PQ_KILL_TEST_PROC", 10372}, {"PQ_KILL_TEST_CODE", 10373}, {"KXFX", 10390}, {"SORT_END", 10032}, {"SORT_RUN", 10033}, {"PARSE_SQL_STATEMENT", 10035}, {"CREATE_REMOTE_RWS", 10036}, {"ALLOC_REMOTE_RWS", 10037}, {"QUERY_BLOCK_ALLOC", 10038}, {"TYPE_CHECK", 10039}, {"KFTRACE", 15199}, {"KFDEBUG", 15194}, {"KFSYNTAX", 15195}, {"KEWA_ASH_TRACE", 13740}, {"kea_debug_event", 13698}, {"KEH_TRACE", 13700}, {"NO_SUCH_TABLE", 942}, {"CANNOT_INSERT_NULL", 1400}}; -
Создать резервную копию
libserver:cd $ORACLE_HOME/lib # создание резервной копии libserver cp libserver19.a{,.backup} -
Замена символа
ksdtevt:# извлечение ksdt.o ar xv libserver19.a ksdt.o # замена символа ksdtevt sed -i 's/\(ksdtevt\)/\u\1/g' ksdt.o # замена ksdt.o в libserver изменённым ar rv libserver19.a ksdt.o -
Компиляция нового
ksdtevt:# компиляция ksdtevt.c gcc -c ksdtevt.c -
Добавление нового
ksdtevtвlibserver:# добавление ksdtevt.o в libserver ar rv libserver19.a ksdtevt.o -
Линковка
oracle:# линковка oracle cd $ORACLE_HOME/rdbms/lib make -f ins_rdbms.mk ioracle
Полный скрипт для удобства
cd $ORACLE_HOME/lib
# создание резервной копии libserver
cp libserver19.a{,.backup}
# извлечение ksdt.o
ar xv libserver19.a ksdt.o
# замена символа ksdtevt
sed -i 's/\(ksdtevt\)/\u\1/g' ksdt.o
# замена ksdt.o в libserver изменённым
ar rv libserver19.a ksdt.o
# компиляция ksdtevt.c
gcc -c ksdtevt.c
# добавление ksdtevt.o в libserver
ar rv libserver19.a ksdtevt.o
# линковка oracle
cd $ORACLE_HOME/rdbms/lib
make -f ins_rdbms.mk ioracle
Демонстрация¶
Будет использоваться следующий SQL*Plus скрипт:
ksdtevt.sql
set echo on
conn / as sysdba
alter session set container=pdb;
alter session set events 'no_such_table errorstack(1)';
oradebug setmypid
oradebug eventdump session
select * from no_such_table1;
!tail -50 ~/alert_orcl.log
exec dbms_session.sleep(10)
alter session set events 'cannot_insert_null incident("NULL_INSERTION")';
oradebug eventdump session
create table t(n int not null);
insert into t values (null);
!tail -50 ~/alert_orcl.log
Его вывод:
Вывод работы скрипта с изменённым ksdtevt
[oracle@myhostname ~]$ sqlplus /nolog @ksdtevt
SQL*Plus: Release 19.0.0.0.0 - Production on Fri Aug 8 11:21:19 2025
Version 19.27.0.0.0
Copyright (c) 1982, 2024, Oracle. All rights reserved.
SQL> conn / as sysdba
Connected.
SQL> alter session set container=pdb;
Session altered.
SQL>
SQL> alter session set events 'no_such_table errorstack(1)';
Session altered.
SQL> oradebug setmypid
Statement processed.
SQL> oradebug eventdump session
no_such_table errorstack(1)
SQL> select * from no_such_table1;
select * from no_such_table1
*
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> !tail -50 ~/alert_orcl.log
...
2025-08-08T11:21:19.057941+00:00
PDB(3):Errors in file /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_15218.trc:
2025-08-08T11:21:19.130451+00:00
PDB(3):Errors in file /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_15218.trc:
ORA-00942: table or view does not exist
SQL>
SQL> exec dbms_session.sleep(10)
PL/SQL procedure successfully completed.
SQL>
SQL> alter session set events 'cannot_insert_null incident("NULL_INSERTION")';
Session altered.
SQL> oradebug eventdump session
cannot_insert_null incident("NULL_INSERTION")
no_such_table errorstack(1)
SQL> create table t(n int not null);
Table created.
SQL> insert into t values (null);
insert into t values (null)
*
ERROR at line 1:
ORA-01400: cannot insert NULL into ("SYS"."T"."N")
SQL> !tail -50 ~/alert_orcl.log
...
2025-08-08T11:21:29.266197+00:00
Errors in file /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_15218.trc (incident=48974) (PDBNAME=PDB):
ORA-00700: soft internal error, arguments: [EVENT_CREATED_INCIDENT], [1400], [NULL_INSERTION], [], [], [], [], [], [], [], [], []
ORA-01400: cannot insert NULL into ("SYS"."T"."N")
PDB(3):Incident details in: /u01/app/oracle/diag/rdbms/orcl/orcl/incident/incdir_48974/orcl_ora_15218_i48974.trc
Таким образом, продемонстрирована работа обоих новых синонимов.
Короче говоря¶
- Возможно добавление своих текстовых синонимов для числовых диагностических событий.
- Приведён вариант реализации, использующий подмену символа
ksdtevtи добавление изменённой структурыksdtevt. - Продемонстирована работа тестового SQL*Plus скрипта, использующего добавленные синонимы.