导出数据库Oracle PL / SQL

时间:2017-05-10 16:43:35

标签: database oracle plsql export

我想每天自动导出完整的Oracle数据库。 我知道为了导出它,我们使用下面的命令:

exp userid=user/pass full=yes file='expdat.dmp' log='file.log'

但我想知道如何自动完成。 有没有办法用pl / sql做到这一点?

[编辑] 我创建了一个包含以下命令的.bat文件。 我创建了dbms_scheduler作业,如下所示:

 BEGIN
 dbms_scheduler.create_credential(
      credential_name  =>  'c',
      username         =>  'user',
      password         =>  'password');

    SYS.DBMS_SCHEDULER.CREATE_JOB( job_name => 'ex_job_1',
        job_type => 'EXECUTABLE',
        job_action => 'C:\WINDOWS\system32\cmd.exe',
        job_class => 'DEFAULT_JOB_CLASS',
        comments => 'Job to call batch script on Windows',
        auto_drop => FALSE,
        number_of_arguments => 3,
        enabled => FALSE,
        credential_name=>'c'
        );

    SYS.DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE( job_name => 'ex_job_1', argument_position => 1, argument_value => '/q'); 
    SYS.DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE( job_name => 'ex_job_1', argument_position => 2, argument_value => '/c'); 
    SYS.DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE( job_name => 'ex_job_1', argument_position => 3, argument_value => '"C:\Backup_folder\export_database.bat"'); 
    SYS.DBMS_SCHEDULER.ENABLE( 'ex_job_1' ); 

DBMS_SCHEDULER.RUN_JOB('ex_job_1');


    END;

它给了我以下错误:

Error Report -
ORA-06550: Line 2, column 17:
PLS-00302: The 'CREATE_CREDENTIAL' component must be declared
ORA-06550: Line 2, column 2:
PL / SQL: Statement ignored
ORA-06550: Line 7, column 5:
PLS-00306: number or wrong argument types in call to 'CREATE_JOB'
ORA-06550: Line 7, column 5:
PL / SQL: Statement ignored
06550. 00000 - "line% s, column% s: \ n% s"
* Cause: Usually a PL / SQL compilation error.
*Action:

我被困住了,我该怎么办?

PS:模式导出可能足以满足我的需要。

2 个答案:

答案 0 :(得分:1)

Oracle提供的软件包DBMS_DATAPUMP为该功能提供了一个PL / SQL接口。

请参阅:https://docs.oracle.com/database/121/ARPLS/d_datpmp.htm#ARPLS66053

此外,这里有一些有用的示例,但遗憾的是,没有一个涵盖FULL导出的情况:https://docs.oracle.com/database/121/SUTIL/GUID-5AAC848B-5A2B-4FD1-97ED-D3A048263118.htm#SUTIL977

答案 1 :(得分:0)

我设法使用dbms_scheduler和dbms_datapump使用以下代码每日导出完整数据库:

begin
  dbms_scheduler.create_schedule(
       schedule_name   => 'daily_back',
       repeat_interval => 'FREQ=DAILY;BYDAY=MON,TUE,WED,THU,FRI,SAT,SUN;BYHOUR=8;BYMINUTE=0;BYSECOND=0',
       start_date => SYSTIMESTAMP
  );

  dbms_scheduler.create_program
    (  program_name   => 'backup_database',
       program_type   => 'PLSQL_BLOCK',
       program_action => 'DECLARE
                          handle NUMBER;
                          nom_job varchar(25) := to_char(SYSDATE,''DD-MM-YYYY_HH24-MI-SS'');
                          nom_dump varchar(35) := ''EXPORT_''|| nom_job || ''.DMP'';
                          nom_log varchar(35) := ''EXPORT_''|| nom_job || ''.LOG'';
                          BEGIN
                          execute immediate ''create or replace directory '' || ''BACKUP_FOLDER'' ||
                                            '' as '''''' || ''C:\BACKUP_FOLDER\BACKUP'' || '''''''';
                          handle := SYS.DBMS_DATAPUMP.OPEN(operation => ''EXPORT'',job_mode  => ''FULL'',remote_link => NULL,job_name  => nom_job,version=> ''10.0.0'');
                          SYS.DBMS_DATAPUMP.ADD_FILE(handle=> handle,filename  => nom_dump,directory => ''BACKUP_FOLDER'',filetype  => 1);
                          SYS.DBMS_DATAPUMP.ADD_FILE(handle=> handle,filename=> nom_log,directory => ''BACKUP_FOLDER'',filetype  => 3);
                          SYS.DBMS_DATAPUMP.START_JOB(handle => handle,skip_current => 0,abort_step => 0);
                          SYS.DBMS_DATAPUMP.DETACH(handle=> handle); END;',
       enabled        => TRUE
    );

  dbms_scheduler.create_job (
    job_name=>'daily_backup',
    program_name =>'backup_database',
    schedule_name=> 'daily_back',
    enabled      => true 
  );

end;

我希望将来可以帮助某人。