天天看點

手動清除dba_datapum_jobs中異常的作業

今天群裡面有兄弟在問關于dba_datapump_jobs中的not running的作業的清除的方法及not running狀态的代表什麼意思。

not running狀态的作業有兩個意思

1,作業被暫停。

2,dw/dm程序crash,但是master table還存在

其實多數情況下是屬于2,關于怎麼清除相當作業,可以看下面的MOS檔案,已經寫得相當的好,并且還是中文的

如何清除 DBA_DATAPUMP_JOBS 視圖中的異常資料泵作業? (文檔 ID 1626201.1)

<a href="http://luoping.blog.51cto.com/attachment/201405/27/534596_140120735049CM.gif"></a>

文檔内容

<a href="https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=857713151783775&amp;id=1626201.1&amp;displayIndex=2&amp;_afrWindowMode=0&amp;_adf.ctrl-state=14rf56rpzz_127#GOAL">目标</a>

<a href="https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=857713151783775&amp;id=1626201.1&amp;displayIndex=2&amp;_afrWindowMode=0&amp;_adf.ctrl-state=14rf56rpzz_127#FIX">解決方案</a>

<a href="https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=857713151783775&amp;id=1626201.1&amp;displayIndex=2&amp;_afrWindowMode=0&amp;_adf.ctrl-state=14rf56rpzz_127#aref_section21">其他資源</a>

适用于:

Oracle Database - Enterprise Edition - 版本 10.1.0.2 到 11.2.0.3 [發行版 10.1 到 11.2]

本文檔所含資訊适用于所有平台

目标

如何清除 DBA_DATAPUMP_JOBS 視圖中的異常資料泵作業?

解決方案

用于這個例子中的作業:

- 導出作業 SCOTT.EXPDP_20051121 是一個正在運作的 schema 級别的導出作業

- 導出作業 SCOTT.SYS_EXPORT_TABLE_01 是一個表級别的異常導出作業

- 導出作業 SCOTT.SYS_EXPORT_TABLE_02 是一個表級别的停止導出作業

- 導出作業 SYSTEM.SYS_EXPORT_FULL_01 是一個被暫停的全庫導出作業

第1步. 用 SQL*PLUS 判斷在資料庫中有哪些資料泵作業

%sqlplus /nolog

CONNECT / as sysdba

SET lines 200

COL owner_name FORMAT a10;

COL job_name FORMAT a20

COL state FORMAT a12

COL operation LIKE state

COL job_mode LIKE state

-- 查找資料泵作業:

SELECT owner_name, job_name, operation, job_mode,

state, attached_sessions

FROM dba_datapump_jobs

WHERE job_name NOT LIKE 'BIN$%'

ORDER BY 1,2;

OWNER_NAME JOB_NAME            OPERATION JOB_MODE  STATE       ATTACHED

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

SCOTT      EXPDP_20051121      EXPORT    SCHEMA    EXECUTING          1

SCOTT      SYS_EXPORT_TABLE_01 EXPORT    TABLE     NOT RUNNING        0

SCOTT      SYS_EXPORT_TABLE_02 EXPORT    TABLE     NOT RUNNING        0

SYSTEM     SYS_EXPORT_FULL_01  EXPORT    FULL      NOT RUNNING        0

第2步. 確定在 dba_datapump_jobs 中列出的作業不是活動的資料泵作業: 狀态應該是'NOT RUNNING'。

第3步. 同作業屬主确認視圖 dba_datapump_jobs 中狀态為'NOT RUNNING' 的作業不是被暫停,而失敗的作業。(例如,SYSTEM 使用者的全庫導出作業不是一個失敗的作業,而是一個被故意暫停的作業)

第4步. 通過 SQL*Plus 找到相關的 master 表:

-- 查找資料泵的 master 表:

SELECT o.status, o.object_id, o.object_type,

       o.owner||'.'||object_name "OWNER.OBJECT"

  FROM dba_objects o, dba_datapump_jobs j

WHERE o.owner=j.owner_name AND o.object_name=j.job_name

   AND j.job_name NOT LIKE 'BIN$%' ORDER BY 4,2;

