一次rman 指令碼的部署

wangxiangtao發表於2011-07-12

由於資料庫的資料量不大, 因此在部署過程中直接採用了nfs 的掛載 然後將rman備份路徑直接指向nfs 的掛載, 在生產環境中有足夠的空間,考慮到rman的效能,頻寬影響,建議將rman備到本地,因為nfs 的速度真的不可恭維。

 

以下是部署步驟:

(1)     檢視control_file_record_keep_time 引數

此引數影響控制檔案愛你中儲存備份記錄的時間,備份記錄包括完全的資料庫備份記錄, 以及指定的資料檔案, 控制檔案, 引數檔案和歸檔目錄的備份記錄,引數control_file_record_keep_time以天為單位(預設單位為7),因此採用nocatalog 的方式備份時建議:  將引數control_file_record_keep_time的值設定為不小於資料庫的備份儲存週期

 

SQL> show parameter control_file

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

control_file_record_keep_time        integer     7

 

SQL> alter  system  set control_file_record_keep_time=15;

 

System altered.

 

SQL> show parameter control_file_re

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

control_file_record_keep_time        integer     15

(2)      部署備份指令碼 (此指令碼感謝david 大師的提供,本人作了小小的改動)

[oracle@dev121 ~]$ cat  /backup/script/incremental_backup.sh

######################################################################

##incremental__backup.sh                 ##

##  created by Tianlesoftware   ##

##   modify by  Gabriel                 ##

##        2011-04-22                   ##

#########################################################################

#!/bin/bash

#export LANG=en_US

source /home/oracle/.bash_profile

BACKUP_DATE=`date +%Y%m%d`

RMAN_LOG_FILE=/backup/script/"$BACKUP_DATE".log

TODAY=`date`

USER=`id|cut -d "(" -f2|cut -d ")" -f1`

echo "-----------------$TODAY-------------------">$RMAN_LOG_FILE

#ORACLE_HOME=/u01/app/oracle/product/10.2.0/db_1

#export ORACLE_HOME

RMAN=$ORACLE_HOME/bin/rman

export RMAN

#ORACLE_SID=orcl

#export ORACLE_SID

ORACLE_USER=oracle

export ORACLE_USER

 

echo "ORACLE_SID: $ORACLE_SID">>$RMAN_LOG_FILE

echo "ORACLE_HOME:$ORACLE_HOME">>$RMAN_LOG_FILE

echo "ORACLE_USER:$ORACLE_USER">>$RMAN_LOG_FILE

echo "==========================================">>$RMAN_LOG_FILE

echo "BACKUP DATABASE BEGIN......">>$RMAN_LOG_FILE

echo "                   ">>$RMAN_LOG_FILE

chmod 666 $RMAN_LOG_FILE

 

WEEK_DAILY=`date +%a`

 

case  "$WEEK_DAILY" in

       "Mon")

            BAK_LEVEL=2

            ;;

       "Tue")

            BAK_LEVEL=2

            ;;

       "Wed")

            BAK_LEVEL=2

            ;;

       "Thu")

            BAK_LEVEL=1

            ;;

       "Fri")

            BAK_LEVEL=2

            ;;

       "Sat")

            BAK_LEVEL=2

            ;;

       "Sun")

            BAK_LEVEL=0

            ;;

       "*")

            BAK_LEVEL=error

esac

export BAK_LEVEL=$BAK_LEVEL

echo "Today is : $WEEK_DAILY  incremental level= $BAK_LEVEL">>$RMAN_LOG_FILE

 

#RUN_STR="

#BAK_LEVEL=$BAK_LEVEL

#export BAK_LEVEL

#ORACLE_HOME=$ORACLE_HOME

#export ORACLE_HOME

#ORACLE_SID=$ORACLE_SID

#export ORACLE_SID

$RMAN TARGET /  msglog $RMAN_LOG_FILE append <

run

{

allocate channel c1 type disk;

allocate channel c2 type disk;

backup  incremental level= $BAK_LEVEL  skip inaccessible filesperset 5 Database format='/backup/rmanback/${ORACLE_SID}_lev${BAK_LEVEL}_%U_%T'  tag='orcl_lev${BAK_LEVEL}' ;

 

sql 'alter system archive log current';

 

backup archivelog all tag='arc_bak' format='/backup/rmanback/arch_%U_%T' skip inaccessible  filesperset 5 not  backed up 1 times  delete input;

 

backup current controlfile tag='bak_ctlfile' format='/backup/rmanback/ctl_file_%U_%T';

backup spfile tag='spfile' format='/backup/rmanback/${ORACLE_SID}_spfile_%U_%T';

release channel c2;

release channel c1;

}

allocate channel  for maintenance device type disk;

report obsolete;

crosscheck backup;

crosscheck archivelog all;

delete noprompt expired backup;

delete noprompt obsolete;

delete noprompt backup of database completed before 'sysdate -7';

delete noprompt archivelog all;

delete noprompt backup of archivelog all completed before 'sysdate -7';

list backup summary;

release channel;

EOF

RSTAT=$?

 

#allocate channel for maintenance device type disk;

#report obsolete;

#delete noprompt obsolete;

#crosscheck backup;

#delete noprompt expired backup;

#list backup summary;

#release channel;

#"

#if the rman using catalog  you must  add the line in the end of RUN_STR

#resync catalog;

 

 

 # Initiate the command string

 

#if [ "$CUSER" = "root" ]

#then

#    echo "Root Command String: $RUN_STR" >> $RMAN_LOG_FILE

#    su - $ORACLE_USER -c "$RUN_STR" >> $RMAN_LOG_FILE

#    RSTAT=$?

#else

#    echo "User Command String: $RUN_STR" >> $RMAN_LOG_FILE

#    /bin/sh -c "$RUN_STR" >> $RMAN_LOG_FILE

#    RSTAT=$?

#fi

 

# ---------------------------------------------------------------------------

# Log the completion of this script.

# ---------------------------------------------------------------------------

if [ "$RSTAT" = "0" ]

then

    LOGMSG="ended successfully"

else

    LOGMSG="ended in error"

fi

 

echo >> $RMAN_LOG_FILE

echo Script. $0 >> $RMAN_LOG_FILE

echo ==== $LOGMSG on `date` ==== >> $RMAN_LOG_FILE

echo >> $RMAN_LOG_FILE

#/bin/mailx -s "RMAN Backup SID " @sf-express.com < $RMAN_LOG_FILE

 

exit $RSTAT

此指令碼在shell 內部對時間進行判斷 備份策略為:

(A)    星期天做 0級增量備份

(B)    星期四做1級增量備份(即在星期天的基礎上做增量備份)

(C)    其餘天數做2級增量備份(做前一天的增量備份)

(3)     定製時間任務,讓指令碼定期執行

 

[oracle@dev121 ~]$ crontab -l

30 0 * * * /backup/script/incremental_backup.sh >/dev/null 2>&1 &

 

此次部署基本完成,透過一個多星期的觀察 沒有發生異常!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8117479/viewspace-701970/,如需轉載,請註明出處,否則將追究法律責任。

相關文章