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

mosdoc發表於2016-12-02

適用於:

Oracle Database - Enterprise Edition - 版本 10.1.0.2 到 12.1.0.1 [發行版 10.1 到 12.1]
本文件所含資訊適用於所有平臺

目標

如何清除 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;

 

注意:
如果表名是大小寫混合的,刪除時可能會遇到如下錯誤:
SQL> drop table SYSTEM.impdp_schema_STGMDM_10202014_0;
drop table SYSTEM.impdp_schema_STGMDM_10202014_0
                *
ERROR at line 1:
ORA-00942: table or view does not exist
  

因為表名是大小寫混合,所以刪除時要用雙引號括起來,例如:
drop table SYSTEM."impdp_SCHEMA_STGMDM_04102015_1";
drop table SYSTEM."impdp_schema_STGMDM_10202014_0";
  

 

第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 檢查作業是否已經被清除掉:

CONNECT scott/tiger

SELECT * FROM user_datapump_jobs;

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

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, rtrim(operation) "OPERATION"rtrim(job_mode) "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
SYSTEM     SYS_EXPORT_FULL_01  EXPORT    FULL      NOT RUNNING        0

-- 查詢資料泵的 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        85162 TABLE        SYSTEM.SYS_EXPORT_FULL_01


摘要:
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
 表的操作不會造成任何不一致。

5. 除了 'NOT RUNNING'狀態以外,失敗的JOB還可能處於'DEFINING'狀態,嘗試attach到這種job上會報以下的錯誤:

 

$ expdp system/manager attach=system.sys_export_schema_01

Export: Release 11.2.0.4.0 - Production on Tue Jan 27 10:14:27 2015
Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
ORA-31626: job does not exist
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 79
ORA-06512: at "SYS.KUPV$FT", line 405
ORA-31638: cannot attach to job SYS_EXPORT_SCHEMA_01 for user SYSTEM
ORA-31632: master table "SYSTEM.SYS_EXPORT_SCHEMA_01" not found, invalid, or inaccessible
ORA-00942: table or view does not exist

清理這種JOB的方法和上面提到的是一樣的。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31393455/viewspace-2129529/,如需轉載,請註明出處,否則將追究法律責任。

相關文章