Трассировка сеанса не вызывает затруднений, если имеется доступ на чтение и запись исходного кода, выполняющегося в трассируемом сеансе. Включение и выключение расширенной трассировки 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.5 и 6.6. Корпорация Oracle рекомендует применять пакет DBMS_SUPPORT вместо DBMS_SYSTEM, когда есть возможность выбора (комментарий 62294.1 от Oracle MetaLink). Однако файлы 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 К несчастью, случайная ошибка при вводе номера события может иметь катастрофические последствия.
< Предыдущая | Следующая > |
---|