Запросы пользователей. В копилку администратору

dbstalker, 18 сентября

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

set feedback off
set serveroutput on size 9999
column username format a20
column sql_text format a55 word_wrapped
begin
  for x in
   (select username||'('||sid||','||serial#||') ospid = '|| process ||
    ' program = ' || program username,
    to_char(LOGON_TIME,' Day HH24:MI') logon_time,
    to_char(sysdate,' Day HH24:MI') current_time,
    sql_address,
    sql_hash_value
   from v$session
   where status = 'ACTIVE'
   and rawtohex(sql_address) <> '00'
   and username is not null ) loop
   for y in (select sql_text
   from v$sqlarea
   where address = x.sql_address ) loop
   if ( y.sql_text not like '%listener.get_cmd%' and
    y.sql_text not like '%RAWTOHEX(SQL_ADDRESS)%' ) then
    dbms_output.put_line( '--------------------' );
    dbms_output.put_line( x.username );
    dbms_output.put_line( x.logon_time || ' ' || x.current_time || ' SQL#=' || x.sql_hash_value);
    dbms_output.put_line( substr( y.sql_text, 1, 250 ) );
   end if;
  end loop;
 end loop;
end;
/

Запрос был вытянут в своё время из Интернета, автора сейчас найти не могу. Если все же авторство будет установлено, то сразу же Вы об этом узнаете.

Автору - огромное спасибо.

12 комментариев

Прокоментировать

ShadowZ
18 сентября 2008 г. в 16:52

а не проще ли так?
SELECT vs.schemaname, vs.osuser, vs.machine, vs.logon_time, sa.sql_text
FROM v$session vs, v$sqlarea sa
WHERE vs.sql_hash_value = sa.hash_value AND status = 'ACTIVE';

dbstalker
18 сентября 2008 г. в 17:46

Вы правы. Ваш запрос проще. Но одинаков ли результат?

Дядя Жора
19 сентября 2008 г. в 10:00

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

ShadowZ
19 сентября 2008 г. в 11:59

OEM не всегда под рукой.

ruslan
30 сентября 2008 г. в 13:27

согласен по поводу OEM. и заметил что многие DBA как то нехотя им пользуются. почему конечно вопрос.

Ruslan Z.
15 октября 2009 г. в 17:32

По поводу OEM - он тяжелый, поэтому жрет ресурсы, иногда у джавы сносит крышу и продакшн начинает тормозить (сам наблюдал такое поведение на AIX 5.3, на котором крутилась OLTP система обработки транзакций с банкоматов... думаю не очень приятно наблюдать на экране надпись типа Service busy :))) Как правило OEM использовать хорошо в GRID, но когда одна-две БД, нет смысла ставить отдельный сервер для всей инфраструктуры... Как замену, для OEM можно использовать TOAD, но это если есть возможность подключиться толстым клиентом :)))
Часто ситуация складывается так, что надо быстро сделать и из консоли - это проще и быстрее ;) так, что скрипты оооооочень выручают ;).

ShadowZ
19 сентября 2008 г. в 10:14

Вот этот запрос возвращает результат идеинтичный результату работы представленного pl\sql блока.
SELECT vs.username, vs.SID, vs.serial#, vs.process ospid, vs.program,
    vs.sql_hash_value sql#, vs.logon_time, SYSDATE, sa.sql_text
FROM v$session vs, v$sqlarea sa
WHERE vs.sql_hash_value = sa.hash_value AND status = 'ACTIVE';

dbstalker
19 сентября 2008 г. в 10:39

Настаиваю - результат этих двух запросов не одинаков! Обратите внимание, что Ваш запрос выдает не только пользовательские запросы.

ShadowZ
19 сентября 2008 г. в 12:00

Действительно не учел, исправляюсь:
SELECT vs.schemaname, vs.osuser, vs.machine, vs.logon_time, sa.sql_text
FROM v$session vs, v$sqlarea sa
WHERE vs.sql_hash_value = sa.hash_value
  AND status = 'ACTIVE'
  AND RAWTOHEX (vs.sql_address) <> '00'
  AND vs.username IS NOT NULL;

dbstalker
19 сентября 2008 г. в 12:32

Супер! осталось еще отбросить свой запрос и тогда результат будет идентичным.

ShadowZ
19 сентября 2008 г. в 13:15

PL\SQL дольше выполняется чем SQL ;-)

k0t
8 декабря 2009 г. в 15:33

SELECT vs.schemaname, vs.osuser, vs.machine, vs.logon_time, sa.sql_text
FROM v$session vs, v$sqlarea sa
WHERE vs.sql_hash_value = sa.hash_value
AND status = 'ACTIVE'
AND RAWTOHEX (vs.sql_address) <> '00'
AND vs.username IS NOT NULL
AND decode(vs.AUDSID,0,(SELECT SID FROM v$mystat WHERE ROWNUM<=1),vs.AUDSID) <> decode(vs.AUDSID,0,vs.sid,sys_context('userenv','SESSIONID'));

 

Новый комментарий

Я не спамер: введите суму 2+6



 

От авторов блога

О Блоге - прочитай перед началом.

Задать вопрос и получить ответ - уже решено 94 вопросов

Глоссарий - список терминов и сокращений


 
 

Бизнес форум

Последние темы:

Расписание автобусов
18 июля, 3 ответа
Отдых в августе
17 июля, 4 ответа