資料泵無法匯入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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle10g expdp資料泵的bug,按schema匯出,匯入impdp時無jobOracle
- 資料泵匯出匯入
- Oracle資料泵匯出匯入(expdp/impdp)Oracle
- Oracle資料泵的匯入和匯出Oracle
- Oracle使用資料泵expdp,impdp進行資料匯出匯入Oracle
- 資料泵匯出匯入物化檢視(ORA-39083)
- Oracle expdp資料泵遠端匯出Oracle
- Oracle用資料泵匯入資料包12899的錯誤碼解決方法Oracle
- FastDFS依賴無法匯入AST
- ORACLE 資料泵impdp匯入報錯之ORA-31693 ORA-04098Oracle
- vercel無法匯入github專案Github
- 【資料泵】EXPDP匯出表結構(真實案例)
- 細緻入微:如何使用資料泵匯出表的部分列資料
- 資料庫 MySQL 資料匯入匯出資料庫MySql
- python無法匯入包是什麼原因Python
- sqoop資料匯入匯出OOP
- Oracle 資料匯入匯出Oracle
- Oracle資料匯入匯出Oracle
- phpMyAdmin匯入/匯出資料PHP
- Excel資料快速匯入mysql的幾個辦法ExcelMySql
- 大文字資料,匯入匯出到資料庫資料庫
- MySQL入門--匯出和匯入資料MySql
- MATLAB匯入資料Matlab
- 資料匯入終章:如何將HBase的資料匯入HDFS?
- 程式無任何報錯但是無法寫入資料庫資料庫
- 使用資料泵匯入 ORA-39002,ORA-39070,ORA-29283,ORA-06512,ORA-29283
- 殺停資料泵
- Mongodb資料的匯出與匯入MongoDB
- oracle資料匯出匯入(exp/imp)Oracle
- 匯入和匯出AWR的資料
- EasyPoi, Excel資料的匯入匯出Excel
- Mysql 資料庫匯入與匯出MySql資料庫
- Excel 表匯入資料Excel
- MySQL資料的匯入MySql
- Oracle 資料匯入ExcelOracleExcel
- mysqlimport 資料匯入程式MySqlImport
- oracle12c還原資料庫遇到的問題-將一個11.2.0.1的資料泵匯出檔案匯入12.1.0.2版本報錯Oracle資料庫
- MYSQL資料庫匯入資料時出現亂碼的解決辦法MySql資料庫
- 運維中資料泵匯出常用的細節小功能兩例運維