之前涉及到oracle定期備份的問題走的都是作業系統層面的任務計劃,下面用oracle的task scheduler 定期執行oracle的備份,詳細步驟見下:
1 備份語句/oracle/bak/fullbk.txt如下:
[oracle@dest ~]$ cat /oracle/bak/fullbk.txt
run{
delete noprompt obsolete; # 以不提示的方式刪除狀態為obsolete的備份注意備份是否obsolete和備份保留原則有關)
crosscheck backup; # 校正rman資料庫中記錄的備份是否存在於磁碟或物理裝置上,如果不存在,則更改rman資料庫中該備份記錄為expired狀態
delete noprompt expired backup; # 以不提示的方式刪除rman資料庫中所有標記為expired狀態的記錄
crosscheck archivelog all; # 校正rman資料庫中所有歸檔記錄,對在物理裝置上不存在的歸檔,在rman資料庫中更新其標記為expired
delete noprompt expired archivelog all; #以不提示的方式刪除rman資料庫中所有標記為expired狀態的歸檔記錄
backup incremental level=0 database format '/backup/crm/full-%T-%U.bak'; #做一個0層級的資料庫全備份
backup archivelog all format '/backup/crm/arch-%T-%U.bak'; #備份所有歸檔
backup current controlfile format '/backup/crm/ctl-%T-%U.bak'; #備份當前控制檔案
backup spfile format '/backup/crm/spf-%T-%U.bak'; # 備份參數檔案
delete noprompt archivelog all completed before 'SYSDATE - 7'; # 以不提示的方式刪除7天之前的所有歸檔
}
注意 以上指令碼僅僅是為測試,該指令碼對於從上一次全備份到資料庫目前狀態丟失了一部分歸檔,或者歸檔損壞的情況,是無法進行完全恢複的。
2 備份指令碼/oracle/bak/rman.sh如下:
[oracle@dest ~]$ cat /oracle/bak/rman.sh
#!/bin/bash
export today=`date +%Y%m%d%H%M`
export ORACLE_HOME=/oracle/app/db1
export ORACLE_SID=CRM
$ORACLE_HOME/bin/rman target sys/DHHZDHHZ log=/oracle/bak/crm.log cmdfile=/oracle/bak/fullbk.txt
mv /oracle/bak/crm.log "/oracle/bak/crm${today}.log"
此指令碼讓rman調用/oracle/bak/fullbk.txt文本中的備份語句,記錄當前備份過程於記錄檔,並更改產生的記錄檔名為當前日期。
3 在oracle中建立program
begin
dbms_scheduler.create_program (
program_name =>'oracle_bk_program',
program_action =>'/oracle/bak/rman.sh',
program_type =>'EXECUTABLE',
enabled =>true,
comments =>'oracle.sh');
end;
/
查詢我們剛剛建立的program如下
select program_name,program_type,program_action,number_of_arguments,enabled from user_scheduler_programs where program_name='ORACLE_BK_PROGRAM';
PROGRAM_NAME PROGRAM_TYPE PROGRAM_ACTION NUMBER_OF_ARGUMENTS ENABL
------------------- ---------------- ---------------------- ------------------- -----
ORACLE_BK_PROGRAM EXECUTABLE /oracle/bak/rman.sh 0 TRUE
注意如果要修改程式,job或者shceduler則可用如下語句
BEGIN
DBMS_SCHEDULER.SET_ATTRIBUTE (
name => '',
attribute => '',
value => '');
END;
/
如下:
BEGIN
DBMS_SCHEDULER.SET_ATTRIBUTE (
name => 'oracle_bk_schedule',
attribute => 'repeat_interval',
value => 'FREQ=DAILY;BYHOUR=15,16,17');
END;
/
4 建立一個scheduler
begin
dbms_scheduler.create_schedule(
schedule_name =>'oracle_bk_schedule',
repeat_interval =>'FREQ=DAILY;BYHOUR=15,16,17',
comments =>'backup start 3pm');
end;
/
查選我們剛剛建立的scheduler如下:
SQL> select schedule_name,repeat_interval from user_scheduler_schedules where schedule_name='ORACLE_BK_SCHEDULE';
SCHEDULE_NAME REPEAT_INTERVAL
------------------------------ ------------------------------------------------------------
ORACLE_BK_SCHEDULE FREQ=DAILY;BYHOUR=17
5 建立一個job,在job中引用建立的程式和scheduler
注意 After you create a job and enable it, the Scheduler automatically runs the job according to its schedule or when the specified event is detected
begin
dbms_scheduler.create_job(
job_name =>'oracle_bk',
program_name =>'oracle_bk_program',
schedule_name =>'oracle_bk_schedule',
enabled =>true);
end;
/
查詢我們剛剛建立的job如下:
SQL> select job_name,job_type,job_action, REPEAT_INTERVAL,enabled,state from user_scheduler_jobs where job_name='ORACLE_BK';
JOB_NAME JOB_TYPE JOB_ACTION REPEAT_INTERVAL ENABL STATE
------------ ------------- ----------------- ----------------- ----- ---------------
ORACLE_BK TRUE SCHEDULED
SQL>
6 查詢建立job的健全狀態如下:
select log_id,log_date,status,additional_info from user_scheduler_job_run_details where job_name='ORACLE_BK';
LOG_ID LOG_DATE STATUS ADDITIONAL_INFO
---------- ----------------------------------- ---------- ------------------------------
511 22-JAN-14 03.54.43.650305 PM +08:00 SUCCEEDED
514 22-JAN-14 03.58.51.953108 PM +08:00 SUCCEEDED
519 22-JAN-14 04.58.10.062466 PM +08:00 SUCCEEDED
522 22-JAN-14 05.57.50.288474 PM +08:00 SUCCEEDED
7 查詢產生的備份記錄檔記錄如下:
[oracle@dest bak]$ ls -lt
total 304
-rw-r--r-- 1 oracle oinstall 9680 Jan 22 17:57 crm201401221756.log
-rw-r--r-- 1 oracle oinstall 10595 Jan 22 16:58 crm201401221656.log
-rw-r--r-- 1 oracle oinstall 13155 Jan 22 15:58 crm201401221556.log
-rw-r--r-- 1 oracle oinstall 12681 Jan 22 15:54 crm201401221551.log
注意 1 刪除program和scheduler前應先刪除調用program和schedule的job
2 之前rman.sh指令碼缺少#!/bin/bash 以及rman未輸入全路徑導致任務計劃不能執行提示指令碼不能執行
3 關於oracle scheduler的詳細介紹請參考官方文檔
本文出自 “myblog” 部落格,請務必保留此出處http://jiujian.blog.51cto.com/444665/1354083