[英]Oracle datapump export error “invalid argument value”
我有一个想要运行的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;
问题是我遇到了我无法解释的错误,也不知道如何找到它。 错误消息是:
错误报告:
ORA-39001:无效的参数值
ORA-06512:位于“ SYS.DBMS_SYS_ERROR”行79
ORA-06512:位于“ SYS.DBMS_DATAPUMP”行3507
ORA-06512:位于“ SYS.DBMS_DATAPUMP”行3756
ORA-06512:在第18行
- 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
替换DBMS_DATAPUMP.KU$_FILE_TYPE_DUMP_FILE
表示的实际整数值,即1。
在SQLDeveloper中运行它会在dba_datapump_jobs中留下一个浮动的条目,要摆脱它并不是那么简单。 作业的状态为“定义”。 这样可以防止我第二次运行脚本。 搜索了大约一个小时后,我发现可以使用DROP TABLE "TMF"."TST TMF.ACHIMSTEST11" PURGE
删除它,但是为什么这样做仍然是个谜。
我想我应该指出,我没有编写此脚本,它是从Java程序中的FreeMarker模板生成的。 在Java程序中,生成的脚本作为OracleCallableStatement运行,并适用于11g数据库。 我在SQLDeveloper中摆弄它的唯一原因是试图使它适用于12c数据库。 不用说该脚本对于SQLDeveoper中的12c也不起作用。 我有点希望它能适用于11g。
顺便说一句,运行带有12c数据库的Java时遇到的错误与上面显示的相同。
如果有人看到任何错误或什至只是可疑的东西,我将不胜感激。
当作业甚至没有定义时,我也想不出如何使用DBMS_DATAPUMP.GET_STATUS,更不用说运行了。
作业已定义,在调用add_file
时便有了一个句柄。 因此,您可以添加一个异常处理程序来调用get_status
并输出结果(当然set serveroutput on
对set serveroutput on
进行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。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.