Шаг 84 - Представление V$session

Продолжаем мониторинг :) Давайте подробнее остановимся на представлении V$session. Посмотрим сколько оно содержит полей запускаем SQLPlus:

desc v$session;

Получаем:

SQL> desc v$session;
 Имя                       Пусто?   Тип
 ------------------------- -------- ----------------
 SADDR                              RAW(4)
 SID                                NUMBER
 SERIAL#                            NUMBER
 AUDSID                             NUMBER
 PADDR                              RAW(4)
 USER#                              NUMBER
 USERNAME                           VARCHAR2(30)
 COMMAND                            NUMBER
 OWNERID                            NUMBER
 TADDR                              VARCHAR2(8)
 LOCKWAIT                           VARCHAR2(8)
 STATUS                             VARCHAR2(8)
 SERVER                             VARCHAR2(9)
 SCHEMA#                            NUMBER
 SCHEMANAME                         VARCHAR2(30)
 OSUSER                             VARCHAR2(30)
 PROCESS                            VARCHAR2(12)
 MACHINE                            VARCHAR2(64)
 TERMINAL                           VARCHAR2(16)
 PROGRAM                            VARCHAR2(64)
 TYPE                               VARCHAR2(10)
 SQL_ADDRESS                        RAW(4)
 SQL_HASH_VALUE                     NUMBER
 PREV_SQL_ADDR                      RAW(4)
 PREV_HASH_VALUE                    NUMBER
 MODULE                             VARCHAR2(48)
 MODULE_HASH                        NUMBER
 ACTION                             VARCHAR2(32)
 ACTION_HASH                        NUMBER
 CLIENT_INFO                        VARCHAR2(64)
 FIXED_TABLE_SEQUENCE               NUMBER
 ROW_WAIT_OBJ#                      NUMBER
 ROW_WAIT_FILE#                     NUMBER
 ROW_WAIT_BLOCK#                    NUMBER
 ROW_WAIT_ROW#                      NUMBER
 LOGON_TIME                         DATE
 LAST_CALL_ET                       NUMBER
 PDML_ENABLED                       VARCHAR2(3)
 FAILOVER_TYPE                      VARCHAR2(13)
 FAILOVER_METHOD                    VARCHAR2(10)
 FAILED_OVER                        VARCHAR2(3)
 RESOURCE_CONSUMER_GROUP            VARCHAR2(32)
 PDML_STATUS                        VARCHAR2(8)
 PDDL_STATUS                        VARCHAR2(8)
 PQ_STATUS                          VARCHAR2(8)
 CURRENT_QUEUE_DURATION             NUMBER
 CLIENT_IDENTIFIER                  VARCHAR2(64)

SQL> 

Теперь опишем наиболее интересные поля:

ПолеОписание
SIDИдентификатор сеанса
SERIAL#Номер сеанса
PADDRАдрес сеанса родителя
USER#Идентификатор пользователя в Oracle (Выбирается из таблицы SYS.USER$)
USERNAMEИмя пользователя в Oracle
COMMANDТекущая команда, выполняемая в этом сеансе. Соответствие номеров и команд задается в таблице SYS.AUDIT_ACTIONS.
STATUSСтатус сеанса (ACTIVE, INACTIVE, KILLED)
SERVERТип подключения к серверу (DEDICATED, SHARED, PSEUDO, NONE)
OSUSERИмя пользователя в OS
PROGRAMПрограмма OS, которая выполнила подключение к БД.
TERMINALИмя или тип терминала с которого выполнено подключение.
TYPEТип терминала (BACKGROUND или USER)
SQL_ADDRESS
SQL_HASH_VALUE
Используется для уникальной идентификации текущего выполняемого выражения SQL.

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

 
SELECT
	b.name bgproc, p.spid, s.sid, p.serial#, s.osuser,
	s.username, s.terminal,
	DECODE(a.name, 'UNKNOWN', '-----', a.name) action
FROM
	v$process p, v$session s, v$bgprocess b,
	sys.audit_actions a
WHERE
	p.addr=s.paddr(+) AND b.paddr(+) = s.paddr AND
	a.action = NVL(s.action, 0)
ORDER BY
	sid;

Сразу понять, то что он делает не совсем просто! Так что, я тут посидел и перевел этот запрос, в более удобоваримый, вариант, хотя как сказать! :) Получился вот такой неименованный блок:

SET SERVEROUTPUT ON

DECLARE

CURSOR IS_MON IS
SELECT
 b.name, p.spid, s.sid, p.serial#, s.osuser,
 s.username, s.terminal, DECODE(a.name, 'UNKNOWN', '-----', a.name)
FROM
 v$process p, v$session s, v$bgprocess b,
 sys.audit_actions a
WHERE
 p.addr=s.paddr(+) AND b.paddr(+) = s.paddr AND
 a.action = NVL(s.action, 0)
ORDER BY
 sid;

     p_spid v$process.spid%TYPE;
   p_serial v$process.serial#%TYPE; 
      s_sid v$session.sid%TYPE;
   s_osuser v$session.osuser%TYPE;
 s_username v$session.username%TYPE;
 s_terminal v$session.terminal%TYPE;
     b_name v$bgprocess.name%TYPE;     
     a_name sys.audit_actions.name%TYPE;

BEGIN

DBMS_OUTPUT.enable;
DBMS_OUTPUT.put_line('BGProg'||'  '||'SPID'||'  '||'SID'||'  '||'Serial'||
			'   '||'OSUser'||'          '||'UserName'||'  '||'Terminal'||'  '||'DB Action');
