DeepEdit!

Программирование баз данных на Oracle, техническая документация, литература, статьи и публикации

  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта

Трассировка собственного кода


Трассировка сеанса не вызывает затруднений, если имеется доступ на чтение и запись исходного кода, выполняющегося в трассируемом сеансе. Включение и выключение расширенной трассировки SQL требу­ет лишь, чтобы ядро Oracle выполнило приведенные в примере 6.1 ко­манды SQL. Первая строка гарантирует, что параметр временной стати­стики TIMED_STATISTICS для сеанса активирован, независимо от его значе­ния, установленного для всего экземпляра. Если временная статистика Oracle не активирована, все значения e, c, ela и tim будут нулевыми, сле­довательно, бесполезными с точки зрения анализа времени отклика.
Пример 6.1. Код, включающий и выключающий расширенную трассировку SQL для сеанса
Вторая строка запрещает ядру Oracle усекать файл трассировки без яв­ного указания. Параметр MAX_DUMP_FILE_SIZE позволяет администрато­ру базы данных Oracle ограничить размер создаваемых сеансами трас­сировочных файлов. Такая возможность предусмотрена для того, что­бы аналитики по производительности случайно не переполнили фай­ловую систему, указанную параметрами USER_DUMP_DEST и BACKGROUND_ DUMP_DEST. Однако, сделав это ограничение слишком строгим, можно допустить досадную ошибку, способную привести к дорогостоящим последствиям в проекте, посвященном повышению производительно-сти.1 Последнее, что хотел бы увидеть аналитик, три недели тщательно готовившийся к трассировке большого ежемесячного пакетного зада­ния, - это обрубок трассировочного файла, заканчивающийся строкой:
*** DUMP FILE SIZE IS LIMITED TO 1048576 BYTES ***
Возможность отмены ограничения на размер дампа влечет за собой от­ветственность за поддержание порядка в файловой системе, в которую будут записаны трассировочные файлы. Если в файловой системе, в которую пишет ядро Oracle, возникает ошибка переполнения, трассировочный файл будет усечен. В конце файла расположится нечто примерно следующее:
Имейте в виду, что некоторые версии Oracle (в особенности Oracle8i для Microsoft Windows) не поддерживают ключевое слово UNLIMITED. В таких случаях достаточно указать в качестве значения параметра MAX_DUMP_FILE_SIZE большое целое число. В 32-разрядных реализациях Oracle, имеющихся в нашей лаборатории, максимально допустимое значение составляет 231 - 1 = 2 147 483 647. Заметьте также, что пара­метры TIMEDSTATISTICS и MAX_DUMP_FILE_SIZE могут устанавливаться для сеанса, начиная с Oracle 7.3. В более ранних версиях единственным способом задать значение для любого из них для определенной сессии была установка данного значения для всего экземпляра.
Возможно, когда-нибудь и параметр USERDUMPDEST можно будет уста­навливать на уровне сеанса. Это будет полезно, т. к. позволит при вы­боре места для трассировочных файлов руководствоваться соображе­ниями экономии дискового пространства, производительности или просто удобства доступа. Документация для Oracle 9.2 утверждает, что параметр USERDUMPDEST может быть установлен для сеанса [Oracle (2002)]. Однако это не соответствует действительности, по крайней ме­ре, в Oracle 9.2.0.1.0 для MS Windows.
Команда в третьей строке примера 6.1 помещает строку «POX20031031a» в имя результирующего файла трассировки (такая возможность введена в версии 8.1.7). Использование такого уникального идентификатора в имени трассировочного файла впоследствии облегчит поиск файла с собранной нами информацией. Подойдет любой уникальный иденти­фикатор. В этом примере выбрано мнемоническое имя, означающее вы­полнение «a» отчета «POX», запущенного 31 октября 2003 года.
В Oracle9 по умолчанию установлено значение UNLIMITED.
Четвертая строка примера 6.1 запускает сам механизм расширенной трассировки SQL, вынуждая ядро Oracle выводить статистику в файл трассировки процесса ядра. Обратите внимание, в этом примере механизм расширенной трассировки SQL активирован с уровнем трасси­ровки 8. Для выключения трассировки добавлено ключевое слово OFF, устанавливающее уровень трассировки в 0. Уровни трассировки опи­саны в табл. 6.1.

Несмотря на то, что трассировка может быть отключена явно, зачас­тую этого лучше не делать. Параметр трассировки сеанса оканчивает жизнь вместе с сеансом, поэтому, когда пользователь отсоединяется от Oracle, трассировочный файл аккуратно закрывается. Окончание трас­сировки по завершении сеанса - лучшая гарантия того, что все строки STAT для сеанса выведены в трассировочный файл. Причина этого объ­ясняется в главе 5. Разумеется, если трассируется постоянное соеди­нение с Oracle, подобное тому, которое используется процессами, сконфигурированными как «linked internal» в приложении Oracle Applications Concurrent Manager, то придется отключать трассировку явно. К счастью, отсутствующие строки STAT достаточно легко воспро­изводятся с помощью команды EXPLAIN PLAN или нового фиксированно­го представления V$SQL_PLAN (доступного в версии 9).
Трассировка чужого кода
Можно трассировать любые сеансы Oracle по своему выбору, включая фоновые. Вам кажется, что запись в файлы БД выполняется слишком медленно? Выполните трассировку DBWR и разберитесь. Считаете, что запись в оперативные журнальные файлы занимает слишком много времени? Выполните трассировку LGWR и выясните причину. А для того чтобы узнать, чего стоит ядру Oracle автоматическое слияние таб­личных пространств, выполните трассировку SMON - и узнаете.

