EXPDP導出報錯job already exists

問題現象

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無數據,再次導出數據顯示正常。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章