Rman Scripts (Linux)

---------------------------------------------------backup

#!/bin/bash
#Introduce: Linux backup Oracle by RMAN everyday.
#2010/04/15 by Lihongyi


echo 'Attention:Linux ready to backup Oracle now!'
source $HOME/.bash_profile
rman=$ORACLE_HOME/bin/rman


filepath=`date +%Y%m%d`
weekday=`date -d today +%w`

mkdir /backup/"$filepath"

if [ "$weekday" == "7" ]; then
rman target / <backup incremental level=0 database format '/backup/$filepath/%U';

delete expired backup;
quit;
EOF
elif [ "$weekday" == "2" ]||[ "$weekday" == "4" ]; then
rman target / <

Backup incremental level=1 database format '/backup/$filepath/%U';

delete expired backup;
quit;
EOF
elif [ "$weekday" == "1" ]||[ "$weekday" == "3" ] ||[ "$weekday" == "5" ] ||[ "$weekday" == "6" ]; then
rman target / <

backup incremental level=2 database format '/backup/$filepath/%U';

delete expired backup;
quit;
EOF
fi

exit 0

-----------------------------------------------------Rmanbackup

#!/bin/sh
# 编写: 刘建 2010.01.15(版本0.8)
# 功能: 源数据库根据事先定制的备份策略,定期执行数据备份任务。
# 调用方式:RmanBackup.sh 备份模式 ORACLE_SID 备份的目标文件夹 本地归档日志存放有效天数 备份数据有效天数 备份进程并行度
# 注:备份模式 0: 0级全备份 1: 1级增量备份
# 例如: ./RmanBackup.sh 0 orcl /opt/ora10g/backup 3 3 2
# 执行方式:(1)以oracle用户身份登录linux后手工执行
# (2)以oracle用户身份自动执行的crontab任务
#
# 版本修订说明:
# 一、版本0.9 刘建 2010.01.22
# 1、 简化备份流程的复杂度,去除RmanConfig模块。
# 2、 忽略归档日志的备份。
# 3、 加入交叉检查、自动删除无效备份文件的功能。
# 4、 加入了对工作记录log文件所在目录的自动创建功能,不需人工干预。
# 5、 优化恢复程序,避免常见的ORA-600和ORA-01152错误。
#
# 二、版本1.0 刘建 2010.01.27
# 1、 增加了对当前数据库是否启用“归档模式”的自动检查,未开启则提示该信息并中断本次任务。
# 2、 增加对单机存在多个数据库实例的支持,备份与恢复脚本都增加了{ORACLE_SID}参数。
# 3、 为更加明晰的标识存放于备份区的的备份文件是属于“全备份”还是“增量备份”,
# 修改了备份脚本,使得“全备份”和“增量备份”的备份片文件名特征不同。
# 2010.01.28 增加
# 4、 补充了对【目标数据库服务器】块跟踪日志文件存放路径的自动检测和创建工作代码,否则该目录不存在时,“恢复”会提示错误。
# 5、 改变了对控制文件和SPFILE自动备份的触发方式,
# 由原先的RMAN的CONFIG定制改为每次backup database命令时连带INCLUDE CURRENT CONTROLFILE命令执行。
# 2010.02.07 增加
# 6、 修正了一个会导致备份文件过期后仍然无法被自动删除的ORACLE初始化参数的默认设置值,
# 使得控制文件可以保存365天(全年)的备份状况数据。
##########################################################################################################################


