1. 程式人生 > >【DB筆試面試164】在Oracle中,如何徹底停止expdp數據泵進程?

【DB筆試面試164】在Oracle中,如何徹底停止expdp數據泵進程?

expdp

真題1、如何徹底停止expdp進程?


答案:許多同事在使用expdp命令時,不小心按了CTRL+C組合鍵,然後又輸入exit命令(或者網絡中斷等異常情況),導致expdp進程不存在,但Oracle數據庫的會話仍存在,所以dmp文件也一直在增長。在這種情況下的處理辦法如下所示:

1、檢查expdp進程是否還在

ps -ef | grep expdp

若存在,則可用“kill -9 process”命令殺掉expdp的進程。

2、檢查會話是否仍存在,若存在則把相關的會話殺掉(註意:先使用命令“ALTER SYSTEM KILL SESSION SID,SERIAL# IMMEDIATE;”在數據庫級別殺掉會話,然後在

OS級別使用kill -9殺掉進程),如無殺會話的權限則可以將相關的表DROP掉,表名可以使用如下的SQL來查詢:

SELECT * FROM DBA_DATAPUMP_SESSIONS;

SELECT * FROM DBA_DATAPUMP_JOBS;

例如:

SYS@orclasm > SELECT * FROM DBA_DATAPUMP_SESSIONS;

OWNER_NAME JOB_NAME INST_ID SADDR SESSION_TYPE

---------- ------------------------- ---------- ---------------- --------------

LHR SYS_EXPORT_SCHEMA_04 1 00000000A8B71D98 MASTER

LHR SYS_EXPORT_SCHEMA_04 1 00000000AB98AFC8 WORKER

SYS@orclasm > DROP TABLE LHR.SYS_EXPORT_SCHEMA_04 PURGE;

Table dropped.

SYS@orclasm > SELECT * FROM DBA_DATAPUMP_SESSIONS;

no rows selected

SYS@orclasm > SELECT * FROM DBA_DATAPUMP_JOBS;

no rows selected

使用相同的辦法也刪除從視圖DBA_DATAPUMP_JOBS中查詢出來的表,直到這兩個視圖無記錄。

3、刪除導出的dmp文件。如不刪除,則在重新執行expdp命令時會報dmp文件已存在的錯誤。

這裏作者給出自己常用的一個SQL語句,可以查詢expdp的相關會話的詳細信息,如下所示:

---------------------------如何徹底停止expdp進程?

SET LINE 9999

COL OWNER_NAME FOR A10

COL JOB_NAME FOR A25

COL OPERATION FOR A10

COL JOB_MODE FOR A10

COL STATE FOR A15

COL OSUSER FOR A10

COL "DEGREE|ATTACHED|DATAPUMP" FOR A25

COL SESSION_INFO FOR A20

SELECT DS.INST_ID,

DJ.OWNER_NAME,

DJ.JOB_NAME,

TRIM(DJ.OPERATION) OPERATION,

TRIM(DJ.JOB_MODE) JOB_MODE,

DJ.STATE,

DJ.DEGREE || ',' || DJ.ATTACHED_SESSIONS || ',' ||DJ.DATAPUMP_SESSIONS "DEGREE|ATTACHED|DATAPUMP",

DS.SESSION_TYPE,

S.OSUSER ,

(SELECT S.SID || ',' || S.SERIAL# || ',' || P.SPID

FROM GV$PROCESS P

WHERE S.PADDR = P.ADDR

AND S.INST_ID = P.INST_ID) SESSION_INFO

FROM DBA_DATAPUMP_JOBS DJ --GV$DATAPUMP_JOB

FULL OUTER JOIN DBA_DATAPUMP_SESSIONS DS --GV$DATAPUMP_SESSION

ON (DJ.JOB_NAME = DS.JOB_NAME AND DJ.OWNER_NAME = DS.OWNER_NAME)

LEFT OUTER JOIN GV$SESSION S

ON (S.SADDR = DS.SADDR AND DS.INST_ID = S.INST_ID)

ORDER BY DJ.OWNER_NAME, DJ.JOB_NAME;

select * from GV$DATAPUMP_SESSION;

select * from GV$datapump_jobs;

select * From dba_datapump_jobs;



【DB筆試面試164】在Oracle中,如何徹底停止expdp數據泵進程?