Oracle 数据泵导出错误“无效的参数值”

Ach*_*itz 3 java oracle11g datapump

我有一个想要运行的数据泵导出脚本。数据库是 Oracle 11g。为了尝试一下,我一直在 SQLDeveloper 中执行它。该脚本如下所示:

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;
Run Code Online (Sandbox Code Playgroud)

问题是我收到一个我无法解释的错误,我不知道如何追踪它。错误信息是:

错误报告:

ORA-39001: 无效的参数值

ORA-06512:在“SYS.DBMS_SYS_ERROR”,第 79 行

ORA-06512:在“SYS.DBMS_DATAPUMP”,第 3507 行

ORA-06512:在“SYS.DBMS_DATAPUMP”,第 3756 行

ORA-06512:在第 18 行

  1. 00000 - “无效的参数值”

*原因:用户指定的 API 参数类型错误或

值范围。提供的后续消息

DBMS_DATAPUMP.GET_STATUS 将进一步描述错误。

*操作:更正错误的参数并重试 API。

这里的重要部分是“ORA-06512:在第 18 行”。这指向第一个 ADD_FILE 语句。在搜索了有关数据泵的 Internet Oracle 文档后,我对应该是什么错误一无所知。DBMS_DATAPUMP.GET_STATUS当工作甚至没有被定义时,我也无法弄清楚如何使用,更不用说运行了。

我试过不使用该reusefile参数,我试过用DBMS_DATAPUMP.KU$_FILE_TYPE_DUMP_FILE它代表的实际整数值替换,即 1。

在 SQLDeveloper 中运行它会在 dba_datapump_jobs 中留下一个条目,要摆脱它并不是那么简单。作业的状态是“DEFINING”。这可以防止我第二次运行脚本。搜索了大约一个小时后,我发现可以使用 将其删除DROP TABLE "TMF"."TST TMF.ACHIMSTEST11" PURGE,但为什么这样做是个谜。

我想我应该指出这个脚本不是我写的,它是从 Java 程序中的 FreeMarker 模板生成的。在 Java 程序中,生成的脚本作为 OracleCallableStatement 运行,适用于 11g 数据库。我在 SQLDeveloper 中摆弄它的唯一原因是试图让它在 12c 数据库中工作。不用说,该脚本也不适用于 SQLDeveoper 中的 12c。我有点希望它适用于 11g。

顺便说一句,我在使用 12c 数据库运行 Java 时遇到的错误与上面显示的错误相同。

如果有人能看到任何实际错误或什至看起来很可疑的内容,我将非常感谢您的建议。

Ale*_*ole 5

当作业甚至没有被定义时,我也无法弄清楚如何使用 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;
/
Run Code Online (Sandbox Code Playgroud)

(是的,我知道这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
Run Code Online (Sandbox Code Playgroud)

大概当它作为可调用语句运行时,它为目录对象使用不同的路径。或者根本不包括创建/删除,这通常不会在运行时执行。12c 版本要么没有定义目录,要么在不同的服务器上使用的路径在那里无效。或者,也许是 RAC 并且仅在一个节点上有效,这可能会使错误间歇性发生。

但是,在您所展示的内容中,该/home/achim部分看起来很可疑。Oracle 进程所有者 - 通常oracle- 必须能够读取和写入操作系统目录中的文件,除非您已打开主目录供全世界查看,否则您可能会失败,因为oracle无法创建转储文件你要求它。

如果是这种情况,则更改目录路径以指向您确定oracle具有必要权限的地方;如果您有权访问该帐户,请尝试从命令行手动创建文件以进行验证。如果不是,您只需要仔细检查操作系统目录及其层次结构的权限。

当然,您可能会看到不同的错误,但看起来它必须与目录或文件相关,而不是其他参数。

此外,要删除孤立作业,请参阅 My Oracle Support 文档 336014.1。