資料泵無法匯入JOB
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;
不過這種方法有的時候並不適用。很多時候使用資料泵的原因就是網路無法連通,或者處於安全性的考慮也無法使用資料庫鏈。因此,這種方法雖然很方便,但是使用範圍比較有限。
查詢了metalink,metalink上有不少篇文章和這個問題類似,Oracle並沒有給出什麼好的解決方案,而是推薦使用SCHEDULE來替代JOB,或者使用IMP/EXP來替換資料泵。這顯然是一種迴避的方法。Oracle在Bug No. 5856954中進行了描述。Oracle並沒有給出具體FIX這個bug的版本。在10204計劃修訂bug列表中也沒有找到fix這個問題的計劃。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-163544/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【匯入匯出】資料泵 job_name引數的使用
- oracle10g expdp資料泵的bug,按schema匯出,匯入impdp時無jobOracle
- 資料泵匯出匯入
- Impdp資料泵匯入
- 資料泵的匯入匯出
- 資料泵匯出匯入表
- Oracle資料泵-schema匯入匯出Oracle
- 使用資料泵impdp匯入資料
- 資料泵匯出匯入資料標準文件
- Oracle資料泵的匯入和匯出Oracle
- Oracle資料泵匯出匯入(expdp/impdp)Oracle
- Oracle使用資料泵匯出匯入表Oracle
- 資料泵取匯出和匯入(一)
- 資料泵無法匯出sys使用者下的表
- 資料庫泵(expdp/impdp)匯入匯出流程資料庫
- 資料泵IMPDP 匯入工具的使用
- 12c 資料泵匯入匯出級別
- Oracle使用資料泵expdp,impdp進行資料匯出匯入Oracle
- 限定filesize的資料泵匯入匯出操作案例
- 對比資料泵與原始匯入匯出工具(五)
- 對比資料泵與原始匯入匯出工具(四)
- 對比資料泵與原始匯入匯出工具(三)
- 對比資料泵與原始匯入匯出工具(八)
- 對比資料泵與原始匯入匯出工具(七)
- 對比資料泵與原始匯入匯出工具(六)
- 資料泵匯出匯入物化檢視(ORA-39083)
- oracle10G新特性之資料泵匯出/匯入Oracle
- 用資料泵併發匯入資料的一個案例
- 資料泵匯入-在物件已存在的情況下執行匯入物件
- oracle監控資料泵匯入和匯出的sql語句OracleSQL
- 12c pdb的資料泵匯入匯出簡單示例
- Oracle使用資料泵在異機之間匯出匯入表Oracle
- 10g資料泵和匯入匯出效能對比(三)
- 10g資料泵和匯入匯出效能對比(二)
- 10g資料泵和匯入匯出效能對比(一)
- 10g資料泵和匯入匯出效能對比(四)
- 10g資料泵和匯入匯出效能對比(六)
- 10g資料泵和匯入匯出效能對比(五)