Продолжаем мониторинг :) Давайте подробнее остановимся на представлении 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 это пользователь моего сеанса, на сервере. Если посмотреть внимательно, то будет хорошо видно, что здесь и для чего, если кто не разобрался пишите, расскажу. :)