(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

За чем следить и чем управлять при работе приложений с Oracle

   Владимир Пржиялковский, преподаватель технологий Oracle

         …  Паллада Афина,

 За руку взявши, воскликнула к бурному богу Арею:

 "… не бросим ли мы и троян и ахеян

Спорить одних, да Кронид промыслитель их славу присудит ? ... "

Гомер, Илиада

 

Одним из бедствий времени был застарелый произвол доносчиков и их подстрекателей.

Светоний, Жизнь Двенадцати Цезарей: Божественный Тит

Избирательное слежение за выполнением запросов SQL и загрузкой СУБД средствами пакета DBMS_MONITOR

Давнее средство Oracle SQL Trace позволяет фиксировать "профиль запросов SQL", выдаваемых серверными процессами, обслуживающими сеансы связи с СУБД, и представляет из себя полезный инструмент для выявления проблемных запросов и анализа загрузки СУБД приложениями.  До версии 10 оно могло включаться и выключаться только для конкретных сеансов связи с СУБД.  Это не всегда удобно, поскольку в жизни более насущны профилирование и отладка приложения , или даже его фрагментов, а между приложением и сеансом чаще всего нет взаимнооднозначной связи. 

Новый для версии 10 пакет DBMS_MONITOR расширил ранее имевшуюся возможность профилирования SQL-действий сеанса (своего либо чужого) слежением за действиями отдельных приложений и их частей.  Для этого используется модель "служба БД" - "модуль" - "действие".  Между этими понятиями нет формальной зависимости, но методически предлагается сопоставлять "службе БД" группу логически связанных сеансов, "модулю" - приложение, работающее с данными, а "действию" - эпизод работы приложения.  Точнее, средствами пакета можно отслеживать выдачу запросов SQL с точностью до следующих единиц:

  • "служб", отождествляемых значением SERVICE_NAME,
  • "модулей", отождествляемых значением MODULE,
  • "действий", отождествляемых значением ACTION,
  • сеансов, отождествляемых значением CLIENT_IDENTIFIER,
  • сеансов, отождествляемых значениями < sid , serial # >,
  • экземпляров СУБД, отождествляемых значением INSTANCE_NAME.

Просмотр и установка единиц слежения рассматриваются ниже.

Вдобавок пакет DBMS_MONITOR позволяет собирать обобщенную статистику выполняемых сеансами или приложениями запросов.

Единицы слежения

В то время как слежение за действиями сеанса (своего или чужого) и всех сеансов экземпляра СУБД не вызывает вопросов, остальные единицы слежения могут требовать пояснения.

Понятие служба БД (SERVICE) формировалось в Oracle начиная с версии 8, и к настоящему времени используется для логического группирования сеансов с целью как раз-таки иметь обобщенную единицу слежения и управления при использовании общей БД разными приложениями.  Например, сеансы одной и той же службы БД могут присутствовать одновременно на разных узлах кластера в конфигурации RAC, а в рамках одной и той же СУБД могут одновременно исполняться сеансы разных служб.  Службу предлагается связывать с набором приложений, объединенных общими свойствами, пороговыми характеристиками или правилами потребления ресурсов СУБД.

Понятие модуль (MODULE) используется для обозначения периода работы конкретного приложения в течение сеанса, а понятие действия (ACTION) - конкретного фрагмента приложения, то есть эпизода выдачи приложением определенной последовательности команд SQL. 

Назначение опознавателя клиента (CLIENT IDENTIFIER) - метить сеансы, например установленные по схеме использования общих серверных процессов (shared server), или сеансы конечных пользователей при работе через сервер приложений (например, приложений для web). 

Установка единиц слежения и просмотр существующих значений

Упомянутые значения единиц слежения за работой приложения наблюдаемы в программе либо из полей таблиц словаря-справочника, либо из встроенного контекста сеанса с именем USERENV:

Значение

Поле таблиц

Параметр контекста USERENV сеанса

SERVICE_NAME

V$SESSION, V$SERVICES

SERVICE_NAME

MODULE

V$SESSION

MODULE

ACTION

V$SESSION

ACTION

CLIENT_IDENTIFIER

V$SESSION

CLIENT_IDENTIFIER

SID

V$SESSION

SID

SERIAL#

V$SESSION

INSTANCE_NAME

V$INSTANCE

INSTANCE_NAME

Например, все значения, кроме SERIAL#, наблюдаемы в соответствующих параметрах контекста USERENV сеанса связи клиентской программы с СУБД. 

Для дальнейшего просмотра этих параметров в SQL*Plus удобно подготовить файл с параметризованным обращением к контексту USERENV посредством системной функции SYS_CONTEXT:

SELECT SYS_CONTEXT ( 'userenv', '&1' ) AS &1 FROM dual.

SAVE userenv REPLACE

SET VERIFY OFF

Пример установки и просмотра SERVICE_NAME

Значение SERVICE_NAME выставляется автоматически при установлении соединения, а управление службами происходит посредством пакета DBMS_SERVICE.CREATE_SERVICE. 

Простые примеры создания, включения, подключения, отключения и удаления:

EXECUTE DBMS_SERVICE.CREATE_SERVICE ( 'secunda', 'secunda.class' )

EXECUTE DBMS_SERVICE.START_SERVICE  ( 'secunda' )

CONNECT /@localhost:1521/secunda.class AS SYSDBA

EXECUTE DBMS_SERVICE.STOP_SERVICE   ( 'secunda' )

EXECUTE DBMS_SERVICE.DELETE_SERVICE ( 'secunda' )

Еще один способ создания служб - через командный интерфейс с помощью программы srvctl .

Возможные значения SERVICE_NAME указываются в сетевых установках Oracle и регистрируются в качестве службы БД процессом listener .  Значения зарегистрированных в рамках БД служб можно наблюдать в таблице V$SERVICES.  Помимо сконфигурированных, всегда имеются две внутренние службы: SYS$BACKGROUND используется внутренними процессами СУБД, а к SYS$USERS причисляются соединения пользователей, не указавших желаемую им службу.

Пример просмотра:

SQL> CONNECT scott/tiger@prima.class

Connected.

SQL> @userenv SERVICE_NAME

SERVICE_NAME

--------------------------------------------------------------------

prima.class

Упражнение .  Просмотреть список служб, зарегистрированных для рабочей БД.  Объяснить наличие служб SYS$USERS и SYS$BACKGROUND.

Пример установки и просмотра MODULE и ACTION

Значения MODULE и ACTION устанавливаются в программе с помощью пакета DBMS_APPLICATION_INFO.  Пример:

SQL> EXECUTE DBMS_APPLICATION_INFO.SET_MODULE -

 2    ( 'some module', 'some action' )

PL/SQL procedure successfully completed.

SQL> @userenv MODULE

MODULE

--------------------------------------------------------------------

some module

SQL> @userenv ACTION

ACTION

--------------------------------------------------------------------

some action

SQL> EXECUTE DBMS_APPLICATION_INFO.SET_ACTION ( '' )

PL/SQL procedure successfully completed.

SCOTT> /

ACTION

---------------------------------------------------------------------

SQL>

Пример установки и просмотра CLIENT_IDENTIFIER

Значение CLIENT_IDENTIFIER выставляется программно с помощью пакета DBMS_SESSION или же вызовом OCI setClientIdentifier (только JDBC в версии 9).  Пример:

SQL> @userenv CLIENT_IDENTIFIER

CLIENT_IDENTIFIER

---------------------------------------------------------------------

SQL> EXECUTE DBMS_SESSION.SET_IDENTIFIER ( 'Web client' )

 PL/SQL procedure successfully completed.

/

CLIENT_IDENTIFIER

-------------------------------------------------------------------

Web client

Пример отслеживания запросов SQL со стороны приложения и его элементов

Процедура SERV_MOD_ACT_TRACE_ENABLE пакета DBMS_MONITOR позволяет следить за выдачей запросов SQL отдельными "приложениями", "модулями" в составе приложений и "действиями" в рамках модулей.  Пример:

DBMS_MONITOR.SERV_MOD_ACT_TRACE_ENABLE (

  service_name  => 'prima.class'

, module_name   => 'SQL*Plus'

, action_name   => DBMS_MONITOR.ALL_ACTIONS

, waits         => TRUE

, binds         => TRUE

, instance_name => NULL

);

/*

 *  ... выжидаем, пока длится работа

 */

DBMS_MONITOR.SERV_MOD_ACT_TRACE_DISABLE (

  service_name  => 'prima.class'

, module_name   => 'SQL*Plus'

, action_name   => DBMS_MONITOR.ALL_ACTIONS

, instance_name => NULL

);

Для параметра MODULE_NAME по аналогии можно указать ALL_MODULES.

Таким же образом включается трассирование запросов, поступающих из текущего или чужого сеансов (SESSION_TRACE_ENABLE/DISABLE), сеансов, помеченых CLIENT_IDENTIFIER (CLIENT_ID_TRACE_ENABLE/DISABLE) и из всех сеансов подряд, или же порождаемых определенным экземпляром СУБД, например из конфигурации RAC (DATABASE_TRACE_ENABLE/DISABLE).

Просмотр профиля выдачи запросов SQL выполняется с помощью программ tkprof и trcsess .  Последняя программа стала поставляться в ПО версии Oracle 10 и как раз-таки и выбирает из трассировочных файлов разных процессов данные, относящиеся к указанным единицам слежения.  Вот пример, как может выглядеть совместное использование этих программ:

>trcsess output=out.txt module=SQL*Plus c:\oracle\admin\prima\udump\*

>tkprof out.txt final.txt

Упражнение .  Включить трассирование всех запросов SQL, поступающих от сеансов SQL*Plus, и наблюдать накопление профиля выдачи запросов.  Отключить трассирование.

Пример сбора статистики о запросах SQL в приложении

Для сеансов, помеченых CLIENT_IDENTIFIER, и для приложений, помеченых комбинациями SERVICE_NAME - MODULE - ACTION, пакет DBMS_MONITOR позволяет не только собирать профиль выдачи запросов SQL, но и статистику затрат СУБД на обработку запросов.

Пример со сбором статистики о работе определенных клиентов.  Выдадим:

CONNECT / as sysdba

EXECUTE DBMS_MONITOR.CLIENT_ID_STAT_ENABLE ( 'Web client' )

HOST sqlplus scott/tiger

EXECUTE DBMS_SESSION.SET_IDENTIFIER ( 'Web client' )

SELECT COUNT ( * ) FROM dual;

EXIT

Здесь с помощью команды HOST программы SQL*Plus был осуществлен короткий запуск сеанса, помеченного значением CLIENT_IDENTIFIER = 'Web client'.

Продолжим в изначальном сеансе от имени SYS:

SYS> SELECT aggregation_type, primary_id

2> FROM dba_enabled_aggregations;

AGGREGATION_TYPE      PRIMARY_ID

--------------------- --------------------------------------------

CLIENT_ID             Web client

SYS> COLUMN client_identifier FORMAT A20

SYS> COLUMN stat_name         FORMAT A35

SYS> COLUMN value             FORMAT 99999999

SYS> SELECT client_identifier, stat_name, value

  2> FROM v$client_stats

  3> ;

CLIENT_IDENTIFIER    STAT_NAME                               VALUE

-------------------- ----------------------------------- ---------

Web client           user calls                                  4

Web client           DB time                                  3807

Web client           DB CPU                                   3807

Web client           parse count (total)                         2

Web client           parse time elapsed                        421

Web client           execute count                               4

Web client           sql execute elapsed time                 1940

Web client           opened cursors cumulative                   2

...

SYS> EXECUTE DBMS_MONITOR.CLIENT_ID_STAT_DISABLE ( 'Web client' )

PL/SQL procedure successfully completed.

Вот перечень системных таблицы, позволяющих контролировать сбор статистики и наблюдать результаты:

DBA_ENABLED_AGGREGATIONS

V$CLIENT_STATS

V$SERVICE_STATS

V$SERV_MOD_ACT_STATS

V$SERVICEMETRIC

V$SERVICEMETRIC_HISTORY

Последние две дают подробную информацию о расходовании процессорного времени.

Это был пример с использованием процедур CLIENT_ID_STAT_ENABLE/DISABLE.  Процедуры SERV_MOD_ACT_STAT_ENABLE/DISABLE используются аналогично.

Упражнение .  Включить сбор обобщенной статистики выполнения запросов SQL всех соединений к СУБД по SQL*Plus и наблюдать ее накопление.  Отключить сбор статистики.

Не только слежение и не только из программы

Из указаных выше единиц слежения наиболее разработанной является служба.  Она не только позволяет следить за действиями приложений, но и является единицей управления.  Вот пример возможностей ее употребления в этом качестве на настоящий момент:

-          В планировщике заданий со службой можно связать конкретный класс заданий (пакет DBMS_SCHEDULER, процедура CREATE_JOB_CLASS). 

-          Сеансы, осуществляемые в рамках службы, можно указать в определении группы потребителей ресурсов СУБД при работе с распределителем (диспетчером) ресурсов (пакет DBMS_RESOURCE_MANAGER, процедура SET_CONSUMER_GROUP_MAPPING). 

-          В системе предупредительной сигнализации именно для конкретной службы можно устанавливать пороговые значения для общего времени (ELAPSED_TIME_PER_CALL) и процессорного времени (CPU_TIME_PER_CALL) обработки запросов SQL, о превышении которых СУБД будет докладывать автоматически (пакет DBMS_SERVER_ALERT, процедура SET_THRESHOLD).

-          Процедура DISCONNECT_SESSION из пакета DBMS_SERVICE останавливает все сеансы требуемой службы.

Упомянутые пакеты DBMS_SCHEDULER, DBMS_SERVER_ALERT и DBMS_SERVICE, а также процедура SET_CONSUMER_GROUP_MAPPING старого пакета DBMS_RESOURCE_MANAGER появились в версии 10.

Кроме того, все реализованные программно возможности слежения и управления широко представлены соответствующими web-страницами OEM.

Ссылки по теме


 Распечатать »
 Правила публикации »
  Написать редактору 
 Рекомендовать » Дата публикации: 03.02.2009 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
Oracle Database Standard Edition 2 Named User Plus License
Oracle Database Personal Edition Named User Plus Software Update License & Support
Oracle Database Standard Edition 2 Processor License
Oracle Database Personal Edition Named User Plus License
TeeBI for RAD Studio Suite with source code single license
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Новости ITShop.ru - ПО, книги, документация, курсы обучения
Программирование на Microsoft Access
CASE-технологии
СУБД Oracle "с нуля"
Мастерская программиста
Adobe Photoshop: алхимия дизайна
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
 



    
rambler's top100 Rambler's Top100