通过oracle任务计划定期备份数据库
之前涉及到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的詳細介紹請參考官方文檔
本文轉自 zhangxuwl 51CTO博客,原文鏈接:http://blog.51cto.com/jiujian/1354083,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的通过oracle任务计划定期备份数据库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle vm 实施图解
- 下一篇: Librepilot-创建UAVObje