Не пытайтесь выполнить расширенную трассировку PMON -это может привести к сбою экземпляра (ошибка Oracle 2329767, предположительно, исправленная в Oracle версии 10). К сча­стью, имеется очень мало разумных причин, по которым можно было бы захотеть трассировать PMON.
Включение трассировки триггером сеанса
Если возникает необходимость трассировки программы, к исходному коду которой нет доступа на чтение и запись, план несколько услож­няется. Как правило, это не намного сложнее, достаточно иметь неко­торое воображение. Можно, например, использовать триггер AFTER LOGON (появившийся в версии 8.1) для включения трассировки с уров­нем 8 для любого сеанса с заданным атрибутом. В примере 6.2 показа­но создание триггера, включающего трассировку всех сеансов, в кото­рых имя пользователя Oracle содержит суффикс _test.
Пример 6.2. Создание триггера, включающего трассировку всех сеансов, создаваемых пользователями, чьи имена содержат суффикс _test
Особенности реализации подобных триггеров могут существенно ме­няться от приложения к приложению. Здесь важно хорошо понимать работу приложения, чтобы творчески подойти к выбору способа акти­вации расширенной трассировки SQL для выбранного сеанса.
Включение трассировки из другого сеанса
В состав Oracle входит пакет процедур, позволяющих управлять атри­бутами сеансов, не устанавливая с ними соединения. Первая задача за­ключается в том, чтобы идентифицировать сеанс, подлежащий трас­сировке. Большинству администраторов баз данных хорошо знакомы способы поиска значений SID и SERIAL# (из фиксированного представле­ния V$SESSION) для процессов, принадлежащих управляемым ими при­ложениям. В примере 6.3 показана соответствующая команда SQL.
Приложение может заметно упростить задачу идентификации сеанса, предоставив пользователю какую-либо характерную информацию о се­ансе. Представьте себе приложение, способное вывести значения
V$SESSION.SID и V$SESSION.SERIAL# непосредственно на экранную форму.
Это очень поможет пользователю, когда он будет объяснять аналити­ку, как тому определить сеанс, требующий углубленного анализа про­изводительности.
Пакет   DBMS_APPLICATION_INFO   содержит   три   полезные   процедуры,
SET_MODULE, SET_ACTION и SET_CLIENT_INFO, способные помочь в идентифи­кации сеансов Oracle. Каждая из процедур записывает значение в фик­сированное представление V$SESSION для сеанса, выполняющего проце­дуру. Атрибуты MODULE, ACTION и CLIENTINFO образуют иерархию, хорошо подходящую для идентификации пользовательских операций. Напри­мер, приложение пользователя Nikolas Alexander может установить следующие значения:
dbms_application_info.set_module('Accounts Payable') dbms_application_info.set_action('Pay Invoices') dbms_application_info.set_client_info('Nikolas Alexander')
После того как приложение таким образом «отметилось» при помощи процедур пакета DBMS_APPLICATION_INFO, не составляет труда найти сеанс определенного клиента, все сеансы Oracle, выполняющие определенную пользовательскую операцию, и даже все сеансы, участвующие в выпол­нении операций определенного модуля. Например, приведенный ниже запрос возвращает идентификационные данные всех сеансов, выпол­няющих операцию «Pay Invoices» модуля «Accounts Payable»:
Если для сеанса, требующего трассировки, получены значения SID и SE-RIAL#, включение трассировки не вызывает затруднений. В примере 6.4 показано, как с помощью пакета DBMS_SYSTEM активировать параметр TIMEDSTATISTICS для заданного сеанса и как установить для него значе­ние параметра MAX_DUMP_FILE_SIZE. Даже если пакетом DBMS_SYSTEM поче­му-либо нельзя воспользоваться, начиная с версии 7.3, можно, не останавливая всю систему, управлять этими параметрами на уровне экземпляра посредством команд ALTER SYSTEM.
Пример 6.4. Управление параметрами сеанса, определяемого значениями :sid и :serial
Е сть несколько способов включения расширенной трассировки задан­ного сеанса. Два из них показаны в примерах 6.5 и 6.6. Корпорация Oracle рекомендует применять пакет DBMS_SUPPORT вместо DBMS_SYSTEM, когда есть возможность выбора (комментарий 62294.1 от Oracle Meta­Link). Однако файлы dbmssupp.sql и prvtsupp.plb поставляются не во всех дистрибутивах. Если в системе отсутствует DBMS_SUPPORT, не отчаи­вайтесь. Мы с коллегами в своих проектах повышения производитель­ности сотни раз использовали DBMS_SYSTEM.SET_EV без каких-либо непри­ятных последствий. Мои знакомые из службы технической поддерж­ки Oracle сообщили мне, что все равно процедура DBMS_SUPPORT.START_ TRACE_IN_SESSION реализована как вызов SET_EV.

Применение START_TRACE_IN_SESSION более безопасно в силу того, что она исключает риск опечатки при указании события 10046. I  К несчастью, случайная ошибка при вводе номера события мо­жет иметь катастрофические последствия.

 









jAntivirus