прямой доступ к 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.
В целом, после изучения предмета, можно сделать вывод, что это работающая методика у которой, несомненно, есть свои области применения.