資料泵無法匯入JOB

yangtingkun發表於2008-01-29

10g的資料泵在進行IMPDP的時候無法匯入JOB

 

 

透過一個例子來說明這個問題:

SQL> CREATE USER A IDENTIFIED BY A DEFAULT TABLESPACE YANGTK;

使用者已建立。

SQL> GRANT CONNECT, RESOURCE TO A;

授權成功。

SQL> CREATE OR REPLACE DIRECTORY D_OUTPUT AS 'E:\';

目錄已建立。

SQL> GRANT READ, WRITE ON DIRECTORY D_OUTPUT TO A;

授權成功。

SQL> CONN A/A@YTK102
已連線。
SQL> DECLARE
  2  V_JOB NUMBER;
  3  BEGIN
  4  DBMS_JOB.SUBMIT(V_JOB, 'NULL;', SYSDATE, 'SYSDATE + 1');
  5  COMMIT;
  6  END;
  7  /

PL/SQL 過程已成功完成。

SQL> COL WHAT FORMAT A30
SQL> SELECT JOB, WHAT FROM USER_JOBS;

       JOB WHAT
---------- ------------------------------
        66 NULL;

下面用A使用者執行資料泵的匯出:

E:\>expdp a/a@ytk102 directory=d_output dumpfile=a.dp

Export: Release 10.2.0.1.0 - Production on 星期二, 29 1, 2008 9:49:18

Copyright (c) 2003, 2005, Oracle.  All rights reserved.