STATUS   OBJECT_ID OBJECT_TYPE  OWNER.OBJECT

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

VALID        85283 TABLE        SCOTT.EXPDP_20051121

VALID        85215 TABLE        SCOTT.SYS_EXPORT_TABLE_02

VALID        85162 TABLE        SYSTEM.SYS_EXPORT_FULL_01

第5步. 對于過去被終止的和根本不會再啟動的作業,删除它的 master 表,例如,

DROP TABLE scott.sys_export_table_02;

-- 對于啟用了 recycle bin 的系統,需要額外運作:

purge dba_recyclebin;

第6步. 重新運作第1步和第4步對 dba_datapump_jobs 和 dba_objects 的查詢。如果 dba_datapump_jobs 裡仍然有作業列出,并且這些作業根本沒有 master 表,我們就可以以作業屬主的身份清除它們。例如,

CONNECT scott/tiger

SET serveroutput on

SET lines 100

DECLARE

   h1 NUMBER;

BEGIN

   h1 := DBMS_DATAPUMP.ATTACH('SYS_EXPORT_TABLE_01','SCOTT');

   DBMS_DATAPUMP.STOP_JOB (h1);

END;

/

注意:調用 STOP_JOB 過程以後,可能會花一點時間去清除作業,我們可以查詢 user_datapump_jobs 檢查作業是否已經被清除掉:

SELECT * FROM user_datapump_jobs;

第7步. 确認作業已經被清除

SET lines 200 

COL owner_name FORMAT a10; 

COL job_name FORMAT a20 

COL state FORMAT a12 

COL operation LIKE state 

COL job_mode LIKE state 

SELECT owner_name, job_name, operation, job_mode, 

state, attached_sessions 

FROM dba_datapump_jobs 

WHERE job_name NOT LIKE 'BIN$%' 

ORDER BY 1,2; 

-- 查找資料泵的 master 表:

摘要:

1. 異常資料泵作業不會影響新的資料泵作業. dba_datapump_jobs 是基于 gv$datapump_job, obj$, com$, and user$ 的一個視圖。 這個視圖顯示仍在運作的資料泵作業,或者作業的 master 表仍然保留在資料庫中,或者不正常結束的作業(異常作業)。如果一個新的資料泵作業啟動, 會建立一條新的記錄,與舊的資料泵作業無關。

2. 當用系統自動生成的作業名啟動一個新的資料泵作業時,我們會檢查 dba_datapump_job 中現有的名稱以保持惟一性。當然,啟動這個作業的使用者下需要有足夠的空間來建立一個新的 master 表。

3. 資料泵作業與用 DBMS_JOBS 包定義的作業不同, DBMS_JOBS 建立的作業使用它自己的程序。 資料泵作業使用一個 master 程序和一些 worker 程序。如果一個資料泵作業被暫停,資料泵作業會一直存在在資料庫中(status: NOT RUNNING),這時,master 和 worker 程序會被停止,或者不再存在。用戶端之後可以再次挂載到這個作業,并且繼續作業的執行(START_JOB)。

4. 如果活動的資料泵作業相關聯的 master 表被删除,可能會導緻不一緻.

4.a. 如果是一個導出作業, 不太可能引起不一緻,因為删除 master 表隻會導緻資料泵的 mater 和 worker 程序中止。這種情況類似于用戶端發起的一個意外中止。

4.b. 如果這個作業是一個導入作業,那麼情況就有所不同。删除掉 master 表會導緻資料泵的 worker 和 mater 程序中斷。這有可能會引起不完整的導入。 例如,沒有導入表的所有資料,或表,索引,視圖等的導入不完整, 這種情況類似于意外中斷導入的用戶端。删除 master 表本身不會引起任何資料字典的不一緻。如果您在作業完成後還保留 master 表(使用非公開的參數:KEEP_MASTER=Y),以後再删除 master表的操作不會造成任何不一緻。

     本文轉自7343696 51CTO部落格,原文連結:http://blog.51cto.com/luoping/1418120,如需轉載請自行聯系原作者