2017-07-27 50 views
1

我有一個數據泵輸出腳本,我想運行。數據庫是Oracle 11g。爲了試用它,我一直在SQLDeveloper中執行它。該腳本如下所示:Oracle datapump導出錯誤「無效的參數值」

DECLARE 
    JOBHANDLE NUMBER; 
    STATUS  VARCHAR2(20); 
    LOGFILE  UTL_FILE.FILE_TYPE; 
    LINE  VARCHAR2(200); 
    ROW   NUMBER := 1; 

    TYPE OUTPUT_TYPE IS TABLE OF VARCHAR2(128) INDEX BY PLS_INTEGER; 
    OUTPUT  OUTPUT_TYPE; 
BEGIN 
    EXECUTE IMMEDIATE 'CREATE OR REPLACE DIRECTORY "TESTDIR11" AS ''/home/achim/temp/0003759/T0987654321/'' '; 

    JOBHANDLE := DBMS_DATAPUMP.OPEN(
     operation => 'EXPORT', 
     job_mode => 'TABLE', 
     job_name => 'TST TMF.ACHIMSTEST11'); 

    DBMS_DATAPUMP.ADD_FILE(
     HANDLE => JOBHANDLE, 
     filename => 'Q01DED3D.dmp', 
     directory => 'TESTDIR11', 
     filetype => DBMS_DATAPUMP.KU$_FILE_TYPE_DUMP_FILE 
     ,reusefile => 1 
     ); 

    DBMS_DATAPUMP.ADD_FILE(
     HANDLE => JOBHANDLE, 
     filename => 'Q01DED3D.log', 
     directory => 'TESTDIR11', 
     filetype => DBMS_DATAPUMP.KU$_FILE_TYPE_LOG_FILE 
     ,reusefile => 1 
     ); 

    BEGIN 
     DBMS_DATAPUMP.SET_PARAMETER(
       handle => JOBHANDLE, 
       name => 'INCLUDE_METADATA', 
       value => 0); 

     DBMS_DATAPUMP.METADATA_FILTER(
       HANDLE  => JOBHANDLE, 
       name  => 'NAME_LIST', 
       value  => '''ACHIMSTEST11''', 
       object_path => 'TABLE'); 

     DBMS_DATAPUMP.METADATA_FILTER(
       HANDLE => JOBHANDLE, 
       name => 'SCHEMA_LIST', 
       value => '''TMF'''); 

     DBMS_DATAPUMP.START_JOB(JOBHANDLE); 
     DBMS_DATAPUMP.WAIT_FOR_JOB(JOBHANDLE, STATUS); 
    EXCEPTION 
     WHEN OTHERS 
     THEN 
      status := 'ERROR'; 
    END; 

    DBMS_DATAPUMP.DETACH(JOBHANDLE); 

    LOGFILE := UTL_FILE.FOPEN('TESTDIR', 'Q01DED3D.log', 'R'); 
    Loop BEGIN 
     UTL_FILE.GET_LINE(LOGFILE, LINE); 
     OUTPUT(ROW) := LINE; 
     ROW := ROW + 1; 
    EXCEPTION 
     WHEN No_Data_Found 
     THEN 
      EXIT; 
     END; 
    END Loop; 

    EXECUTE IMMEDIATE 'DROP DIRECTORY "TESTDIR"'; 

END; 

問題是我得到一個我無法解釋的錯誤,我不知道如何跟蹤它。該錯誤消息是:

錯誤報告:

ORA-39001:無效的參數值

ORA-06512:在 「SYS.DBMS_SYS_ERROR」,線79

ORA-06512:在 「SYS.DBMS_DATAPUMP」,線3507

ORA-06512:在 「SYS.DBMS_DATAPUMP」,線3756

