天天看點

通過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;

/

如下:

   name           => 'oracle_bk_schedule',

   attribute      => 'repeat_interval',

   value          => 'FREQ=DAILY;BYHOUR=15,16,17');

4 建立一個scheduler

dbms_scheduler.create_schedule(

 schedule_name    =>'oracle_bk_schedule',

 repeat_interval  =>'FREQ=DAILY;BYHOUR=15,16,17',

 comments         =>'backup start 3pm');

查選我們剛剛建立的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

dbms_scheduler.create_job(

job_name       =>'oracle_bk',

program_name   =>'oracle_bk_program',

schedule_name  =>'oracle_bk_schedule',

enabled        =>true);

查詢我們剛剛建立的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,如需轉載請自行聯系原作者