Утилита DataPump
работает немного не так, как старинные exp/imp
. В отличие от них, она не просто открывает сессию, по которой выкачивает/заливает данные, но создаёт несколько серверных процессов (они называются DataPump jobs, но путать их с заданиями, запускаемыми с помошью пакета dbms_job
не стоит, тут другой механизм). Кстати, именно поэтому если убить процесс expdp/impdp командой kill -9
, то сессии DataPump всё равно останутся в базе и могут помешать повторному запуску утилиты.
Иногда бывает необходимо убедиться, что сессии не подвисли и процесс перекачки данных идёт нормально. Раньше можно было просто поискать в v$session
записи с полем program
, содержащим строку 'imp%'
или 'exp%'
соответственно, но теперь всё немного хитрее. Для мониторинга сессий DataPump есть представление dba_datapump_sessions
.
Вот так можно определить, на каком событии висят сессии DataPump и кто их блокирует:
SELECT v.sid, v.serial#, v.program, v.username, v.blocking_session, v.final_blocking_session, v.event, d.job_name, d.inst_id, d.session_type FROM v$session v, dba_datapump_sessions d WHERE v.saddr = d.saddr;
Если процесс экспорта/импорта идёт достаточно давно, то имеет смысл посмотреть v$session_longops
для приблизительной оценки времени (ненадёжный способ, т.к. в v$session_longops
попадает далеко не всё):
SELECT username, opname, target_desc, sofar, totalwork, message FROM v$session_longops WHERE sid IN ( SELECT v.sid FROM v$session v, dba_datapump_sessions d WHERE v.saddr = d.saddr );