Моніторинг завдань

Як зрозуміти, що реально робить завдання? Я хотів би отримувати ознаки життя від посланого на виконання SQL-оператора. Не видно ніяких блокувань, які заважали б йому працювати – я працюю на новому і практично не використовуваної сервері. Цей сервер повинен замінити поточний проїзводтсвенниє, тому я, по суті, скопіював всі налаштування. Довелося внести декілька змін в файл INIT.ORA, В основному, пов'язаних зі зміною каталогів: раніше значення compatible було 7.3.2.3.0, а тепер – 7.3.4.5.0; ресурсів enqueue було 16000, а тепер – 32000 (я просто виконав "diff" для двох файлів). Я впевнений, що ніяких блокувань не може бути, але ЩО робить завдання, мені незрозуміло.


Я намагався переглядати всі виявлені подання динамічної продуктивності V$; Де взяти їх повний список? В одній з книг, яку я читав, написано, що треба звертатися до подання X$KQFVI, Але його, схоже, немає …


Відповідь Тома Кайта


Щоб дізнатися, які завдання зараз виконуються, використовуйте наступне подання:

ops$tkyte@8i> desc dba_jobs_running
Name Null? Type
—————————– ——– ——————–
SID NUMBER
JOB NUMBER
FAILURES NUMBER
LAST_DATE DATE
LAST_SEC VARCHAR2(8)
THIS_DATE DATE
THIS_SEC VARCHAR2(8)
INSTANCE NUMBER

Щоб дізнатися, який sql-оператор виконує завдання, і виконує вона щось взагалі, можна використовувати такий сценарій sqlplus:

—— begin of showsql.sql ————————–

column status format a10
set feedback off
set serveroutput on
select username, sid, serial#, process, status
from v$session
where username is not null
/
column username format a20
column sql_text format a55 word_wrapped
set serveroutput on size 1000000
declare
x number;
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, LAST_CALL_ET
from v$session
where status = “ACTIVE”
and rawtohex(sql_address) <> “00”
and username is not null order by last_call_et )
loop
for y in ( select max(decode(piece,0,sql_text,null)) //
max(decode(piece,1,sql_text,null)) //
max(decode(piece,2,sql_text,null)) //
max(decode(piece,3,sql_text,null))
sql_text
from v$sqltext_with_newlines
where address = x.sql_address
and piece < 4)
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//
” last et = ” //
x.LAST_CALL_ET);
dbms_output.put_line(
substr( y.sql_text, 1, 250 ) );
end if;
end loop;
end loop;
end;
/
column username format a15 word_wrapped
column module format a15 word_wrapped
column action format a15 word_wrapped
column client_info format a30 word_wrapped
select username//”(“//sid//”,”//serial#//”)” username,
module,
action,
client_info
from v$session
where module//action//client_info is not null;

———————— eof ————————–


Він показує:



Може мати сенс використовувати пакет DBMS_APPLICATION_INFO для завдання значень стовпців action, client_info і module у поданні v$session– Після цього при виконанні сценарію showsql ви будете отримувати значення з цих стовпців, що допоможе зрозуміти, на якому етапі виконання зараз знаходиться програма.


Не можу отримати текст SQL. Коментар читача від ═ 22 червня 2004


Том,

я спробував використовувати твій сценарій, але зіткнувся з проблемою при використанні його спільно з FGA (Fine Grained Auditing). Ось мій сценарій:

 exec DBMS_FGA.ADD_POLICY (OBJECT_SCHEMA => "DEMO", OBJECT_NAME =>
"REF_UR", POLICY_NAME => "POL_REF_UR", HANDLER_SCHEMA =>
“DEMO”,HANDLER_MODULE=> “CAPTURE”,ENABLE => TRUE)

А ось і процедура Capture:

 CREATE OR REPLACE procedure CAPTURE_FGA (V_SCHEMA VARCHAR2, V_TABLE
VARCHAR2,V_POLICY VARCHAR2)
AS
x number;
scenario number;
testsq varchar2(4000);

begin

