Как определить запрос Oracle без доступа к исходному коду? - PullRequest
2 голосов
/ 14 января 2009

У нас есть система с серверной частью Oracle, к которой у нас есть доступ (хотя, возможно, и не административный доступ), и интерфейсная часть, к которой у нас нет исходного кода. База данных довольно большая и не так легко понять - у нас нет документации. Я также не особо разбираюсь в Oracle.

Один из аспектов внешнего интерфейса запрашивает базу данных для определенного набора данных и отображает его. Нам необходимо определить, какой запрос выполняется, чтобы мы могли его реплицировать и автоматизировать без внешнего интерфейса (например, периодически генерируя файл csv).

Какие методы вы бы использовали для определения SQL, необходимого для извлечения этого набора данных?

В настоящее время я склоняюсь к использованию EeePC, Wireshark и концентратора (установка Wireshark на клиентские машины может быть невозможна), но мне любопытно услышать какие-либо другие идеи и может ли кто-нибудь подумать о каких-либо подводных камнях с этим конкретным подходом.

Ответы [ 7 ]

12 голосов
/ 14 января 2009

Очевидно, что существует много методов. То, что я считаю самым простым:

(1) Подключиться к базе данных как SYS или SYSTEM

(2) Запрос V $ SESSION для определения интересующего вас сеанса базы данных. Запишите значения SID и SERIAL #.

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

exec sys.dbms_system.set_bool_param_in_session( *sid*, *serial#*, 'timed_statistics', true )
exec sys.dbms_system.set_int_param_in_session( *sid*, *serial#*, 'max_dump_file_size', 2000000000 )
exec sys.dbms_system.set_ev( *sid*, *serial#*, 10046, 5, '' )

(4) Выполнить некоторые действия в клиентском приложении

(5) Либо завершите сеанс базы данных (например, закрыв клиент), либо деактивируйте трассировку (exec sys.dbms_system.set_ev ( sid , serial # , 10046, 0, ''))

(6) Найдите папку udump на сервере базы данных. Будет файл трассировки для сеанса базы данных, показывающий выполненные операторы и значения привязки, используемые при каждом выполнении.

Этот метод не требует доступа к клиентскому компьютеру, что может быть полезным. Для этого требуется доступ к серверу базы данных, что может быть проблематично, если вы не администратор базы данных, и они не пропускают вас на компьютер. Кроме того, определение надлежащего сеанса для отслеживания может быть затруднено, если у вас много клиентов или если клиентское приложение открывает более одного сеанса.

6 голосов
/ 14 января 2009

Начните с запроса системных представлений Oracle, таких как V $ SQL, v $ sqlarea и v $ sqltext.

2 голосов
/ 14 января 2009

Какая версия Oracle? Если это 10+ и если у вас есть административный доступ (sysdba), вы можете относительно легко найти выполненные запросы через Oracle Enterprise Manager.

Для более старых версий вам потребуется доступ к представлениям, упомянутым Туинстоулем в его ответе.

Те же данные, которые вы можете получить через TOAD для оракула , который является довольно функциональным программным обеспечением, но дорогим.

2 голосов
/ 14 января 2009

Wireshark действительно хорошая идея, она поддерживает Oracle и прекрасно отображает весь разговор.

Анализатор пакетов, такой как Wireshark, особенно интересен, если у вас нет прав администратора на сервере базы данных, но у вас есть доступ к сети (например, из-за зеркального отображения портов на коммутаторе Ethernet).

1 голос
/ 15 января 2009

«хотя возможно не административный доступ». Кто-то должен иметь административный доступ, вероятно, тот, кто отвечает за резервное копирование. По крайней мере, я ожидаю, что у вас будет пользователь с правами root / Administrator на компьютере, на котором работает база данных Oracle. Администратор должен иметь возможность войти с Синтаксис «SQLPLUS / AS SYSDBA», обеспечивающий полный доступ (что может быть довольно опасным). root может 'su' для пользователя oracle и сделать то же самое.

Если вы действительно не можете получить доступ администратора, то в качестве альтернативы wireshark, если ваш клиентский интерфейс подключается к базе данных через клиент Oracle, найдите файл sqlnet.ora. Вы можете установить trace_level_client, trace_file_client и trace_directory_client и получить его для регистрации сетевого трафика Oracle между клиентом и сервером базы данных.

Однако возможно, что клиент вызовет хранимую процедуру и извлечет данные в качестве выходных параметров или указателя ref, что означает, что вы можете не видеть запрос, выполняемый через этот механизм. Если это так, вам понадобится административный доступ к серверу базы данных и отслеживание в соответствии с ответом Дэйва Косты

1 голос
/ 14 января 2009

Я успешно использовал эти инструкции несколько раз: http://www.orafaq.com/wiki/SQL_Trace#Tracing_a_SQL_session

0 голосов
/ 15 января 2009

Быстрый и грязный способ сделать это, если вы можете поймать оператор (ы) SQL в действии, - запустить это в SQL * Plus: -

set verify off lines 140 head on pagesize 300

column sql_text format a65
column username format a12
column osuser format a15

break on username on sid on osuser

select S.USERNAME, s.sid, s.osuser,sql_text
from v$sqltext_with_newlines t,V$SESSION s
where t.address =s.sql_address
and t.hash_value = s.sql_hash_value 
order by s.sid,t.piece
/

Вам нужен доступ к этим v $ views, чтобы это работало. Обычно это означает подключение как система.

...