ORA-065 12:在第18行

  • 00000 - 「無效參數值」
  • *原因:用戶指定的API參數爲錯誤類型或

    值範圍。後續消息由

    提供

    DBMS_DATAPUMP.GET_STATUS將進一步描述錯誤。

    *操作:糾正不良參數並重試API。

    這裏的重要部分是「ORA-06512:在18行」。這指向第一個ADD_FILE語句。在瀏覽關於數據泵的Internet Oracle文檔之後,我對於應該錯在什麼地方感到不知所措。當作業甚至沒有定義時,我也無法弄清楚如何使用DBMS_DATAPUMP.GET_STATUS,更不用說運行了。

    我試着不使用reusefile參數,我試着與實際整數值它代表,這是1

    中的SQLDeveloper運行此留下一個條目漂浮在DBA_DATAPUMP_JOBS,其中ISN更換DBMS_DATAPUMP.KU$_FILE_TYPE_DUMP_FILE擺脫那麼簡單。工作狀態是「定義」。這可以防止我第二次運行腳本。搜索了大約一個小時後,我發現它可以用DROP TABLE "TMF"."TST TMF.ACHIMSTEST11" PURGE刪除,但爲什麼這個作品是一個謎。

    我想我應該指出,我沒有寫這個腳本,它是從Java程序中的FreeMarker模板生成的。在Java程序中,生成的腳本以OracleCallableStatement和適用於11g數據庫的方式運行。我在SQLDeveloper中擺弄它的唯一原因是試圖讓它適用於12c數據庫。不用說,該腳本在SQLDeveoper中也不適用於12c。我希望它能適用於11g。

    順便提一句,我用12c數據庫運行Java時得到的錯誤與上面顯示的一樣。

    如果任何人都可以看到任何實際上是錯誤的或甚至只是看起來可疑的東西,我會非常感激這個建議。

    回答

    1

    我也無法弄清楚如何在作業甚至沒有定義時使用DBMS_DATAPUMP.GET_STATUS,更不用說運行了。

    作業已定義,在您撥打add_file時有一個句柄。所以,你可以添加一個異常處理程序調用get_status並輸出結果(這樣做當然set serveroutput on後):

    ... 
    EXCEPTION 
        WHEN OTHERS THEN 
        DECLARE 
         job_state varchar2(4000); 
         status ku$_Status; 
        BEGIN 
         DBMS_DATAPUMP.GET_STATUS(
         handle => jobhandle, 
         mask  => dbms_datapump.KU$_STATUS_JOB_ERROR, 
         timeout => null, 
         job_state => job_state, 
         status => status); 
    
        FOR I IN 1..status.error.COUNT LOOP 
         DBMS_OUTPUT.PUT_LINE(status.error(I).errornumber || ': ' || status.error(I).logtext); 
        END LOOP; 
        END; 
    
        RAISE; 
    END; 
    /
    

    (是的,我知道when others不好,即使再提高,但是這是一個臨時的事情...)

    鑑於你已經證明而這示數的號召,我希望將展示一些東西像什麼:

    ORA-39001: invalid argument value 
    ORA-39000: bad dump file specification 
    ORA-31641: unable to create dump file "/home/achim/temp/0003759/T0987654321/Q01DED3D.dmp" 
    ORA-27040: file create error, unable to create file 
    Linux-x86_64 Error: 2: No such file or directory 
    Additional information: 1 
    ORA-27037: unable to obtain file status 
    Linux-x86_64 Error: 2: No such file or directory 
    Additional information: 3 
    

    推測時,這是運行的調用語句,它使用一個不同的路徑直接託利對象。或者根本不包括創建/刪除,這在運行時通常不會做。 12c版本沒有定義目錄,或者如果它在不同的服務器上,那麼正在使用的路徑在那裏是無效的。或者,也許是RAC,並且僅在一個節點上有效,這可能會導致錯誤間歇性。

    儘管如此,/home/achim部分看起來懷疑。 Oracle進程的所有者 - 通常爲oracle - 必須能夠在操作系統目錄中讀寫文件,除非您打開主目錄供全世界查看,否則oracle無法創建轉儲文件,你問它。

    如果是這種情況,請將目錄路徑更改爲指向某處,您確定oracle確實具有必要的權限;如果您有權訪問該帳戶,請嘗試從命令行手動創建一個文件進行驗證。如果不是你,你只需要仔細檢查操作系統目錄及其層次結構的權限。

    當然你可能會看到一個不同的錯誤,但它看起來像是與目錄或文件相關的東西,而不是其他參數。

    另外,要刪除孤立作業,請參閱My Oracle Support文檔336014.1。

    +0

    謝謝亞歷克斯,當我編寫我的腳本時,恐怕我有一些概念性的大腦褪色,這是從Java版本改編的。由於我正在使用SQLDeveloper,因此我認爲轉儲所在的目錄應位於我的計算機上。當它作爲CallableStatement運行時,它與數據庫在同一臺機器上運行。當然,當我使用SQLDeveloper運行時也是如此,因爲它是執行數據庫的數據庫,而不是我的客戶端。謝謝你讓我挺直。我會修復那部分,然後再試一次。 –

    +0

    賓果!我將目錄路徑更改爲DB駐留的服務器上的適當目錄,並且它工作正常。我想我現在可以在12c的Java程序中找到錯誤的原因。這幾乎可以肯定是FreeMarker模板中需要的一個缺失的屬性值。再次感謝! –