for x in
( select username//”(“//sid//”,”//serial#//
“) ospid = ” // process //
” program = ” // program, username,
to_char (LOGON_TIME, "Day YYYY-MM-DD HH24: MI: SS") logon_time,
to_char (sysdate, "Day YYYY-MM-DD HH24: MI: SS") current_time,
sql_address, prev_sql_addr, LAST_CALL_ET, MACHINE, TERMINAL, process, program,
audsid, sid, serial #, osuser, a.module, b.CPU_TIME, b.EXECUTIONS, b.FETCHES, b.INVALIDATIONS, b.LOADS,
b.OPTIMIZER_COST, b.OPTIMIZER_MODE, b.sorts, b.OPEN_VERSIONS, b.ROWS_PROCESSED,
b.BUFFER_GETS, b.DISK_READS, b.PARSE_CALLS, b.ELAPSED_TIME, b.USERS_EXECUTING, b.USERS_OPENING,
b.LOADED_VERSIONS,b.FIRST_LOAD_TIME,b.LAST_LOAD_TIME
from v$session a,v$sql b
where status = “ACTIVE”
and rawtohex(prev_sql_addr) <> “00”
and b.address = prev_sql_addr
and username is not null order by last_call_et)
loop
for y in ( select max(decode(piece,0,sql_text,null)) //
max(decode(piece,1,sql_text,null)) //
max(decode(piece,2,sql_text,null)) //
max(decode(piece,3,sql_text,null))
sql_text
from v$sqltext_with_newlines
where
piece < 4
–and address =x.sql_address
and address in
(select prev_sql_addr from v$session
where sid = 18
and serial# = 475)
)
loop
if ( y.sql_text not like “%listener.get_cmd%” and
y.sql_text not like "% rawtohex (sql_addresse)%")
then
insert into rt_suivi_consult_aas
(Trc_schema, trc_table, trc_policy, dt_trace, sql_text_line, terminal,
machine, username, process, program, sid, serial #, osuser, module, logon_time,
CPU_TIME, EXECUTIONS, FETCHES, INVALIDATIONS, LOADS, OPTIMIZER_COST, OPTIMIZER_MODE,
sorts, OPEN_VERSIONS, ROWS_PROCESSED, BUFFER_GETS, DISK_READS, PARSE_CALLS, ELAPSED_TIME,
USERS_EXECUTING, USERS_OPENING, LOADED_VERSIONS, FIRST_LOAD_TIME, LAST_LOAD_TIME)
values
(V_schema, v_table, v_policy, x.current_time, y.sql_text, x.terminal,
x.machine, x.username, x.process, x.program, x.sid, x.serial #, x.osuser,
x.module, x.logon_time, x.cpu_time, x.EXECUTIONS, x.FETCHES, x.INVALIDATIONS,
x.LOADS,x.OPTIMIZER_COST,x.OPTIMIZER_MODE,
x.sorts,x.OPEN_VERSIONS,x.ROWS_PROCESSED,
x.BUFFER_GETS,x.DISK_READS,x.PARSE_CALLS,
x.ELAPSED_TIME, x.USERS_EXECUTING, x.USERS_OPENING,
x.LOADED_VERSIONS, x.FIRST_LOAD_TIME, x.LAST_LOAD_TIME);
end if;
end loop;
end loop;
end;
/


Потім, я виконую

select * from ref_ur

і звертаюся до таблиці rt_suivi_consult_aas, Щоб перевірити, перехоплений чи текст SQL-оператора, виявляється, що там такий текст:

select max(decode(piece,0,sql_text,null)) //
max(decode(piece,1,sql_text,null)) //
max(decode(piece,2,sql_text,null)) //
max(decode(piece,3,sql_text,null))
sql_text

а не "select * from ref_ur"


Не підкажеш, в чому справа?


Відповідь Тома Кайта


Пакет dbms_fga вже захоплення тексту SQL-оператора – він вже в журналі аудиту (audit trail). Всі вже зроблено, просто викиньте ваш код. Саме це і робить пакет dbms_fga.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*