实现的思路( 以windows为例):由于HA在某一个时刻只有一个节点作为主节点对外提供服务,排他地拥有共享存储,故如果将实现rman备份的代码和批处理文件存放在共享存储上,则无论是哪个节点作为主节点,由oracle发起的调度都可以寻找得到批处理文件和备份代码,加上使用oracle自带的dbms_scheduler调度作业,只要oracle没宕掉,就可以比较理想的实现备份。
以下为具体的实现:
首先创建一个批处理文件E:\BACKUP\RMAN_backup_script.bat,内容为
**********************************************************************************************
RMAN target sys/sys@test nocatalog cmdfile=e:\backup\rman.txt
>>e:\backup\rman_log_%date:~0,4%%date:~5,2%%date:~8,2%.log
**********************************************************************************************
注意如果是windows2008,调用bat文件的rman必须写绝对路径,即$ORACLE_HOME/bin/rman.exe,否则可能会提示rman不是可识别的可执行文件。
然后实现cmdfile,即rman所调用的文件e:\backup\rman.txt,备份脚本如下所示:
**********************************************************************************************
RUN{
ALLOCATE CHANNEL C1 TYPE DISK;
CONFIGURE RETENTION POLICY TO REDUNDANCY 2;
SQL 'ALTER SYSTEM ARCHIVE LOG CURRENT';
BACKUP ARCHIVELOG ALL FORMAT 'E:\BACKUP\ARCHIVE_%d_%t_%s_%p.BAK' DELETE ALL INPUT;
BACKUP DATABASE FORMAT 'E:\BACKUP\DB_BACKUP_%d_%s_%T.BAK';
BACKUP SPFILE FORMAT 'E:\BACKUP\SPFILE_%U.BAK';
BACKUP CURRENT CONTROLFILE FORMAT 'E:\BACKUP\CONTROL_FILE_%d_%f_%t.BAK';
CROSSCHECK BACKUP;
DELETE NOPROMPT OBSOLETE;
DELETE NOPROMPT EXPIRED BACKUP;
SQL 'ALTER SYSTEM ARCHIVE LOG CURRENT';
BACKUP ARCHIVELOG ALL FORMAT 'E:\BACKUP\ARCHIVE_%d_%t_%s_%p.BAK' DELETE ALL INPUT;
RELEASE CHANNEL C1;
}
**********************************************************************************************
最后实现oracle调度作业的创建,比如现需要通过oracle进行定期(周一到周五的早上9点10分)调度批处理文件进行备份操作,使用dbms_scheduler的脚本如下:
***************************************************************************************************
begin
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT=''yyyy-mm-dd hh24:mi:ss''';
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_LANGUAGE=''AMERICAN''';
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_LANGUAGE=''AMERICAN''';
EXECUTE IMMEDIATE 'alter session set NLS_TIMESTAMP_TZ_FORMAT=''DD-MM-RR HH.MI.SSXFF AM TZR''';
dbms_scheduler.create_job(
job_name => 'BACKUP_JOB',
job_type => 'EXECUTABLE',
job_action => 'c:\windows\system32\cmd.exe /c E:\BACKUP\RMAN_backup_script.bat >nul',
start_date => '20-03-2013 3:7.00 PM +8:00',
repeat_interval => 'freq=daily;byday=MON,TUE,WED,THU,FRI;byhour=9;byminute=10;bysecond=0');
DBMS_SCHEDULER.enable('BACKUP_JOB');
DBMS_SCHEDULER.SET_ATTRIBUTE('BACKUP_JOB','RESTARTABLE',TRUE);
end;
***************************************************************************************************
注意如果是windows上的oracle实例,还需开启OracleJobSchedulerSID服务方能正常进行作业调度。
--转自