Plsql 使用数据泵API的备份过程

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

您好,我尝试创建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.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;