Перейти к содержанию

Расширение текстовых синонимов числовых диагностических событий

В продолжение Текстовые синонимы числовых диагностических событий, рассмотрим, как добавить новые синонимы для числовых диагностических событий в версии 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

Реализация

  1. Создать файл 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}};
    
    Как видно, в файл включены текущие данные, а также два новых синонима.

  2. Создать резервную копию libserver:

    cd $ORACLE_HOME/lib
    # создание резервной копии libserver
    cp libserver19.a{,.backup}
    

  3. Замена символа 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
    

  4. Компиляция нового ksdtevt:

    # компиляция ksdtevt.c
    gcc -c ksdtevt.c
    

  5. Добавление нового ksdtevt в libserver:

    # добавление ksdtevt.o в libserver
    ar rv libserver19.a ksdtevt.o
    

  6. Линковка 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 скрипта, использующего добавленные синонимы.