Oracle rman 全备+增备脚本

Oracle rman 增备脚本

vim /home/oracle/scripts/oracle_rman.sh

#!/bin/bash

source /home/oracle/.bash_profile

DICPATH=/db_backup/oracle/rman

LOGPATH=$DICPATH/log

DATPATH=$DICPATH/data

if [ ! -d $LOGPATH ]; then

        mkdir -p $LOGPATH

fi

if [ ! -d $DATPATH ]; then

        mkdir -p $DATPATH

fi

if [ "$1" = "full" ]; then

echo 'jxrt'

rman target /  nocatalog msglog=$LOGPATH/rman_db_`date '+%Y%m%d%H%M%S'`.log <<EOF

run{

REPORT OBSOLETE;

#crosscheck archivelog all;

allocate channel c1 type disk;

allocate channel c2 type disk;

allocate channel c3 type disk;

allocate channel c4 type disk;

allocate channel c5 type disk;

allocate channel c6 type disk;

allocate channel c7 type disk;

allocate channel c8 type disk;

sql 'alter system archive log current';

backup as compressed  backupset incremental level 0 cumulative database FILESPERSET 8 tag 'dbfull' format '$DATPATH/full_%d_%T_%s_%U.bak' ;

sql 'alter system archive log current';

backup as compressed backupset archivelog all tag 'arch' format '$DATPATH/arch_%d_%T_%s_%U.arc';

DELETE force NOPROMPT OBSOLETE  recovery window of 8 days device type disk;

delete noprompt expired backup;

delete noprompt expired archivelog all;

backup current controlfile format '$DATPATH/ctl_%d_%T_%s_%U.bak';

release channel c1;

release channel c2;

release channel c3;

release channel c4;

release channel c5;

release channel c6;

release channel c7;

release channel c8;

}

exit;

EOF

elif [ "$1" = "diff" ]; then

rman target /  nocatalog msglog=$LOGPATH/rman_db_`date '+%Y%m%d%H%M%S'`.log <<EOF

run{

REPORT OBSOLETE;

#crosscheck archivelog all;

allocate channel c1 type disk;

allocate channel c2 type disk;

allocate channel c3 type disk;

allocate channel c4 type disk;

allocate channel c5 type disk;

allocate channel c6 type disk;

allocate channel c7 type disk;

allocate channel c8 type disk;

sql 'alter system archive log current';

backup as compressed  backupset incremental level 1 cumulative database FILESPERSET 8 tag 'dbincrL1' format '$DATPATH/incr_L1_%d_%T_%s_%U.bak' ;

sql 'alter system archive log current';

backup as compressed backupset archivelog all tag 'arch' format '$DATPATH/arch_%d_%T_%s_%U.arc';

DELETE force NOPROMPT OBSOLETE  recovery window of 8 days device type disk;

delete noprompt expired backup;

delete noprompt expired archivelog all;

backup current controlfile format '$DATPATH/ctl_%d_%T_%s_%U.bak';

release channel c1;

release channel c2;

release channel c3;

release channel c4;

release channel c5;

release channel c6;

release channel c7;

release channel c8;

}

exit;

EOF

fi

#oracle 用户下的定时备份任务,可加参数 full 或者 diff

#30 0 * * * sh /home/oracle/db/scripts/oracle_rman.sh full

运行脚本

每周五凌晨 2:10 分运行 rman 脚本进行数据库全备,注意后面加参数 full;

其他时间每天 2:22 分运行 rman 脚本进行数据库增量备份,注意后面加参数 diff。

10 2 * * 5 /bin/bash /home/oracle/scripts/oracle_rman.sh full

22 2 * * 6,0,1,2,3,4 /bin/bash /home/oracle/scripts/oracle_rman.sh diff

Oracle rman 全备脚本

下面的脚本是对数据库进行全备或者归档日志备份的,注意如果使用到了 catlog 的话,也可以使用我注释掉的 rman target catlog 连接串。

vim rman_nfs_bak.sh

#!/bin/bash

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

#                      hot_database_backup_proxy.sh

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

#  This script uses Recovery Manager to take a hot (inconsistent) database

#  backup. A hot backup is inconsistent because portions of the database are

#  being modified and written to the disk while the backup is progressing.

#  You must run your database in ARCHIVELOG mode to make hot backups. It is

#  assumed that this script will be executed by user root. In order for RMAN

#  to work properly we switch user (su -) to the oracle dba account before

#  execution. If this script runs under a user account that has Oracle dba

#  privilege, it will be executed using this user's account.

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

ORACLE_USER=oracle

ORACLE_GROUP=oinstall

TARGET_CONNECT_STR=/

ORACLE_SID=JIEKEDB2

BAK_DIR=/backup/DB_Bak

source /home/${ORACLE_USER}/.bash_profile

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

# Get the directory where the script locates and create log directory.

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

DIR=$(cd `dirname ${0}`; pwd)

if [ ! -d ${DIR}/logs ]

then

mkdir -p ${DIR}/logs

chown -R ${ORACLE_USER}:${ORACLE_GROUP} ${DIR}/logs

fi

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

# Get the variables we need from the local instance.

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

SID=`ps -ef|grep pmon|grep ora_|awk -F'_' '{print $NF}'`

case "$SID" in

    "$ORACLE_SID")  RCVCAT_CONNECT_STR=jieke/jieke0jiekeR#@catalog

                      ;;

    *) echo "Cannot get SID,database is not running" >> ${DIR}/logs/`basename ${0}`_error.out

