2026-03-12 20:23:15
This commit is contained in:
222
vg/datapump_status.sql
Normal file
222
vg/datapump_status.sql
Normal file
@@ -0,0 +1,222 @@
|
||||
@@header
|
||||
|
||||
/*
|
||||
*
|
||||
* Author : Vishal Gupta
|
||||
* Purpose : Display datapump job status
|
||||
* Parameter : 1 - Job owner name , this could also be passed as OWNER.JOB_NAME
|
||||
* 2 - Datapump Job Name
|
||||
*
|
||||
* Revision History:
|
||||
* ===================
|
||||
* Date Author Description
|
||||
* --------- ------------ ------------------------------------------------------------
|
||||
* 12-FEB-16 Vishal Gupta Added conditional display of days to duration field
|
||||
* 23-SEP-14 Vishal Gupta Added logic to auto-calculate max LPADING length for various outputs
|
||||
* 14-FEB-13 Vishal Gupta Added more details and some formating
|
||||
* 17-Dec-12 Vishal Gupta Modified to accept job owner and name separated by comma
|
||||
* 26-Mar-12 Vishal Gupta Created
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
set serveroutput on
|
||||
|
||||
VARIABLE owner VARCHAR2(30);
|
||||
VARIABLE job_name VARCHAR2(30);
|
||||
|
||||
set term off
|
||||
BEGIN
|
||||
:owner := upper('&&1');
|
||||
:job_name := upper('&&2');
|
||||
IF INSTR(:owner,'.') > 0 THEN
|
||||
:job_name := SUBSTR(:owner, INSTR(:owner,'.') + 1 ) ;
|
||||
:owner := SUBSTR(:owner, 1 , INSTR(:owner,'.') - 1 ) ;
|
||||
END IF;
|
||||
END;
|
||||
/
|
||||
set term on
|
||||
|
||||
DECLARE
|
||||
ind NUMBER; -- Loop index
|
||||
h1 NUMBER; -- Data Pump job handle
|
||||
percent_done NUMBER; -- Percentage of job complete
|
||||
job_state VARCHAR2(30); -- To keep track of job state
|
||||
sts ku$_Status; -- The status object returned by get_status
|
||||
wip ku$_LogEntry; -- WIP
|
||||
jd ku$_JobDesc; -- Job Description
|
||||
js ku$_JobStatus; -- The job status from get_status
|
||||
wsl ku$_WorkerStatusList; -- Worker status
|
||||
error ku$_LogEntry;
|
||||
|
||||
max_completed_objects_length NUMBER;
|
||||
max_completed_rows_length NUMBER;
|
||||
max_completed_bytes_length NUMBER;
|
||||
|
||||
col_pad_len NUMBER := 50;
|
||||
BEGIN
|
||||
h1 := DBMS_DATAPUMP.attach(job_name => :job_name
|
||||
, job_owner => CASE :owner WHEN '' THEN USER ELSE :owner END
|
||||
);
|
||||
|
||||
/* Fetch Datapump Job Status */
|
||||
dbms_datapump.get_status( handle => h1
|
||||
, mask => dbms_datapump.ku$_status_wip
|
||||
+ dbms_datapump.ku$_status_job_desc
|
||||
+ dbms_datapump.ku$_status_job_status
|
||||
+ dbms_datapump.ku$_status_job_error
|
||||
, timeout => 0
|
||||
, job_state => job_state
|
||||
, status => sts);
|
||||
|
||||
wip := sts.wip;
|
||||
jd := sts.job_description;
|
||||
js := sts.job_status;
|
||||
wsl := js.worker_status_list;
|
||||
error := sts.error;
|
||||
|
||||
|
||||
dbms_output.put_line(' ' );
|
||||
dbms_output.put_line('------------------------------------------' );
|
||||
dbms_output.put_line('Datapump Job Details' );
|
||||
dbms_output.put_line('------------------------------------------' );
|
||||
dbms_output.put_line(RPAD('Job Owner : ' || jd.owner,col_pad_len) || RPAD('Remote Link : ' || jd.remote_link,col_pad_len) );
|
||||
dbms_output.put_line(RPAD('Job Name : ' || jd.job_name,col_pad_len) || RPAD('Exp Start Time : ' || TO_CHAR(jd.exp_start_time,'DD-Mon-YY hh24:mi:ss'),col_pad_len) );
|
||||
dbms_output.put_line(RPAD('Operation : ' || jd.operation,col_pad_len) || RPAD('Exp Global Name : ' || jd.exp_global_name,col_pad_len) );
|
||||
dbms_output.put_line(RPAD('Job Mode : ' || jd.job_mode,col_pad_len) || RPAD('Exp Platform : ' || jd.exp_platform,col_pad_len) );
|
||||
dbms_output.put_line(RPAD('Max Degree : ' || jd.max_degree,col_pad_len) || RPAD('Exp DB Version : ' || jd.exp_db_version,col_pad_len) );
|
||||
dbms_output.put_line(RPAD('Instance : ' || jd.instance,col_pad_len) || RPAD('Creator Privs : ' || jd.creator_privs,col_pad_len) );
|
||||
dbms_output.put_line(RPAD('Global Name : ' || jd.global_name,col_pad_len) || RPAD('SCN : ' || jd.scn,col_pad_len) );
|
||||
dbms_output.put_line(RPAD('Platform : ' || jd.platform,col_pad_len) );
|
||||
dbms_output.put_line(RPAD('DB Version : ' || jd.db_version,col_pad_len) );
|
||||
dbms_output.put_line(RPAD('Job StartTime : ' || TO_CHAR(jd.start_time,'DD-Mon-YY hh24:mi:ss'),col_pad_len) );
|
||||
dbms_output.put_line(RPAD('Duration : ' || CASE WHEN FLOOR(sysdate - jd.start_time) > 0 THEN FLOOR(sysdate - jd.start_time) || 'd ' ELSE '' END
|
||||
|| FLOOR(MOD((sysdate - jd.start_time) , 1) * 24 ) || 'h '
|
||||
|| FLOOR(MOD((sysdate - jd.start_time) * 24 , 1) * 60 ) || 'm '
|
||||
|| FLOOR(MOD((sysdate - jd.start_time) * 24 * 60 , 1) * 60 ) || 's '
|
||||
,col_pad_len) );
|
||||
dbms_output.put_line(RPAD('Termin Reason : ' || jd.term_reason,col_pad_len) );
|
||||
dbms_output.put_line('Logfile : ' || jd.log_file );
|
||||
dbms_output.put_line('SQL File : ' || jd.sql_file );
|
||||
|
||||
ind := jd.params.first;
|
||||
while ind is not null
|
||||
loop
|
||||
dbms_output.put_line('Parameter ' || ind || ' :'
|
||||
|| ' Op - ' || jd.params(ind).param_op
|
||||
|| ', ' || RPAD(jd.params(ind).param_name,25)
|
||||
|| ' = ' || NVL(jd.params(ind).param_value_t ,jd.params(ind).param_value_n)
|
||||
);
|
||||
ind := jd.params.next(ind);
|
||||
end loop;
|
||||
|
||||
dbms_output.put_line('------------------------------------------' );
|
||||
dbms_output.put_line('Datapump Job Status' );
|
||||
dbms_output.put_line('------------------------------------------' );
|
||||
dbms_output.put_line(RPAD('State : ' || js.state,col_pad_len ) || RPAD('Total Bytes : ' || to_char(js.total_bytes,'999,999,999,999,999'),col_pad_len ) );
|
||||
dbms_output.put_line(RPAD('Degree : ' || js.degree,col_pad_len ) || RPAD('Bytes Processed : ' || to_char(js.bytes_processed,'999,999,999,999,999'),col_pad_len ) );
|
||||
dbms_output.put_line(RPAD('% Done : ' || js.percent_done || ' % <----- *****',col_pad_len ) || RPAD('Restart Count : ' || js.restart_count,col_pad_len ) );
|
||||
dbms_output.put_line(RPAD('Phase : ' || js.phase,col_pad_len ) || RPAD('Error Count : ' || js.error_count,col_pad_len ));
|
||||
|
||||
ind := js.files.first;
|
||||
dbms_output.put_line('DumpFiles : ' || SUBSTR(js.files(ind).file_name,1,CASE INSTR(js.files(ind).file_name,'/',-1)
|
||||
WHEN 0 THEN INSTR(js.files(ind).file_name,'\',-1) - 1
|
||||
ELSE INSTR(js.files(ind).file_name,'/',-1) -1
|
||||
END
|
||||
)
|
||||
);
|
||||
while ind is not null
|
||||
loop
|
||||
IF jd.operation = 'EXPORT' THEN
|
||||
dbms_output.put_line('. : '
|
||||
|| SUBSTR(js.files(ind).file_name,INSTR(js.files(ind).file_name,'/',-1)+1)
|
||||
|| ' ( Size - ' || LPAD(to_char(ROUND(js.files(ind).file_bytes_written/1024/1024),'999,999,999'),13) || ' MB )'
|
||||
);
|
||||
END IF;
|
||||
IF jd.operation = 'IMPORT' THEN
|
||||
-- Odd file number
|
||||
IF MOD(ind,3) = 1 THEN
|
||||
dbms_output.put('. : ' || SUBSTR(js.files(ind).file_name,INSTR(js.files(ind).file_name,'/',-1)+1) );
|
||||
END IF;
|
||||
IF MOD(ind,3) = 2 THEN
|
||||
dbms_output.put(', ' || SUBSTR(js.files(ind).file_name,INSTR(js.files(ind).file_name,'/',-1)+1) );
|
||||
END IF;
|
||||
IF MOD(ind,3) = 0 THEN
|
||||
dbms_output.put_line(', ' ||SUBSTR(js.files(ind).file_name,INSTR(js.files(ind).file_name,'/',-1)+1) );
|
||||
END IF;
|
||||
END IF;
|
||||
ind := js.files.next(ind);
|
||||
end loop;
|
||||
|
||||
dbms_output.put_line(' ');
|
||||
dbms_output.put_line('------------------------------------------' );
|
||||
dbms_output.put_line('Datapump Worker Status' );
|
||||
dbms_output.put_line('------------------------------------------' );
|
||||
|
||||
max_completed_objects_length := 1;
|
||||
max_completed_rows_length := 1;
|
||||
max_completed_bytes_length := 1;
|
||||
ind := wsl.first;
|
||||
while ind is not null
|
||||
loop
|
||||
IF LENGTH(wsl(ind).completed_objects) > max_completed_objects_length THEN
|
||||
max_completed_objects_length := LENGTH(wsl(ind).completed_objects);
|
||||
END IF;
|
||||
IF LENGTH(ROUND(wsl(ind).completed_rows/1000)) > max_completed_rows_length THEN
|
||||
max_completed_rows_length := LENGTH(ROUND(wsl(ind).completed_rows/1000));
|
||||
END IF;
|
||||
IF LENGTH(ROUND(wsl(ind).completed_bytes/1024/1024)) > max_completed_bytes_length THEN
|
||||
max_completed_bytes_length := LENGTH(ROUND(wsl(ind).completed_bytes/1024/1024));
|
||||
END IF;
|
||||
ind := wsl.next(ind);
|
||||
end loop;
|
||||
|
||||
ind := wsl.first;
|
||||
while ind is not null
|
||||
loop
|
||||
|
||||
/*
|
||||
percent_done := 0;
|
||||
BEGIN
|
||||
SELECT *
|
||||
into percent_done
|
||||
FROM (select ROUND(NVL(l.sofar / l.totalwork,0) *100, 2) pct_done
|
||||
from dba_datapump_sessions d
|
||||
LEFT OUTER JOIN gv$session s ON s.inst_id = d.inst_id AND s.saddr = d.saddr
|
||||
LEFT OUTER JOIN gv$process p ON s.inst_id = p.inst_id AND s.paddr = p.addr
|
||||
LEFT OUTER JOIN gv$session_longops l ON l.inst_id = s.inst_id AND l.sid = s.sid
|
||||
WHERE d.owner_name = jd.owner
|
||||
AND d.job_name = jd.job_name
|
||||
AND d.session_type = 'WORKER'
|
||||
AND s.program like '%' || TRIM(wsl(ind).process_name) || '%'
|
||||
ORDER BY l.start_Time desc)
|
||||
WHERE ROWNUM=1
|
||||
;
|
||||
EXCEPTION
|
||||
WHEN Others THEN
|
||||
NULL;
|
||||
END;
|
||||
*/
|
||||
dbms_output.put_line('Worker ' || LPAD(wsl(ind).worker_number,2) || ' :'
|
||||
|| ' ' || wsl(ind).process_name -- || '(Inst:' || wsl(ind).instance_id || ')'
|
||||
|| ' , ' || LPAD(wsl(ind).percent_done,2) || '% Done'
|
||||
--|| ' ,' || LPAD(percent_done,6) || '% Done'
|
||||
|| ' , Deg ' || wsl(ind).degree
|
||||
|| ' , ' || RPAD(wsl(ind).state,9)
|
||||
|| ' , Completed Objects ' || LPAD(wsl(ind).completed_objects,max_completed_objects_length) || '/' || TRIM(wsl(ind).total_objects)
|
||||
|| ' , ' || LPAD(TRIM(to_char(wsl(ind).completed_rows/1000,'999999999')) , max_completed_rows_length) || ' K rows'
|
||||
|| ' , Size ' || LPAD(TRIM(to_char(wsl(ind).completed_bytes/1024/1024,'99999999')), max_completed_bytes_length) || ' MB'
|
||||
|| ' , ' || wsl(ind).schema || '.' || wsl(ind).name
|
||||
|| CASE WHEN wsl(ind).partition IS NULL THEN '' ELSE '(' || wsl(ind).partition || ')' END
|
||||
|| ' , ' || wsl(ind).object_type
|
||||
);
|
||||
ind := wsl.next(ind);
|
||||
end loop;
|
||||
DBMS_DATAPUMP.detach(h1);
|
||||
end;
|
||||
/
|
||||
|
||||
UNDEFINE 1
|
||||
UNDEFINE 2
|
||||
|
||||
@@footer
|
||||
Reference in New Issue
Block a user