Моніторинг завдань, Інші СУБД, Бази даних, статті

Як зрозуміти, що реально робить завдання? Я хотів би отримувати ознаки життя від посланого на виконання SQL-оператора. Не видно жодних блокувань, які заважали б йому працювати – я працюю на новому і практично не використовується сервері. Цей сервер повинен замінити поточний проізводтсвенний, тому я, по суті, скопіював всі налаштування. Довелося внести декілька змін в файл INIT.ORA, В основному, пов’язаних зі зміною каталогів: раніше значення compatible було 7.3.2.3.0, а тепер – 7.3.4.5.0; ресурсів enqueue було 16000, а тепер – 32 000 (я просто виконав “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>

*

*