連線到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
啟動
"A"."SYS_EXPORT_SCHEMA_01":  a/********@ytk102 directory=d_output dumpfile=
a.dp
正在使用 BLOCKS 方法進行估計
...
處理物件型別
SCHEMA_EXPORT/TABLE/TABLE_DATA
使用 BLOCKS 方法的總估計
: 0 KB
處理物件型別
SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
處理物件型別
SCHEMA_EXPORT/TABLE/TABLE
處理物件型別
SCHEMA_EXPORT/TABLE/INDEX/INDEX
處理物件型別
SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
處理物件型別
SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
處理物件型別
SCHEMA_EXPORT/TABLE/COMMENT
處理物件型別
SCHEMA_EXPORT/JOB
已成功載入/解除安裝了主表
"A"."SYS_EXPORT_SCHEMA_01"
******************************************************************************
A.SYS_EXPORT_SCHEMA_01
的轉儲檔案集為
:
  E:\A.DP
作業 "A"."SYS_EXPORT_SCHEMA_01" 已於 09:49:37 成功完成

下面刪除A使用者下的JOB

SQL> EXEC DBMS_JOB.REMOVE(66)

PL/SQL 過程已成功完成。

SQL> COMMIT;

提交完成。

嘗試透過資料泵IMPDP進行匯入:

E:\>impdp a/a@ytk102 directory=d_output dumpfile=a.dp

Import: Release 10.2.0.1.0 - Production on 星期二, 29 1, 2008 9:55:59

Copyright (c) 2003, 2005, Oracle.  All rights reserved.

連線到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
ORA-39154:
外部方案中的物件已從匯入中刪除

已成功載入/解除安裝了主表 "A"."SYS_IMPORT_FULL_01"
啟動
"A"."SYS_IMPORT_FULL_01":  a/********@ytk102 directory=d_output dumpfile=a.
dp
處理物件型別
SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
作業 "A"."SYS_IMPORT_FULL_01" 已於 09:56:01 成功完成

檢查JOB是否匯入:

SQL> SELECT JOB, WHAT FROM USER_JOBS;

未選定行

JOB沒有匯入,其實觀察上面匯入操作的輸出就可以看到問題。首先匯入報錯了,而錯誤資訊是“外部方案中的物件已從匯入中刪除”。而從匯入的物件型別中也看不到JOB的資訊,似乎JOB被當前其他SCHEMA的物件被遮蔽了。

E:\>impdp yangtk/yangtk@ytk102 directory=d_output dumpfile=a.dp remap_schema=a:a


Import: Release 10.2.0.1.0 - Production on
星期二, 29 1, 2008 10:25:52

Copyright (c) 2003, 2005, Oracle.  All rights reserved.

連線到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
已成功載入/解除安裝了主表
"YANGTK"."SYS_IMPORT_FULL_01"
啟動
"YANGTK"."SYS_IMPORT_FULL_01":  yangtk/********@ytk102 directory=d_output d
umpfile=a.dp remap_schema=a:a
處理物件型別
SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
處理物件型別
SCHEMA_EXPORT/JOB
作業 "YANGTK"."SYS_IMPORT_FULL_01" 已於 10:25:54 成功完成

如果使用DBA使用者執行匯入,採用REMAP_SCHEMA方式,發現匯入的時候處理了JOB,而且錯誤也消失了,那麼是否問題解決了呢:

SQL> SELECT JOB, WHAT FROM USER_JOBS;

未選定行

SQL> CONN YANGTK/YANGTK@YTK102
已連線。
SQL> SELECT JOB, LOG_USER, WHAT FROM DBA_JOBS;

       JOB LOG_USER               WHAT
---------- ---------------------- -----------------------------------
         1 SYSMAN                   EMD_MAINTENANCE.EXECUTE_EM_DBMS_JOB_PROCS();
        66 YANGTK                   NULL;

JOB雖然匯入了,但是沒有匯入A使用者,而是匯入了YANGTK使用者。這顯然不是預期的結果。說明Oracle在處理REMAP_SCHEMA的時候,根本沒有把JOB當作SCHEMA A的物件。

既然可以用YANGTK匯入,那麼使用A匯入的時候也是可以的,唯一的區別是A使用者沒有DBA許可權。

SQL> EXEC DBMS_JOB.REMOVE(66)

PL/SQL 過程已成功完成。

SQL> COMMIT;

提交完成。

SQL> GRANT IMP_FULL_DATABASE TO A;

授權成功。

IMP_FULL_DATABASE角色授權給A使用者,再次使用A使用者執行匯入:

E:\>impdp a/a@ytk102 directory=d_output dumpfile=a.dp

Import: Release 10.2.0.1.0 - Production on 星期二, 29 1, 2008 10:43:22

Copyright (c) 2003, 2005, Oracle.  All rights reserved.

連線到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
已成功載入/解除安裝了主表
"A"."SYS_IMPORT_FULL_01"
啟動
"A"."SYS_IMPORT_FULL_01":  a/********@ytk102 directory=d_output dumpfile=a.
dp
處理物件型別
SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
處理物件型別
SCHEMA_EXPORT/JOB
作業 "A"."SYS_IMPORT_FULL_01" 已於 10:43:24 成功完成

發現已經處理了JOB,檢查資料庫中JOB的情況:

SQL> SELECT JOB, LOG_USER, WHAT FROM DBA_JOBS;

       JOB LOG_USER                 WHAT
---------- ------------------------ --------------------------------------------
         1 SYSMAN                  EMD_MAINTENANCE.EXECUTE_EM_DBMS_JOB_PROCS();
        66 A                       NULL;

JOB已經成功匯入。不過這種方式需要給使用者授予一個遠遠超過自身需求的角色,存在比較大的安全問題,需要在匯入結束後回收許可權。而且對於多個使用者的匯出,採用這種方式將變得十分麻煩,必須對每個使用者分別處理。

還有一種方式,採用NETWORK_LINK的方式可以解決JOB的匯入問題:

SQL> CONN TEST/TEST@172.25.88.92/TESTZJ
已連線。
SQL> DECLARE
  2  V_JOB NUMBER;
  3  BEGIN
  4  DBMS_JOB.SUBMIT(V_JOB, 'NULL;', SYSDATE, 'SYSDATE + 1');
  5  COMMIT;
  6  END;
  7  /

PL/SQL 過程已成功完成。

SQL> CONN YANGTK/YANGTK@YTK102
已連線。
SQL> REVOKE IMP_FULL_DATABASE FROM A;

撤銷成功。

SQL> GRANT CREATE DATABASE LINK TO A;

授權成功。

SQL> CONN A/A@YTK102
已連線。
SQL> CREATE DATABASE LINK TESTZJ CONNECT TO TEST IDENTIFIED BY TEST USING '172.25.88.92/TESTZJ';

資料庫連結已建立。

SQL> SELECT * FROM GLOBAL_NAME@TESTZJ;

GLOBAL_NAME
-------------------------------------------
TESTZJ

在匯入的時候指定NETWORK_LINK引數:

E:\>impdp a/a@ytk102 directory=d_output remap_schema=test:a network_link=testzj
include=job

Import: Release 10.2.0.1.0 - Production on 星期二, 29 1, 2008 10:59:08

Copyright (c) 2003, 2005, Oracle.  All rights reserved.

連線到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
自動啟用 FLASHBACK 以保持資料庫完整性。

啟動 "A"."SYS_IMPORT_SCHEMA_01":  a/********@ytk102 directory=d_output remap_sch
ema=test:a network_link=testzj include=job
正在使用 BLOCKS 方法進行估計
...
處理物件型別
SCHEMA_EXPORT/TABLE/TABLE_DATA
使用 BLOCKS 方法的總估計
: 0 KB
處理物件型別
SCHEMA_EXPORT/JOB
作業 "A"."SYS_IMPORT_SCHEMA_01" 已於 10:59:12 成功完成

查詢使用者的JOB,發現JOB已經匯入:

SQL> SELECT JOB, WHAT FROM USER_JOBS;

       JOB WHAT
---------- ------------------------------
        66 NULL;
     42862 NULL;

不過這種方法有的時候並不適用。很多時候使用資料泵的原因就是網路無法連通,或者處於安全性的考慮也無法使用資料庫鏈。因此,這種方法雖然很方便,但是使用範圍比較有限。

查詢了metalinkmetalink上有不少篇文章和這個問題類似,Oracle並沒有給出什麼好的解決方案,而是推薦使用SCHEDULE來替代JOB,或者使用IMP/EXP來替換資料泵。這顯然是一種迴避的方法。OracleBug No. 5856954中進行了描述。Oracle並沒有給出具體FIX這個bug的版本。在10204計劃修訂bug列表中也沒有找到fix這個問題的計劃。

 

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

相關文章