DBMS_OUTPUT.put_line('------'||'  '||'----'||'  '||'---'||'  '||'------'||
			'   '||'------'||'          '||'--------'||'  '||'--------'||'  '||'---------');

OPEN IS_MON;

LOOP

	FETCH IS_MON INTO b_name, p_spid, s_sid, p_serial, s_osuser, s_username, s_terminal, a_name;
	
	EXIT WHEN IS_MON%NOTFOUND;

	DBMS_OUTPUT.put_line(RPAD(NVL(b_name,'NULL'),8,' ')||RPAD(NVL(p_spid,'NULL'),6,' ')||
		RPAD(TO_CHAR(NVL(s_sid, 0)),5,' ')||RPAD(TO_CHAR(NVL(p_serial,0)),9,' ')||
		RPAD(NVL(s_osuser,'NULL'),16,' ')||RPAD(NVL(s_username,'NULL'),10,' ')||
		RPAD(NVL(s_terminal,'NULL'),10,' ')||a_name);

END LOOP;

CLOSE IS_MON;

END;
/

После прогона в SQLPlus получаем:

SQL> SET SERVEROUTPUT ON
SQL> 
SQL> DECLARE
  2  
  3  CURSOR IS_MON IS
  4  SELECT
  5   b.name, p.spid, s.sid, p.serial#, s.osuser,
  6   s.username, s.terminal, DECODE(a.name, 'UNKNOWN', '-----', a.name)
  7  FROM
  8   v$process p, v$session s, v$bgprocess b,
  9   sys.audit_actions a
 10  WHERE
 11   p.addr=s.paddr(+) AND b.paddr(+) = s.paddr AND
 12   a.action = NVL(s.action, 0)
 13  ORDER BY
 14   sid;
 15  
 16       p_spid v$process.spid%TYPE;
 17     p_serial v$process.serial#%TYPE;
 18        s_sid v$session.sid%TYPE;
 19     s_osuser v$session.osuser%TYPE;
 20   s_username v$session.username%TYPE;
 21   s_terminal v$session.terminal%TYPE;
 22       b_name v$bgprocess.name%TYPE;
 23       a_name sys.audit_actions.name%TYPE;
 24  
 25  BEGIN
 26  
 27  DBMS_OUTPUT.enable;
 28  DBMS_OUTPUT.put_line('BGProg'||'  '||'SPID'||'  '||'SID'||'  '||'Serial'||
 29     '   '||'OSUser'||'          '||'UserName'||'  '||'Terminal'||'  '||'DB Action');
 30  DBMS_OUTPUT.put_line('------'||'  '||'----'||'  '||'---'||'  '||'------'||
 31     '   '||'------'||'          '||'--------'||'  '||'--------'||'  '||'---------');
 32  
 33  
 34  OPEN IS_MON;
 35  
 36  LOOP
 37  
 38   FETCH IS_MON INTO b_name, p_spid, s_sid, p_serial, s_osuser, s_username, s_terminal, a_name;
 39  
 40    EXIT WHEN IS_MON%NOTFOUND;
 41  
 42     DBMS_OUTPUT.put_line(RPAD(NVL(b_name,'NULL'),8,' ')||RPAD(NVL(p_spid,'NULL'),6,' ')||
 43        RPAD(TO_CHAR(NVL(s_sid, 0)),5,' ')||RPAD(TO_CHAR(NVL(p_serial,0)),9,' ')||
 44        RPAD(NVL(s_osuser,'NULL'),16,' ')||RPAD(NVL(s_username,'NULL'),10,' ')||
 45        RPAD(NVL(s_terminal,'NULL'),10,' ')||a_name);
 46  
 47  END LOOP;
 48  
 49  CLOSE IS_MON;
 50  
 51  END;
 52  /

BGProg  SPID  SID  Serial   OSUser          UserName  Terminal  DB Action       
------  ----  ---  ------   ------          --------  --------  ---------       
PMON    2080  1    1        SYSTEM          NULL      ORAHOME   -----           
DBW0    2112  2    1        SYSTEM          NULL      ORAHOME   -----           
LGWR    2136  3    1        SYSTEM          NULL      ORAHOME   -----           
CKPT    2160  4    1        SYSTEM          NULL      ORAHOME   -----           
SMON    2208  5    1        SYSTEM          NULL      ORAHOME   -----           
RECO    2220  6    1        SYSTEM          NULL      ORAHOME   -----           
CJQ0    2224  7    1        SYSTEM          NULL      ORAHOME   -----           
QMN0    2228  8    1        SYSTEM          NULL      ORAHOME   -----           
NULL    2536  9    3        ORAHOME\sergl   SYS       ORAHOME   -----           
NULL    NULL  0    0        NULL            NULL      NULL      -----           
NULL    2232  0    1        NULL            NULL      NULL      -----           
NULL    2236  0    1        NULL            NULL      NULL      -----           

Процедура PL/SQL успешно завершена.

SQL> 
SQL> EXIT

Вот тут очень хорошо видно, что там происходит, т.е. внутри вашего сервера Oracle. Здесь ORAHOME\sergl это имя моего 2003-го сервера, на котором у меня стоит Oracle 9.2.0 и sergl это пользователь моего сеанса, на сервере. Если посмотреть внимательно, то будет хорошо видно, что здесь и для чего, если кто не разобрался пишите, расскажу. :)


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Летучий Сергей - 22.01.2004