問題現象
Expdp導出sys_yz schema時報錯如下,並且無法導出
ORA-31634: job already exists
ORA-31664: unable to construct unique jobname when defaulted
問題原因
使用sys用戶檢查視圖DBA_DATAPUMP_JOBS,這個視圖中保存的是expdp的一些出錯信息,
是基於 gv$datapump_job, obj$, com$, and user$ 的一個視圖。 這個視圖顯示仍在運行的數據泵作業,或者作業的 master 表仍然保留在數據庫中,或者不正常結束的作業(異常作業)。如果一個新的數據泵作業啓動, 會創建一條新的記錄,與舊的數據泵作業無關
正常情況下,這個視圖中not running狀態的內容應該爲空,但本次檢查出現了127條數據
當用系統自動生成的作業名啓動一個新的數據泵作業時,我們會檢查 dba_datapump_job 中現有的名稱以保持惟一性。當然,啓動這個作業的用戶下需要有足夠的空間來創建一個新的 master 表
數據泵作業與用 DBMS_JOBS 包定義的作業不同, DBMS_JOBS 創建的作業使用它自己的進程。 數據泵作業使用一個 master 進程和一些 worker 進程。如果一個數據泵作業被暫停,數據泵作業會一直存在在數據庫中(status: NOT RUNNING),這時,master 和 worker 進程會被停止,或者不再存在。客戶端之後可以再次掛載到這個作業,並且繼續作業的執行(START_JOB)
如果活動的數據泵作業相關聯的 master 表被刪除,可能會導致不一致刪除 master 表本身不會引起任何數據字典的不一致。如果您在作業完成後還保留 master 表(使用非公開的參數:KEEP_MASTER=Y),以後再刪除 master 表的操作不會造成任何不一致
select * from DBA_DATAPUMP_JOBS;
解決辦法
直接drop相關job_name表即可
使用可以使用expdp sys_yz/xx attch=’ job_name’將running狀態的kill掉
由於DBA_DATAPUMP_JOBS是一個視圖,不能直接delete,需要刪除相關內容,使用如下語句生成需要刪除的語句
select'drop table '||owner_name||'.'||job_name||' purge;'from DBA_DATAPUMP_JOBS WHERE state='NOT RUNNING';
使用sys用戶執行語句後再次檢查DBA_DATAPUMP_JOBS無數據,再次導出數據顯示正常。