###################################################
#开始脚本的各项初始化工作
#先核对命令行中,参数是否齐备
if [ $# -lt 6 ]
then
echo "==========================================================================================================="
echo "Usage:"
echo "RmanBackup.sh {BackupMode} {ORACLE_SID} {BackupDirectory} {ArchRetainDay} {BakFileRetainDay} {Parallelism} "
#echo "请详细核对命令行中需要设置的6个参数是否完整:"
#echo "RmanBackup.sh 备份模式 ORACLE_SID 备份的目标文件夹 本地归档日志存放有效天数 备份数据有效天数 备份进程并行度"
echo "==========================================================================================================="
exit 1
fi

#执行变量
source $HOME/.bash_profile
TEE=/usr/bin/tee
RMAN=$ORACLE_HOME/bin/rman
SQLPLUS=$ORACLE_HOME/bin/sqlplus

export ORACLE_SID=$2

#目录变量
BACKUPDEST=$3
if [ ! -d $BACKUPDEST ]
then
echo "请详细核对“备份的目标文件夹”参数是否正确,此文件夹无法正常访问!"
exit 1
fi

#日志文件
if [ ! -d $ORACLE_BASE/BackupLogs ]
then
mkdir $ORACLE_BASE/BackupLogs
fi
LOGFILE=$ORACLE_BASE/BackupLogs/RmanBackup_`date +%Y%m%d`.log

#检查数据库是否已经处于“归档模式”下
$SQLPLUS "/ as sysdba" <spool AL.log
SELECT LOG_MODE FROM V$DATABASE;
spool off
EXIT
EOF

STATUS=`grep -i "NOARCHIVELOG" AL.log|wc -l`
if [ $STATUS -eq 1 ]
then
echo "当前ORACLE数据库未运行在“归档模式”下,不能进行联机热备,请完善相关配置!"
exit 1
fi

###########################################################
#激活“块跟踪”功能,并设置块跟踪日志文件的文件名及其存放路径
if [ ! -d $ORACLE_BASE/Rman ]
then
mkdir $ORACLE_BASE/Rman
fi

#检查是否已经激活了“块跟踪”功能
$SQLPLUS "/ as sysdba" <spool BCT.log
SELECT STATUS FROM V$BLOCK_CHANGE_TRACKING;
spool off
EXIT
EOF

STATUS=`grep -i "ENABLED" BCT.log|wc -l`
if [ $STATUS -eq 0 ]
then
$SQLPLUS "/ as sysdba" <ALTER DATABASE ENABLE BLOCK CHANGE TRACKING USING FILE '$ORACLE_BASE/Rman/RmanBlockChangeTrack.f';
EXIT
EOF
fi

###########################################################
#修改初始化参数---控制文件保存备份文件信息的天数 扩大为1年

$SQLPLUS "/ as sysdba" <spool KD.log
SHOW PARAMETER control_file_record_keep_time
spool off
EXIT
EOF

STATUS=`grep -i "integer" KD.log| awk '{print $3}'`
if [ $STATUS -lt 365 ]
then
$SQLPLUS "/ as sysdba" <ALTER SYSTEM SET CONTROL_FILE_RECORD_KEEP_TIME = 365 SCOPE=BOTH;
EXIT
EOF
fi

###########################################################
# 防止RMAN可能对部分过期备份文件漏删除,这里用OS的命令补做
#find $BACKUPDEST -name "20*_L0_*.bak" -mtime +$5 -exec rm {} ;
#find $BACKUPDEST -name "20*_L1_*.bak" -mtime +$5 -exec rm {} ;
#find $BACKUPDEST -name "20*_c-*" -mtime +$5 -exec rm {} ;

###########################################################
#开始执行备份工作
if [ $1 -eq 0 ]
then
$RMAN <CONNECT TARGET

#若开启CF的自动备份规则,那么RMAN会在每个数据文件发生备份时产生1个控制文件备份(仅第一个记录在案),
#这势必造成备份文件过多的问题,因此需要屏蔽此规则
#CONFIGURE CONTROLFILE AUTOBACKUP ON;

CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '$BACKUPDEST/%T_%F';

#备份文件的保持策略(即保留天数,过期将会被delete noprompt obsolete语句自动删除)
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF $5 DAYS;

#最大同时可开启4个备份通道
CONFIGURE CHANNEL 0 DEVICE TYPE DISK FORMAT '$BACKUPDEST/%T_L0_num%s_%p.bak' MAXPIECESIZE=20G;
CONFIGURE CHANNEL 1 DEVICE TYPE DISK FORMAT '$BACKUPDEST/%T_L0_num%s_%p.bak' MAXPIECESIZE=20G;
CONFIGURE CHANNEL 2 DEVICE TYPE DISK FORMAT '$BACKUPDEST/%T_L0_num%s_%p.bak' MAXPIECESIZE=20G;
CONFIGURE CHANNEL 3 DEVICE TYPE DISK FORMAT '$BACKUPDEST/%T_L0_num%s_%p.bak' MAXPIECESIZE=20G;

#并行度(决定开启并发的备份通道个数,多并发可以加快备份速度,但要和CPU核数、磁盘实际的吞吐能力匹配)
CONFIGURE DEVICE TYPE DISK PARALLELISM $6 BACKUP TYPE TO BACKUPSET;

SQL 'ALTER SYSTEM ARCHIVE LOG CURRENT';

#0级全备份;控制文件(spfile也会包含)需同步备份,且每次backup仅备份产生1个控制文件备份。
BACKUP INCREMENTAL LEVEL 0 TAG 'BackupLevel0' DATABASE FILESPERSET=4 INCLUDE CURRENT CONTROLFILE;

#因为在备份过程中,某些数据文件可能仍然被修改(已经备份的文件的SCN会比控制文件最后记录的SCN要小),仍然产生redoLog,
#在做完backup database后,保险起见,建议备份归档,否则恢复时会产生其他问题。
#先强制切换并归档当前的redo log
#SQL 'ALTER SYSTEM ARCHIVE LOG CURRENT';
#将近期的archived log 一并备份到共享区
#BACKUP ARCHIVELOG ALL NOT BACKED UP FORMAT '$BACKUPDEST/%T_num%s%p.bak' FILESPERSET=5;

#备份完成后,自动清除处于失效期的本地归档日志(即仅保留 $3 天之内的)
DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-$4';

#根据先前制定的备份保留策略,自动删除过期失效文件
CROSSCHECK BACKUP;
DELETE NOPROMPT EXPIRED BACKUP;
DELETE NOPROMPT OBSOLETE;

EXIT;
EOF
else
$RMAN <CONNECT TARGET

CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '$BACKUPDEST/%T_%F';

CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF $5 DAYS;

CONFIGURE CHANNEL 0 DEVICE TYPE DISK FORMAT '$BACKUPDEST/%T_L1_num%s_%p.bak' MAXPIECESIZE=20G;
CONFIGURE CHANNEL 1 DEVICE TYPE DISK FORMAT '$BACKUPDEST/%T_L1_num%s_%p.bak' MAXPIECESIZE=20G;
CONFIGURE CHANNEL 2 DEVICE TYPE DISK FORMAT '$BACKUPDEST/%T_L1_num%s_%p.bak' MAXPIECESIZE=20G;
CONFIGURE CHANNEL 3 DEVICE TYPE DISK FORMAT '$BACKUPDEST/%T_L1_num%s_%p.bak' MAXPIECESIZE=20G;

CONFIGURE DEVICE TYPE DISK PARALLELISM $6 BACKUP TYPE TO BACKUPSET;

SQL 'ALTER SYSTEM ARCHIVE LOG CURRENT';

#1级增量备份
BACKUP INCREMENTAL LEVEL 1 TAG 'BACKUPLEVEL1' DATABASE FILESPERSET=4 INCLUDE CURRENT CONTROLFILE;

DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-$4';

CROSSCHECK BACKUP;
DELETE NOPROMPT EXPIRED BACKUP;
DELETE NOPROMPT OBSOLETE;
EXIT;
EOF
fi

#备份控制文件
rm $ORACLE_BASE/NEW.CTL
#不要直接备份到$BACKUPDEST目录
$SQLPLUS "/ as sysdba" <ALTER DATABASE BACKUP CONTROLFILE TO '$ORACLE_BASE/NEW.CTL';
exit;
EOF

cp $ORACLE_BASE/NEW.CTL $BACKUPDEST/NEW.CTL

-----------------------------------------------------Rmanrestore

##########################################################################################################################
#!/bin/sh
# 编写: 刘建 2010.01.15(版本0.8)
# 功能: 目标数据库根据源数据库定期备份到共享存放区的备份数据,定期执行数据恢复任务,保证备份机的准同步状态。
# 调用方式:RmanRestore.sh 恢复模式 ORACLE_SID 备份文件的“共享存放区”访问路径 源数据库的dbid 恢复进程的并行度
# 恢复模式
# 0: "全量恢复"模式 先恢复最近的0级全备份,再寻找1级增量备份来恢复
# 1: "增量恢复"模式 只优先使用1级增量备份来恢复(之后再找archivelog,但本备份体系未备份archivelog)
# 备份机必须要保证的:“备份文件的共享存放区” 在 源数据库和目标数据库 上的访问路径命名是 一致 的!
# 否则,目标数据库使用了源数据库的控制文件后,无法实施数据恢复工作,因为备份文件无法获取。
# 例如: ./RmanRestore.sh 1 orcl /opt/ora10g/backup 4241560514 2
# 执行方式:(1)以oracle用户身份登录linux后手工执行
# (2)以oracle用户身份自动执行的crontab任务
#
# 版本修订说明:
# 一、版本0.9 刘建 2010.01.22
# 1、 简化备份流程的复杂度,去除RmanConfig模块。
# 2、 忽略归档日志的备份。
# 3、 加入交叉检查、自动删除无效备份文件的功能。
# 4、 加入了对工作记录log文件所在目录的自动创建功能,不需人工干预。
# 5、 优化恢复程序,避免常见的ORA-600和ORA-01152错误。
#
# 二、版本1.0 刘建 2010.01.27
# 1、 增加了对当前数据库是否启用“归档模式”的自动检查,未开启则提示该信息并中断本次任务。
# 2、 增加对单机存在多个数据库实例的支持,备份与恢复脚本都增加了{ORACLE_SID}参数。
# 3、 为更加明晰的标识存放于备份区的的备份文件是属于“全备份”还是“增量备份”,
# 修改了备份脚本,使得“全备份”和“增量备份”的备份片文件名特征不同。
# 2010.01.28 增加
# 4、 补充了对【目标数据库服务器】块跟踪日志文件存放路径的自动检测和创建工作代码,否则该目录不存在时,“恢复”会提示错误。
# 5、 改变了对控制文件和SPFILE自动备份的触发方式,
# 由原先的RMAN的CONFIG定制改为每次backup database命令时连带INCLUDE CURRENT CONTROLFILE命令执行。
##########################################################################################################################

if [ $# -lt 5 ]
then
echo "==============================================================================================="
echo "请详细核对命令行中需要设置的5个参数是否完整:"
echo "RmanRestore.sh 恢复模式 ORACLE_SID 备份文件的“共享存放区”访问路径 源数据库的dbid 恢复进程的并行度"
echo " 主数据库的dbid可通过以下SQL语句获取:"
echo " select dbid from v$database; "
echo "==============================================================================================="
exit 1
fi

BACKUPDEST=$3
if [ ! -f $BACKUPDEST/NEW.CTL ]
then
echo "======================================================================="
echo "请详细核对备份文件的“共享存放区”访问路径参数是否正确:"
echo "NEW.CTL在当前文件夹不存在!"
echo "======================================================================="
exit 1
fi

#执行变量
source $HOME/.bash_profile
TEE=/usr/bin/tee
RMAN=$ORACLE_HOME/bin/rman
SQLPLUS=$ORACLE_HOME/bin/sqlplus

export ORACLE_SID=$2

#执行日志文件(默认在/home/oracle目录下,今后可手工修改)
if [ ! -d $ORACLE_BASE/BackupLogs ]
then
mkdir $ORACLE_BASE/BackupLogs
fi
LOGFILE=$ORACLE_BASE/BackupLogs/RmanRestore_`date +%Y%m%d`.log

#检查数据库是否已经处于“归档模式”下
$SQLPLUS "/ as sysdba" <spool AL.log
SELECT LOG_MODE FROM V$DATABASE;
spool off
EXIT
EOF

STATUS=`grep -i "NOARCHIVELOG" AL.log|wc -l`
if [ $STATUS -eq 1 ]
then
echo "当前ORACLE数据库未运行在“归档模式”下,不能进行联机恢复,请完善相关配置!"
exit 1
fi

#设置块跟踪日志文件存放路径
if [ ! -d $ORACLE_BASE/Rman ]
then
mkdir $ORACLE_BASE/Rman
fi

#数据库的恢复工作
if [ $1 -eq 0 ]
then
$RMAN <CONNECT TARGET

SHUTDOWN IMMEDIATE;
STARTUP NOMOUNT;
#强制目标数据库的dbid和源数据库相同
SET DBID=$4;
#之后应用源数据库最新的控制文件
RESTORE CONTROLFILE FROM '$BACKUPDEST/NEW.CTL';
ALTER DATABASE MOUNT;

#恢复进程的并行度(要和CPU核数、磁盘实际的吞吐能力匹配)
CONFIGURE DEVICE TYPE DISK PARALLELISM $5;
#"全量恢复"模式,使用最近的0级备份来整体恢复数据库
RESTORE DATABASE;
#应该在rman下recover,而不应该在sqlplus恢复
#这样recover database的过程中,会优先应用1级增量备份集而不是ArchiveLog
#下面的命令将强制只使用增量备份来恢复
RECOVER DATABASE noredo;
EXIT;
EOF
$SQLPLUS "/ as sysdba" <--因为在备份过程中,某些数据文件可能仍然被修改(其SCN比最后备份的控制文件中记录的SCN要小)
--为忽略今后open“目标数据库”可能会发生的ORA-01152错误,必要时启用此参数
ALTER SYSTEM SET "_ALLOW_RESETLOGS_CORRUPTION"=TRUE SCOPE=SPFILE;
STARTUP FORCE MOUNT;
--若两机数据库系统环境产生偏差,更可能产生严重的ORA-600错误,所以也不建议每次都OPEN RESETLOGS(仅在必要时)
--而且【目标数据库】在正常方式(非READ ONLY)OPEN打开之后,为保证恢复任务的无错完成,不建议下次进行“增量恢复”,或者在“增量恢复”失败后做一次“全量恢复”。
ALTER DATABASE OPEN RESETLOGS;
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE OPEN READ ONLY;
EXIT;
EOF
else
$RMAN <CONNECT TARGET

SHUTDOWN IMMEDIATE;
STARTUP NOMOUNT;

SET DBID=$4;
RESTORE CONTROLFILE FROM '$BACKUPDEST/NEW.CTL';
ALTER DATABASE MOUNT;

CONFIGURE DEVICE TYPE DISK PARALLELISM $5;
#"增量恢复"模式,需跳过restore database这一步,直接recover
RECOVER DATABASE noredo;
EXIT;
EOF
$SQLPLUS "/ as sysdba" <ALTER SYSTEM SET "_ALLOW_RESETLOGS_CORRUPTION"=TRUE SCOPE=SPFILE;
STARTUP FORCE MOUNT;
ALTER DATABASE OPEN RESETLOGS;
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE OPEN READ ONLY;
EXIT;
EOF
fi

[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12180666/viewspace-1036518/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/12180666/viewspace-1036518/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值