SRDC - Diagnostic Collection for DataPump Export Performance Issues (Doc ID 1935743.1)
REM srdc_expdp_performance.sql - Gather Information for EXPDP Performance Issues
define SRDCNAME='EXPDP_PERFORMANCE'
SET MARKUP HTML ON PREFORMAT ON
set TERMOUT off FEEDBACK off verify off TRIMSPOOL on HEADING off
set lines 132 pages 10000
COLUMN SRDCSPOOLNAME NOPRINT NEW_VALUE SRDCSPOOLNAME
select 'SRDC_'||upper('&&SRDCNAME')||'_'||upper(instance_name)||'_'||to_char(sysdate,'YYYYMMDD_HH24MISS') SRDCSPOOLNAME from v$instance;
set TERMOUT on MARKUP html preformat on
REM
spool &&SRDCSPOOLNAME..htm
select '+----------------------------------------------------+' from dual
union all
select '| Diagnostic-Name: '||'&&SRDCNAME' from dual
union all
select '| Timestamp: '||to_char(systimestamp,'YYYY-MM-DD HH24:MI:SS TZH:TZM') from dual
union all
select '| Machine: '||host_name from v$instance
union all
select '| Version: '||version from v$instance
union all
select '| DBName: '||name from v$database
union all
select '| Instance: '||instance_name from v$instance
union all
select '+----------------------------------------------------+' from dual
/
set HEADING on MARKUP html preformat off
REM === -- end of standard header -- ===
set concat "#"
SET PAGESIZE 9999
SET LINESIZE 256
SET TRIMOUT ON
SET TRIMSPOOL ON
Column sid format 99999 heading "SESS|ID"
Column serial# format 9999999 heading "SESS|SER|#"
Column session_id format 99999 heading "SESS|ID"
Column session_serial# format 9999999 heading "SESS|SER|#"
Column event format a50
Column job_name format a35
Column total_waits format 9,999,999,999 heading "TOTAL|TIME|WAITED|MICRO"
Column pga_used_mem format 9,999,999,999
Column pga_alloc_mem format 9,999,999,999
Column status heading 'Status' format a16
Column timeout heading 'Timeout' format 999999
Column error_number heading 'Error Number' format 999999
Column error_msg heading 'Message' format a44
Column sql_text heading 'Current SQL statement' format a50
Column Number_of_objects format 99999999
Column object_type format a35
ALTER SESSION SET nls_date_format='DD-MON-YYYY HH24:MI:SS';
SET MARKUP HTML ON PREFORMAT ON
--====================Retrieve sid, serial# information for the active export process(es)===========================
SET HEADING OFF
SELECT '==================================Determine sid, serial# details for the active DataPump export process(es):=====================================' FROM dual;
SET HEADING ON
set feedback on
col program for a38
col username for a10
col spid for a7
select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS') "DATE", s.program, s.sid,
s.status, s.username, d.job_name, p.spid, s.serial#, p.pid
from v$session s, v$process p, dba_datapump_sessions d
where p.addr=s.paddr and s.saddr=d.saddr and
(UPPER (s.program) LIKE '%DM0%' or UPPER (s.program) LIKE '%DW0%');
SET HEADING OFF
set feedback off
SELECT '=================================================================================================================================================' FROM dual;
--====================Retrieve sid, serial#, PGA details for the active export process(es)===========================
SET HEADING OFF
SELECT '==================================Determine sid, serial#, PGA details for the active export process(es):=========================================' FROM dual;
SET HEADING ON
set feedback on
SELECT sid, s.serial#, p.PGA_USED_MEM,p.PGA_ALLOC_MEM
FROM v$process p, v$session s
WHERE p.addr = s.paddr and
(UPPER (s.program) LIKE '%DM0%' or UPPER (s.program) LIKE '%DW0%');
SET HEADING OFF
set feedback off
SELECT '=================================================================================================================================================' FROM dual;
--====================Retrieve the number of objects per object_type===========================
SET HEADING OFF
SELECT '==================================Determine the number of objects per object_type:===============================================================' FROM dual;
SET HEADING ON
SELECT count(*) Number_of_objects, object_type
FROM dba_objects
GROUP BY object_type
ORDER BY Number_of_objects desc;
SET HEADING OFF
SELECT '=================================================================================================================================================' FROM dual;
--====================Retrive all wait events and time in wait for the running export process(es)====================
SET HEADING OFF
SELECT '==================================Retrive all wait events and time in wait for the running export process(es):===================================' FROM dual;
SET HEADING ON
set feedback on
select session_id, session_serial#, Event, sum(time_waited) total_waits
from v$active_session_history
where sample_time > sysdate - 1 and
(UPPER (program) LIKE '%DM0%' or UPPER (program) LIKE '%DW0%') and
session_id in (select sid from v$session where UPPER (program) LIKE '%DM0%' or UPPER (program) LIKE '%DW0%') and
session_state = 'WAITING' And time_waited > 0
group by session_id, session_serial#, Event
order by session_id, session_serial#, total_waits desc;
SET HEADING OFF
set feedback off
SELECT '=================================================================================================================================================' FROM dual;
--====================Export progress - retrieve current sql id and statement====================
SET HEADING OFF
SELECT '==================================Export progress - retrieve current sql id and statement:=======================================================' FROM dual;
SET HEADING ON
set feedback on
select distinct sysdate, a.sid, a.sql_id, a.event, b.sql_text
from v$session a, v$sql b
where a.sql_id=b.sql_id and
(UPPER (a.program) LIKE '%DM0%' or UPPER (a.program) LIKE '%DW0%')
order by a.sid desc;
SET HEADING OFF
set feedback off
SELECT '=================================================================================================================================================' FROM dual;
SET HEADING OFF MARKUP HTML OFF
SET SERVEROUTPUT ON FORMAT WRAP
declare
table_view_not_exists EXCEPTION;
PRAGMA EXCEPTION_INIT(table_view_not_exists, -00942);
v_ksppinm varchar2(30);
CURSOR c_fix IS select v.KSPPSTVL value FROM x$ksppi n, x$ksppsv v WHERE n.indx = v.indx and n.ksppinm = v_ksppinm;
CURSOR c_count is select count(*) from DBA_OPTSTAT_OPERATIONS where operation in ('gather_dictionary_stats','gather_fixed_objects_stats')
or (operation in ('gather_schema_stats') and target in ('SYS','SYSTEM'));
CURSOR c_stats is select operation,target, START_TIME, END_TIME from DBA_OPTSTAT_OPERATIONS
where operation in ('gather_dictionary_stats','gather_fixed_objects_stats') or (operation in ('gather_schema_stats') and target in ('SYS','SYSTEM')) order by 3 desc;
CURSOR c_sql_patches_count is select count(*) FROM DBA_REGISTRY_SQLPATCH;
CURSOR c_sql_patches IS SELECT PATCH_ID,PATCH_UID,ACTION,STATUS,DESCRIPTION,ACTION_TIME FROM DBA_REGISTRY_SQLPATCH order by ACTION_TIME desc;
v_long_op_flag number := 0 ;
v_target varchar2(100);
v_sid number;
v_totalwork number;
v_opname varchar2(200);
v_sofar number;
v_time_remain number;
stmt varchar2(2000);
v_fix c_fix%ROWTYPE;
v_count number;
v_sql_patches c_sql_patches%ROWTYPE;
v_sql_patches_count NUMBER;
v_is_AI number :=0;
TYPE sessionwait_info_record IS RECORD
(
WAITING_SESSION NUMBER,
EVENT VARCHAR2(64),
DP_WAITTIME NUMBER,
DP_SECONDS_IN_WAIT NUMBER,
DP_STATE_IN_WAIT VARCHAR2(19),
DP_P1TEXT VARCHAR2(64),
DP_P1 NUMBER,
DP_P2TEXT VARCHAR2(64),
DP_P2 NUMBER,
DP_P3TEXT VARCHAR2(64),
DP_P3 NUMBER,
CON_ID NUMBER
);
TYPE process_info_record IS RECORD
(
CUR_DATE VARCHAR2(19),
PROGRAM VARCHAR2(84),
SESSIONID NUMBER,
STATUS VARCHAR2(8),
USERNAME VARCHAR2(128),
JOBNAME VARCHAR2(128),
SPID VARCHAR2(24),
PROCESSID NUMBER,
CON_ID NUMBER
);
type sessionwait_info_table is table of sessionwait_info_record;
SESSION_COLLECTOR sessionwait_info_table;
type process_table is table of process_info_record;
PROCESS_COLLECTOR process_table;
begin
stmt:='select count(*) from v$session_longops where sid in (select sid from v$session where UPPER (program) LIKE '||
'''%DM0%'''||' or UPPER (program) LIKE '||'''%DW0%'')'||' and totalwork <> sofar';
DBMS_OUTPUT.PUT_LINE('<pre>');
dbms_output.put_line('==================================Check v$session_longops - Export pending work:=================================================================');
dbms_output.put_line(chr(10));
execute immediate stmt into v_long_op_flag;
if (v_long_op_flag > 0) then
dbms_output.put_line ('The number of long running export processes is: '|| v_long_op_flag);
dbms_output.put_line (chr (10));
for longop in (select sid,target,opname, sum(totalwork) totwork, sum(sofar) sofar, sum(totalwork-sofar) blk_remain, Round(sum(time_remaining/60),2) time_remain
from v$session_longops where sid in (select sid from v$session where UPPER (program) LIKE '%DM0%' or UPPER (program) LIKE '%DW0%') and
opname NOT LIKE '%aggregate%' and totalwork <> sofar group by sid,target,opname) loop
dbms_output.put_line (Rpad ('Export SID', 40, ' ')||chr (9)||':'||chr (9)||longop.sid);
dbms_output.put_line (Rpad ('Object being read', 40, ' ')||chr (9)||':'||chr (9)||longop.target);
dbms_output.put_line (Rpad ('Operation being executed', 40, ' ')||chr (9)||':'||chr (9)||longop.opname);
dbms_output.put_line (Rpad ('Total blocks to be read', 40, ' ')||chr (9)||':'||chr (9)||longop.totwork);
dbms_output.put_line (Rpad ('Total blocks already read', 40, ' ')||chr (9)||':'||chr (9)||longop.sofar);
dbms_output.put_line (Rpad ('Remaining blocks to be read', 40, ' ')||chr (9)||':'||chr (9)||longop.blk_remain);
dbms_output.put_line (Rpad ('Estimated time remaining for the process', 40, ' ')||chr (9)||':'||chr (9)||longop.time_remain|| ' Minutes');
dbms_output.put_line ('=================================================================================================================================================');
dbms_output.put_line (chr (10));
end Loop;
else
DBMS_OUTPUT.PUT_LINE ('No export session is found in v$session_longops');
dbms_output.put_line ('=================================================================================================================================================');
dbms_output.put_line (chr (10));
end If;
DBMS_OUTPUT.PUT_LINE ('===========================Have Dictionary,Fixed Objects or Schema statistics for SYS and SYSTEM users been gathered?============================');
dbms_output.put_line (chr (10));
open c_count;
fetch c_count into v_count;
if v_count>0 then
BEGIN
DBMS_OUTPUT.PUT_LINE (rpad ('OPERATION', 30)||' '||rpad ('TARGET', 8)||' '||rpad ('START_TIME', 32)||' '||rpad ('END_TIME', 32));
DBMS_OUTPUT.PUT_LINE (rpad ('--------------------------', 30)||' '||rpad ('---------', 8)||' '||rpad ('-----------------------------', 32)||' '||rpad ('-----------------------------', 32));
FOR v_stats IN c_stats LOOP
DBMS_OUTPUT.PUT_LINE (rpad (v_stats.operation, 30)||' '||rpad (nvl(v_stats.target,' '), 8)||' '||rpad (v_stats.start_time, 32)||' '||rpad (v_stats.end_time, 32));
END LOOP;
end;
else
DBMS_OUTPUT.PUT_LINE ('Dictionary,fixed objects or Schema statistics for SYS and SYSTEM users have not been gathered in this database.');
END IF;
dbms_output.put_line ('=================================================================================================================================================');
dbms_output.put_line (chr (10));
for i in 1..6 loop
if i = 1 then
v_ksppinm := 'fixed_date';
elsif i = 2 then
v_ksppinm := 'aq_tm_processes';
elsif i = 3 then
v_ksppinm := 'compatible';
elsif i = 4 then
v_ksppinm := 'optimizer_features_enable';
elsif i = 5 then
v_ksppinm := 'optimizer_index_caching';
elsif i = 6 then
v_ksppinm := 'optimizer_index_cost_adj';
end if;
dbms_output.put_line('==================================Is the '||upper (v_ksppinm)||' parameter set?');
dbms_output.put_line(chr(10));
open c_fix;
fetch c_fix into v_fix;
close c_fix;
if nvl (to_char (v_fix.value), '1') = to_char ('1') then
DBMS_OUTPUT.PUT_LINE ('No value is found for '||upper (v_ksppinm)||' parameter.');
else
DBMS_OUTPUT.PUT_LINE ('The '||upper (v_ksppinm)||' parameter is set for this database and the value is: '||v_fix.value);
end if;
dbms_output.put_line('=================================================================================================================================================');
dbms_output.put_line(chr (10));
end loop;
DBMS_OUTPUT.PUT_LINE ('=================================================================SQL database patches============================================================');
open c_sql_patches_count;
fetch c_sql_patches_count into v_sql_patches_count;
if v_sql_patches_count>0 then
BEGIN
DBMS_OUTPUT.PUT_LINE (rpad ('PATCH_ID', 10)||' '||rpad ('PATCH_UID', 10)||' '||rpad ('ACTION', 14)||' '||rpad ('STATUS', 15)||' '||rpad ('DESCRIPTION', 62)||' '||rpad ('ACTION_TIME', 29));
DBMS_OUTPUT.PUT_LINE (rpad ('----------', 10)||' '||rpad ('----------', 10)||' '||rpad ('---------------', 14)||' '||rpad ('----------------', 15)||' '||rpad ('-----------------------------------------------------------------', 62)||' '||rpad ('-------------------------------', 29));
FOR v_sql_patches IN c_sql_patches LOOP
DBMS_OUTPUT.PUT_LINE (rpad (v_sql_patches.PATCH_ID, 10)||' '||rpad (v_sql_patches.PATCH_UID, 10)||' '||rpad (v_sql_patches.ACTION, 14)||' '||rpad (v_sql_patches.STATUS, 15)||' '||rpad (v_sql_patches.DESCRIPTION, 62)||' '||rpad (v_sql_patches.ACTION_TIME, 29));
END LOOP;
end;
else
dbms_output.put_line (chr (10));
DBMS_OUTPUT.PUT_LINE ('There are no SQL patches installed in this database');
END IF;
DBMS_OUTPUT.PUT_LINE ('=================================================================================================================================================');
dbms_output.put_line(chr (10));
stmt:='select count(*) from v$version where banner like ''%23ai%''';
execute immediate stmt into v_is_AI;
if (v_is_AI > 0) then
dbms_output.put_line('====================================Check v$datapump_sessionwait_info - Export waits for each session attached===================================');
dbms_output.put_line (chr (10));
v_count:=0;
DBMS_OUTPUT.PUT_LINE (rpad ('SESS|ID', 7)||' '||rpad ('EVENT', 23)||' '||rpad ('DP_WAITTIME', 12)||' '||rpad ('DP_SECONDS_IN_WAIT', 19)||' '||rpad ('DP_STATE_IN_WAIT', 17)||' '||rpad ('DP_P1TEXT', 12)||' '||rpad ('DP_P1', 12)||' '||rpad ('DP_P2TEXT', 12)||' '||rpad ('DP_P2', 12)||' '||rpad ('DP_P3TEXT', 18)||' '||rpad ('DP_P3', 12)||' '||rpad ('CON_ID', 6));
DBMS_OUTPUT.PUT_LINE (rpad ('--------', 7)||' '||rpad ('-----------------------', 23)||' '||rpad ('---------------', 12)||' '||rpad ('-------------------', 19)||' '||rpad ('-----------------', 17)||' '||rpad ('-------------', 12)||' '||rpad ('-------------', 12)||' '||rpad ('-------------', 12)||' '||rpad ('-------------', 12)||' '||rpad ('-----------------------', 18)||' '||rpad ('-------------', 12)||' '||rpad ('-------', 6));
END if;
EXECUTE IMMEDIATE 'select WAITING_SESSION,EVENT,DP_WAITTIME,DP_SECONDS_IN_WAIT,DP_STATE_IN_WAIT,DP_P1TEXT,DP_P1,DP_P2TEXT,DP_P2,DP_P3TEXT,DP_P3,CON_ID from V$DATAPUMP_SESSIONWAIT_INFO' BULK COLLECT INTO SESSION_COLLECTOR;
for indx in 1..SESSION_COLLECTOR.count loop
dbms_output.put_line (chr (10));
dbms_output.put_line(rpad(SESSION_COLLECTOR(indx).WAITING_SESSION,7) || ' ' || rpad(SESSION_COLLECTOR(indx).EVENT,23) || ' ' || rpad(SESSION_COLLECTOR(indx).DP_WAITTIME,12) || ' ' || rpad(SESSION_COLLECTOR(indx).DP_SECONDS_IN_WAIT,19) || ' ' || rpad(SESSION_COLLECTOR(indx).DP_STATE_IN_WAIT,17) || ' ' || rpad(SESSION_COLLECTOR(indx).DP_P1TEXT,12) || ' ' || rpad(SESSION_COLLECTOR(indx).DP_P1,12) || ' ' || rpad(SESSION_COLLECTOR(indx).DP_P2TEXT,12) || ' ' || rpad(SESSION_COLLECTOR(indx).DP_P2,12) || ' ' || rpad(SESSION_COLLECTOR(indx).DP_P3TEXT,18) || ' ' || rpad(SESSION_COLLECTOR(indx).DP_P3,12) || ' ' || rpad(SESSION_COLLECTOR(indx).CON_ID,6));
v_count:=1;
end loop;
if (v_count=0) then
dbms_output.put_line('No sessions attached found');
dbms_output.put_line (chr (10));
END if;
dbms_output.put_line ('=================================================================================================================================================');
dbms_output.put_line (chr (10));
dbms_output.put_line('=======================================Check v$datapump_process_info - Display information for each process======================================');
dbms_output.put_line (chr (10));
v_count:=0;
DBMS_OUTPUT.PUT_LINE (rpad ('CUR_DATE', 20)||' '||rpad ('PROGRAM', 40)||' '||rpad ('SESSIONID', 9)||' '||rpad ('STATUS', 8)||' '||rpad ('USERNAME', 9)||' '||rpad ('JOBNAME', 25)||' '||rpad ('SPID', 9)||' '||rpad ('PROCESSID', 9)||' '||rpad ('CON_ID', 6));
DBMS_OUTPUT.PUT_LINE (rpad ('-------------------', 20)||' '||rpad ('----------------------------------------', 40)||' '||rpad ('----------', 9)||' '||rpad ('---------', 8)||' '||rpad ('----------', 9)||' '||rpad ('-------------------------', 25)||' '||rpad ('----------', 9)||' '||rpad ('----------', 9)||' '||rpad ('-------', 6));
EXECUTE IMMEDIATE 'select CUR_DATE,PROGRAM,SESSIONID,STATUS,USERNAME,JOBNAME,SPID,PROCESSID,CON_ID from V$DATAPUMP_PROCESS_INFO' BULK COLLECT INTO PROCESS_COLLECTOR;
for indx in 1..PROCESS_COLLECTOR.count loop
dbms_output.put_line (chr (10));
dbms_output.put_line(rpad (PROCESS_COLLECTOR(indx).CUR_DATE,20) || ' ' || rpad (PROCESS_COLLECTOR(indx).PROGRAM,40) || ' ' || rpad (PROCESS_COLLECTOR(indx).SESSIONID,9) || ' ' || rpad (PROCESS_COLLECTOR(indx).STATUS,8) || ' ' || rpad (PROCESS_COLLECTOR(indx).USERNAME,9) || ' ' || rpad (PROCESS_COLLECTOR(indx).JOBNAME,25) || ' ' || rpad (PROCESS_COLLECTOR(indx).SPID,9) || ' ' || rpad (PROCESS_COLLECTOR(indx).PROCESSID,9) || ' ' || rpad (PROCESS_COLLECTOR(indx).CON_ID,6));
v_count:=1;
end loop;
if (v_count=0) then
dbms_output.put_line('No proceses related to Datapump found');
dbms_output.put_line (chr (10));
END if;
dbms_output.put_line ('=================================================================================================================================================');
dbms_output.put_line (chr (10));
EXCEPTION
WHEN table_view_not_exists THEN
null;
end;
/
set feedback off
begin
DBMS_OUTPUT.PUT_LINE ('====================================Current instance parameter values relevant for DataPump Export(EXPDP) issues=================================');
end;
/
set feedback on
SET HEADING ON
set linesize 150
set pagesize 120
COL name FORMAT A40
COL value FORMAT A30
SELECT n.ksppinm name, v.KSPPSTVL value FROM x$ksppi n, x$ksppsv v
WHERE n.indx = v.indx AND n.ksppinm IN ('aq_tm_processes','__streams_pool_size','streams_pool_size','sga_target','memory_target','memory_size')
ORDER BY 1;
set feedback off
SET HEADING OFF
SET LINESIZE 256
begin
dbms_output.put_line ('=================================================================================================================================================');
DBMS_OUTPUT.PUT_LINE('</pre>');
end;
/
spool off
PROMPT
PROMPT
PROMPT REPORT GENERATED : &SRDCSPOOLNAME..htm
exit
Comments
Post a Comment