我想每天自动导出完整的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:模式导出可能足以满足我的需要。
答案 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;
我希望将来可以帮助某人。