Plsql 使用数据泵API的备份过程
您好,我尝试创建Oracle过程,该过程从用户模式(POSData)获取备份,并将其放置在名为“Backups”的目录中,POSData使用系统用户提供的代码在目录“Backups”上进行读写操作Plsql 使用数据泵API的备份过程,plsql,oracle11g,Plsql,Oracle11g,您好,我尝试创建Oracle过程,该过程从用户模式(POSData)获取备份,并将其放置在名为“Backups”的目录中,POSData使用系统用户提供的代码在目录“Backups”上进行读写操作 DECLARE h2 NUMBER; BEGIN h2 := DBMS_DATAPUMP.OPEN('EXPORT', 'SCHEMA'); DBMS_DATAPUMP.ADD_FILE(h2,'POSData.dmp','Backups'); DBMS_DATAPUMP.ME
DECLARE
h2 NUMBER;
BEGIN
h2 := DBMS_DATAPUMP.OPEN('EXPORT', 'SCHEMA');
DBMS_DATAPUMP.ADD_FILE(h2,'POSData.dmp','Backups');
DBMS_DATAPUMP.METADATA_FILTER(h2,'SCHEMA_EXP','IN (''POSData'')');
DBMS_DATAPUMP.START_JOB(h2);
dbms_datapump.detach(h2);
END;
但我总是犯这个错误
Error starting at line : 1 in command -
DECLARE
h2 NUMBER;
BEGIN
h2 := DBMS_DATAPUMP.OPEN('EXPORT', 'SCHEMA');
DBMS_DATAPUMP.ADD_FILE(h2,'POSData.dmp','Backups');
DBMS_DATAPUMP.METADATA_FILTER(h2,'SCHEMA_EXP','IN (''POSData'')');
DBMS_DATAPUMP.START_JOB(h2);
dbms_datapump.detach(h2);
END;
Error report -
ORA-39001: invalid argument value
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 79
ORA-06512: at "SYS.DBMS_DATAPUMP", line 3507
ORA-06512: at "SYS.DBMS_DATAPUMP", line 3756
ORA-06512: at line 5
39001. 00000 - "invalid argument value"
*Cause: The user specified API parameters were of the wrong type or
value range. Subsequent messages supplied by
DBMS_DATAPUMP.GET_STATUS will further describe the error.
*Action: Correct the bad argument and retry the API.
请帮助?DBMS\u数据泵有一些非常好的错误消息,但您必须深入了解它们。在下面的示例中,我添加了一个嵌套过程output_expdp_error来转储详细消息。当然,您应该对此进行修改,以便为您的环境执行适当的日志记录:
DECLARE
h1 NUMBER;
l_filename VARCHAR2( 100 ) := 'deleteme.dmp';
l_directory VARCHAR2( 100 ) := 'CIFS_DIR';
PROCEDURE output_expdpd_error( p_handle IN NUMBER ) AS
-- *******************************************************************
-- Output EXPDP Error
-- Purpose:
-- Send detailed EXPDP error to DBMS_OUTPUT
-- Modified:
-- 2020.03.02 - BFL Created
-- Notes:
-- Borrowed from: https://docs.oracle.com/database/121/SUTIL/GUID-5AAC848B-5A2B-4FD1-97ED-D3A048263118.htm#SUTIL977
-- *******************************************************************
l_status ku$_status; --ku$_jobstatus;
l_logentry ku$_logentry;
l_job_state VARCHAR2( 30 );
l_ind NUMBER;
l_pos NUMBER;
l_length NUMBER;
l_linesize CONSTANT NUMBER := 1000;
l_message VARCHAR2( 1000 );
BEGIN
-- Original had "if sqlcode = dbms_datapump.success_with_info_num" but this
-- hides some errors. Just always process the handle.
DBMS_OUTPUT.put_line( 'Data Pump job started with info available:' );
DBMS_DATAPUMP.get_status( p_handle
, DBMS_DATAPUMP.ku$_status_job_error
, 0
, l_job_state
, l_status );
IF (BITAND( l_status.mask, DBMS_DATAPUMP.ku$_status_job_error ) != 0)
THEN
l_logentry := l_status.error;
IF l_logentry IS NOT NULL
THEN
l_ind := l_logentry.FIRST;
WHILE l_ind IS NOT NULL
LOOP
l_pos := 1;
l_length := LENGTH( l_logentry( l_ind ).logtext );
l_length := CASE WHEN l_linesize < l_length THEN l_linesize ELSE l_length END;
WHILE l_length > 0
LOOP
l_message :=
SUBSTR( l_logentry( l_ind ).logtext
, l_pos
, l_length );
DBMS_OUTPUT.put_line( l_message );
l_pos := l_pos + l_linesize;
l_length := LENGTH( l_logentry( l_ind ).logtext ) + 1 - l_pos;
END LOOP;
l_ind := l_logentry.NEXT( l_ind );
END LOOP;
END IF;
END IF;
END;
BEGIN
DBMS_OUTPUT.put_line( 'open' );
h1 := DBMS_DATAPUMP.open( 'EXPORT', 'SCHEMA' );
DBMS_OUTPUT.put_line( 'add_file' );
DBMS_DATAPUMP.add_file( handle => h1
, filename => l_filename
, directory => l_directory
, filetype => DBMS_DATAPUMP.ku$_file_type_dump_file
, reusefile => 1 );
DBMS_OUTPUT.put_line( 'hr filter' );
DBMS_DATAPUMP.metadata_filter( h1
, 'SCHEMA_EXPR'
, 'IN (''BOGUS'')' );
DBMS_OUTPUT.put_line( 'BOGUS filter' );
DBMS_DATAPUMP.metadata_filter( h1
, 'SCHEMA_EXPR'
, 'IN (''BOGUS'')' );
DBMS_OUTPUT.put_line( 'start_job' );
DBMS_DATAPUMP.start_job( h1 );
DBMS_DATAPUMP.detach( h1 );
EXCEPTION
WHEN OTHERS
THEN
DECLARE
l_message VARCHAR2( 1000 );
BEGIN
output_expdpd_error( p_handle => h1 );
DBMS_DATAPUMP.detach( h1 );
l_message :=
SUBSTR(
SQLERRM
|| UTL_TCP.crlf
|| DBMS_UTILITY.format_error_backtrace
|| UTL_TCP.crlf
|| UTL_TCP.crlf
, 1
, 1000 );
DBMS_OUTPUT.put_line( l_message );
raise_application_error( -20000, l_message );
END;
END;
我找到了问题的解决方案,这里是代码
DECLARE
h1 number;
errorvarchar varchar2(100):= 'ERROR';
tryGetStatus number := 0;
begin
h1 := dbms_datapump.open (operation => 'EXPORT', job_mode => 'SCHEMA', job_name => 'EXPORT_JOB_SQLDEV_2344', version => 'COMPATIBLE');
tryGetStatus := 1;
dbms_datapump.set_parallel(handle => h1, degree => 1);
dbms_datapump.add_file(handle => h1, filename => 'EXPDAT.LOG', directory => 'BACKUPS', filetype => 3);
dbms_datapump.set_parameter(handle => h1, name => 'KEEP_MASTER', value => 0);
dbms_datapump.metadata_filter(handle => h1, name => 'SCHEMA_EXPR', value => 'IN(''POSDATA'')');
dbms_datapump.add_file(handle => h1, filename => 'POSData.DMP', directory => 'BACKUPS', filesize => '100M', filetype => 1, reusefile => 1);
dbms_datapump.set_parameter(handle => h1, name => 'INCLUDE_METADATA', value => 1);
dbms_datapump.set_parameter(handle => h1, name => 'DATA_ACCESS_METHOD', value => 'AUTOMATIC');
dbms_datapump.set_parameter(handle => h1, name => 'ESTIMATE', value => 'BLOCKS');
dbms_datapump.start_job(handle => h1, skip_current => 0, abort_step => 0);
dbms_datapump.detach(handle => h1);
errorvarchar := 'NO_ERROR';
EXCEPTION
WHEN OTHERS THEN
BEGIN
IF ((errorvarchar = 'ERROR')AND(tryGetStatus=1)) THEN
DBMS_DATAPUMP.DETACH(h1);
END IF;
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
RAISE;
END;
模式名称是否大写,此处:
DBMS\u DATAPUMP.METADATA\u过滤器(h2,'schema\u EXP','in('POSDATA')代码>帮助?不幸的是,同样的问题。我注意到“DBMS_DATAPUMP.ADD_FILE(h2,'POSData.dmp','Backups');”行中的问题,但我不知道为什么?
DECLARE
h1 number;
errorvarchar varchar2(100):= 'ERROR';
tryGetStatus number := 0;
begin
h1 := dbms_datapump.open (operation => 'EXPORT', job_mode => 'SCHEMA', job_name => 'EXPORT_JOB_SQLDEV_2344', version => 'COMPATIBLE');
tryGetStatus := 1;
dbms_datapump.set_parallel(handle => h1, degree => 1);
dbms_datapump.add_file(handle => h1, filename => 'EXPDAT.LOG', directory => 'BACKUPS', filetype => 3);
dbms_datapump.set_parameter(handle => h1, name => 'KEEP_MASTER', value => 0);
dbms_datapump.metadata_filter(handle => h1, name => 'SCHEMA_EXPR', value => 'IN(''POSDATA'')');
dbms_datapump.add_file(handle => h1, filename => 'POSData.DMP', directory => 'BACKUPS', filesize => '100M', filetype => 1, reusefile => 1);
dbms_datapump.set_parameter(handle => h1, name => 'INCLUDE_METADATA', value => 1);
dbms_datapump.set_parameter(handle => h1, name => 'DATA_ACCESS_METHOD', value => 'AUTOMATIC');
dbms_datapump.set_parameter(handle => h1, name => 'ESTIMATE', value => 'BLOCKS');
dbms_datapump.start_job(handle => h1, skip_current => 0, abort_step => 0);
dbms_datapump.detach(handle => h1);
errorvarchar := 'NO_ERROR';
EXCEPTION
WHEN OTHERS THEN
BEGIN
IF ((errorvarchar = 'ERROR')AND(tryGetStatus=1)) THEN
DBMS_DATAPUMP.DETACH(h1);
END IF;
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
RAISE;
END;