exit 1

      ;;

esac

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

# Determine the user which is executing this script.

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

CUSER=`whoami`

if [ ${CUSER} != ${ORACLE_USER} ]

then

echo "Please user oracle_user to run the script!" >> ${DIR}/logs/`basename ${0}`_error.out

exit 1

fi

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

# Put output in <this file name>.out. Change as desired.

# Note: output directory requires write permission.

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

case "$1" in

    "arch") RMAN_LOG_FILE=${ORACLE_SID}_arch_`date +%Y%m%d-%H%M%S`.out

    ;;

    "full") RMAN_LOG_FILE=${ORACLE_SID}_full_`date +%Y%m%d-%H%M%S`.out

    ;;

    *) echo " The following word is needed as a script parameter: arch or full! ">> ${DIR}/logs/`basename ${0}`_error.out

exit 1

      ;;

esac

NAME=`basename ${0}`

RMAN_LOG_FILE=${DIR}/logs/`basename $RMAN_LOG_FILE`

find ${DIR}/logs -name ${NAME}\* -mtime +30 | xargs rm -f

if [ -h ${DIR}/logs/last ]

then

rm ${DIR}/logs/last

fi

ln -s $RMAN_LOG_FILE ${DIR}/logs/last

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

# You may want to delete the output file so that backup information does

# not accumulate.  If not, delete the following lines.

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

# if [ -f "$RMAN_LOG_FILE" ]

# then

#    rm -f "$RMAN_LOG_FILE"

# fi

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

# Initialize the log file.

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

echo>> $RMAN_LOG_FILE

chmod 666 $RMAN_LOG_FILE

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

# Log the start of this script.

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

echo Script $0 >> $RMAN_LOG_FILE

echo ==== started on `date '+%a,%Y%m%d-%H:%M:%S'` ==== >> $RMAN_LOG_FILE

echo>> $RMAN_LOG_FILE

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

# Print out the value of the variables set by this script.

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

echo>> $RMAN_LOG_FILE

echo  "RMAN: $RMAN" >> $RMAN_LOG_FILE

echo  "ORACLE_SID: $ORACLE_SID" >> $RMAN_LOG_FILE

echo  "ORACLE_USER: $ORACLE_USER" >> $RMAN_LOG_FILE

echo  "ORACLE_HOME: $ORACLE_HOME" >> $RMAN_LOG_FILE

# Convert requests for incremental into archive log only backups

if [ "$1" = "arch" ]; then

echo "Archive log only backup requested" >> $RMAN_LOG_FILE

CMD_STR="

#rman target $TARGET_CONNECT_STR catalog $RCVCAT_CONNECT_STR log $RMAN_LOG_FILE append << EOF

rman target / log $RMAN_LOG_FILE append << EOF

RUN {

sql 'alter system archive log current';

ALLOCATE CHANNEL ch00 device type DISK;

BACKUP

    FILESPERSET 5

    FORMAT '${BAK_DIR}/arch_%d_%s_%p_%t'

    ARCHIVELOG ALL;

RELEASE CHANNEL ch00;

}

EOF

"

elif [ "$1" = "full" ]; then

echo "Full database backup requested" >> $RMAN_LOG_FILE

CMD_STR="

rman target $TARGET_CONNECT_STR catalog $RCVCAT_CONNECT_STR log $RMAN_LOG_FILE append << EOF

RUN {

ALLOCATE CHANNEL ch00 device type DISK;

ALLOCATE CHANNEL ch01 device type DISK;

BACKUP

  TAG ${ORACLE_SID}_hot_backup

  FILESPERSET 5

  FORMAT '${BAK_DIR}/database_%d_%s_%p_%t'

  DATABASE;

sql 'alter system archive log current';

RELEASE CHANNEL ch00;

RELEASE CHANNEL ch01;

}

EOF

"

fi

# Initiate the command string

sh -c "$CMD_STR"

#sh -c "$CMD_STR" >> $RMAN_LOG_FILE

RSTAT=$?

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

# 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 '+%a,%Y%m%d-%H:%M:%S'` ==== >> $RMAN_LOG_FILE

echo>> $RMAN_LOG_FILE

exit $RSTAT

运行脚本

每周一凌晨 1:10 分运行 rman 脚本进行数据库全备,注意后面加参数 full;

其他时间每天 0:10 分运行 rman 脚本进行数据库归档日志备份,注意后面加参数 arch。

10 1 * * 1 /home/oracle/db/scripts/rman_nfs_bak.sh full

10 0 * * * /home/oracle/db/scripts/rman_nfs_bak.sh arch


Oracle 归档删除脚本

vi /home/oracle/clear_arch.sh

#!/bin/bash

ORACLE_BASE=/u01/app/oracle

ORACLE_HOME=/u01/app/product/19.0.0/dbhome_1

ORACLE_SID=orcl

PATH=$PATH:$ORACLE_HOME/bin/

source /home/oracle/.bash_profile

rman target / log=/home/oracle/clear_arch.log<<EOF

delete force noprompt archivelog all completed before 'sysdate-5';

exit

EOF

运行脚本

chmod +x /home/oracle/clear_arch.sh

每隔六个小时运行一次,清理五天之前的归档日志。注意有备库或者 ogg 的需要格外注意,避免被过早的删除。

crontab -e

0 0,6,12,18 * * * /home/oracle/clear_arch.sh

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容