прямой доступ к SGA / выводы

 
Итак, мы смогли написать программку, которая читала бы данные о сессиях из SGA напрямую. Что это нам даёт? Только удовлетворение спортивного интереса. Однако, можно представить, какие дополнительные данные нам нужны, чтобы получить реальную пользу. А именно -- если для каждой сессии выводить ещё и номер процесса в OS, то эти сведения можно будет использовать в реальной жизни.
Допустим, когда у нас по какой-то причине превышено количество сессий и нет возможности зайти в Oracle, чтобы понять, кто тот лишний, кого надо убить. В таком случае мы могли бы узнать, какие же именно сессии можно убивать из операционной системы. Без этих данных нам приходится убивать сессии наугад, чтобы получить возможность законнектиться самим.

И вот что мы видим при дальнейшем исследовании:
Номер процесса содержится в поле spid представления v$process. Если посмотреть определение представления gv$process, то видно, что это поле ksuprpid в таблице x$ksupr.
Представления v$session и v$process связываются так: v$session.paddr=v$process.addr. И проблема здесь в том, что мы не можем узнать значение v$session.paddr, просто читая SGA. На странице "адреса полей в x$ksuse" видно, что у поля ksusepro (это аналог v$session.paddr) offset=0, а это означает, что значение этого поля вычисляется Oracle'ом и не хранится напрямую в структуре x$ksuse.
То есть, для того чтобы напрямую прочитать данные о номере процесса из SGA, нам необходимо сначала прочитать определённые данные из Oracle. Что не представляется возможным, если Oracle завис!

Или вот другой пример: допустим, нам захотелось делать быстрые выборки из v$sesstat. Этому представлению соответствует таблица x$ksusesta. Если посмотреть смещения полей в этой таблице, то видно, что поле ksusestn (соответствует v$sesstat.statistic#) находится по смещению 0. Т.е. значение этого поля не лежит явно в структуре, а вычисляется Oracle'ом, когда ему поступает соответствующий запрос. А значит, прочитать v$sesstat напрямую из SGA невозможно!

 

 

Разумеется, даже если мы и выяснили, что вроде как нельзя прочитать напрямую информацию о сессии и соответствующем unix процессе, то это не значит, что методика прямого чтения из SGA никуда не годится.

К примеру (и именно этот пример рассматривается в книжках и статьях на www), можно успешно (и очень быстро, что немаловажно) читать из v$session_wait, а затем анализировать/сохранять полученную информацию где-то ещё, получая своего рода продвинутый аналог v$session_wait_history из Oracle 10g.

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




назад