【芸香阁】veritas SHELL脚本范例
SHELL脚本范例
Netbackup的备份会用到shell脚本,例如oracle和sap的数据备份,不仅这样,有很多复杂或罗嗦的操作都可以通过shell脚本简单的执行,结合cron和at还可以实现无人职守的自动执行操作。
这里我们只对shell内容中实现的功能做介绍,并不深入讨论shell编程的具体实现,这就需要读者有一定的shell编程基础。
用于备份oracle数据库的shell脚本
#!/usr/bin/sh
#---------------------------------------------------------------------------
//取得当前用户名称
CUSER=`id |cut -d"(" -f2 | cut -d ")" -f1` //删除旧log文件
RMAN_LOG_FILE=${0}.out
if [ -f "$RMAN_LOG_FILE" ]
then
rm -f "$RMAN_LOG_FILE" fi
echo >> $RMAN_LOG_FILE
chmod 666 $RMAN_LOG_FILE
echo Script $0 >> $RMAN_LOG_FILE echo ==== started on `date` ==== >> $RMAN_LOG_FILE
echo >> $RMAN_LOG_FILE
//定义变量
ORACLE_HOME=/export/oracle/product ORACLE_SID=PROD
ORACLE_USER=oracle
TARGET_CONNECT_STR=sys/change_on_install
RMAN=$ORACLE_HOME/bin/rman NB_SYS_POLICY=oracle_control_file
CTL_PATH=/export/home2/backup CTL_NAME=ctl_"$ORACLE_SID"_`date +'%Y%m%d'`.bak
echo >> $RMAN_LOG_FILE
//定义需要注册的环境变量
ORA_ENV="
ORACLE_HOME=$ORACLE_HOME export ORACLE_HOME
ORACLE_SID=$ORACLE_SID
export ORACLE_SID
NB_ORA_SERV=bk1
export NB_ORA_SERV
NB_ORA_POLICY=v880_ora_PROD_online export NB_ORA_POLICY
"
//判断并指定备份方式:完全、增量等 if [ "$NB_ORA_FULL" = "1" ]
then
echo "Full backup requested" >> $RMAN_LOG_FILE
BACKUP_TYPE="INCREMENTAL LEVEL=0"
elif [ "$NB_ORA_INCR" = "1" ]
then
echo "Differential incremental backup requested" >> $RMAN_LOG_FILE
BACKUP_TYPE="INCREMENTAL LEVEL=1"
elif [ "$NB_ORA_CINC" = "1" ]
then
echo "Cumulative incremental backup requested" >> $RMAN_LOG_FILE
BACKUP_TYPE="INCREMENTAL LEVEL=1 CUMULATIVE"
elif [ "$BACKUP_TYPE" = "" ]
then
echo "Default - Full backup requested" >> $RMAN_LOG_FILE
BACKUP_TYPE="INCREMENTAL LEVEL=0" fi
# --------------------------------------------------------------------------- //定义利用RMAN备份Oracle的命令
CMD_STR="
$ORA_ENV
$RMAN target $TARGET_CONNECT_STR nocatalog << EOF RUN {
# backup database
ALLOCATE CHANNEL ch00 TYPE 'SBT_TAPE'; BACKUP
$BACKUP_TYPE
SKIP INACCESSIBLE
TAG hot_db_bk_level0
FILESPERSET 20
# recommended format
FORMAT 'bk_%s_%p_%t'
DATABASE;
sql 'alter system archive log current';
RELEASE CHANNEL ch00;
# backup all archive logs
ALLOCATE CHANNEL ch00 TYPE 'SBT_TAPE'; ALLOCATE CHANNEL ch01 TYPE 'SBT_TAPE'; BACKUP
filesperset 100
FORMAT 'al_%s_%p_%t'
ARCHIVELOG ALL;
RELEASE CHANNEL ch00;
RELEASE CHANNEL ch01;
# backup control file
ALLOCATE CHANNEL ch00 TYPE 'SBT_TAPE'; BACKUP
# recommended format
FORMAT 'cntrl_%s_%p_%t'
CURRENT CONTROLFILE;
RELEASE CHANNEL ch00;
}
EOF
"
//执行定义的命令
# Initiate the command string
if [ "$CUSER" = "root" ]
then
su - $ORACLE_USER -c "$CMD_STR" >> $RMAN_LOG_FILE
RSTAT=$?
else
/usr/bin/sh -c "$CMD_STR" >> $RMAN_LOG_FILE
RSTAT=$?
fi
//判断命令执行的结果
if [ "$RSTAT" = "0" ]
then
echo ""
else
exit $RSTAT
fi
# ---------------------------------------------------------------------------
//定义备份control file的命令
# make second copy of control file CMD_STR="
sqlplus /nolog << EOF
conn /as sysdba
alter database backup controlfile to '$CTL_PATH/control.bak';
EOF
mv $CTL_PATH/control.bak $CTL_PATH/$CTL_NAME
/usr/openv/netbackup/bin/bpbackup -p $NB_SYS_POLICY $CTL_PATH/$CTL_NAME
"
//执行定义的命令
# Initiate the command string
if [ "$CUSER" = "root" ]
then
su - $ORACLE_USER -c "$CMD_STR" >> $RMAN_LOG_FILE
RSTAT=$?
else
/usr/bin/sh -c "$CMD_STR" >> $RMAN_LOG_FILE
RSTAT=$?
fi
//判断命令执行的结果
if [ "$RSTAT" = "0" ]
then
LOGMSG="ended successfully"
else
LOGMSG="ended in error"
exit $RSTAT
fi
echo >> $RMAN_LOG_FILE
echo Script $0 >> $RMAN_LOG_FILE echo ==== $LOGMSG on `date` ==== >> $RMAN_LOG_FILE
echo >> $RMAN_LOG_FILE
exit $RSTAT
备份oracle的shell脚本最关键的部分在于环境变量的注册和rman命令的使
用。
用于恢复Oracle数据库的shell脚本
#!/usr/bin/sh
# ---------------------------------------------------------------------------
//取得当前用户名称
CUSER=`id |cut -d"(" -f2 | cut -d ")" -f1` //删除旧log文件
RMAN_LOG_FILE=${0}.out
if [ -f "$RMAN_LOG_FILE" ]
then
rm -f "$RMAN_LOG_FILE" fi
echo >> $RMAN_LOG_FILE
chmod 666 $RMAN_LOG_FILE
echo Script $0 >> $RMAN_LOG_FILE echo ==== started on `date` ==== >> $RMAN_LOG_FILE
echo >> $RMAN_LOG_FILE
//定义变量
ORACLE_HOME=/export/oracle/product ORACLE_SID=PROD
ORACLE_USER=oracle
TARGET_CONNECT_STR=sys/change_on_install
RMAN=$ORACLE_HOME/bin/rman NB_SYS_POLICY=oracle_control_file
CTL_PATH=/export/home2/backup CTL_NAME=ctl_"$ORACLE_SID"_`date +'%Y%m%d'`.bak
echo >> $RMAN_LOG_FILE
//定义需要注册的环境变量
ORA_ENV="
ORACLE_HOME=$ORACLE_HOME export ORACLE_HOME
ORACLE_SID=$ORACLE_SID
export ORACLE_SID
NB_ORA_SERV=bk1
export NB_ORA_SERV
NB_ORA_POLICY=v880_ora_PROD_online export NB_ORA_POLICY
"
if [ "$NB_ORA_FULL" = "1" ]
then
echo "Full backup requested" >> $RMAN_LOG_FILE
BACKUP_TYPE="INCREMENTAL LEVEL=0"
elif [ "$NB_ORA_INCR" = "1" ]
then
echo "Differential incremental backup requested" >> $RMAN_LOG_FILE
BACKUP_TYPE="INCREMENTAL LEVEL=1"
elif [ "$NB_ORA_CINC" = "1" ]
then
echo "Cumulative incremental backup requested" >> $RMAN_LOG_FILE
BACKUP_TYPE="INCREMENTAL LEVEL=1 CUMULATIVE"
elif [ "$BACKUP_TYPE" = "" ]
then
echo "Default - Full backup requested" >> $RMAN_LOG_FILE
BACKUP_TYPE="INCREMENTAL LEVEL=0" fi
# --------------------------------------------------------------------------- //定义用RMAN恢复数据库的命令
CMD_STR="
$ORA_ENV
$RMAN target $TARGET_CONNECT_STR nocatalog << EOF RUN {
# backup database
ALLOCATE CHANNEL ch00 TYPE 'SBT_TAPE';
RESTORE
DATABASE;
//如果需要恢复归档日志,则使用命令
RESTORE ARCHIVELOG ALL;
RELEASE CHANNEL ch00;
}
EOF
"
//执行定义的命令
# Initiate the command string
if [ "$CUSER" = "root" ]
then
su - $ORACLE_USER -c "$CMD_STR" >> $RMAN_LOG_FILE
RSTAT=$?
else
/usr/bin/sh -c "$CMD_STR" >> $RMAN_LOG_FILE
RSTAT=$?
fi
//判断命令执行的结果
if [ "$RSTAT" = "0" ]
then
LOGMSG="ended successfully" else
LOGMSG="ended in error"
exit $RSTAT
fi
echo >> $RMAN_LOG_FILE
echo Script $0 >> $RMAN_LOG_FILE echo ==== $LOGMSG on `date` ==== >> $RMAN_LOG_FILE
echo >> $RMAN_LOG_FILE
exit $RSTAT
恢复用的shell脚本可以根据备份的脚本改造得来,主要是将命令定义部分
改为恢复命令。
用于备份SAP数据库的shell脚本 #!/bin/sh
//定义变量
ORACLE_BASE=/oracle
ORACLE_SID=PRD
ORACLE_HOME=$ORACLE_BASE/$ORACLE_SID/920_64 SAP_SERVER=bk1
SAP_POLICY=sapr3db_sap_PRD_online
RSTAT=0
# SAP_ENV - Holds environmental variables.
//定义需要注册的环境变量
SAP_ENV="
setenv SAP_SERVER $SAP_SERVER
setenv SAP_POLICY $SAP_POLICY
setenv SAP_DRIVES 2
setenv ORACLE_HOME $ORACLE_HOME
setenv ORACLE_SID $ORACLE_SID
"
//定义备份命令,通过命令可以执行不同类型的备份:离线、在线、 CMD_LINE="
$SAP_ENV
brbackup -c -u / -d util_file -t online -m all -p initNBU.sap "
//执行定义的命令
#echo "Execute $CMD_LINE"
su - oraprd -c "$CMD_LINE"
RSTAT=$?
exit $RSTAT
这里执行的命令是用于在线备份的命令,如果需要执行离线备份就需要使用
命令
brbackup -c -u / -d util_file -t offline_force -m all -p initNBU.sap
如果是执行archivelog备份的话,需要执行以下命令 brarchive -c -u / -d util_file -cds -p initNBU.sap
用于恢复SAP数据库的shell脚本
#!/bin/sh
//定义变量
ORACLE_BASE=/oracle
ORACLE_SID=PRD
ORACLE_HOME=$ORACLE_BASE/$ORACLE_SID/920_64
SAP_SERVER=bk1
SAP_POLICY=sapr3db_sap_PRD_online RSTAT=0
# SAP_ENV - Holds environmental variables. //定义需要注册的环境变量
SAP_ENV="
setenv SAP_SERVER $SAP_SERVER setenv SAP_POLICY $SAP_POLICY setenv SAP_DRIVES 2
setenv ORACLE_HOME $ORACLE_HOME setenv ORACLE_SID $ORACLE_SID "
//定义用于恢复的命令
CMD_LINE="
$SAP_ENV
brrestore -u / -d util_file -m all -p initNBU.sap "
//执行定义的命令
#echo "Execute $CMD_LINE"
su - oraprd -c "$CMD_LINE"
RSTAT=$?
exit $RSTAT
用于备份netbackup catalog的脚本 #!/usr/bin/sh
//定义变量
# environment
BAK_PATH=/export/home/backup
BAK_LOG=bak_cat.log
//判断并定义月份和日期
DET_MON=`date +'%m' | cut -c1`
if [ "$DET_MON" = "0" ]
then
CUR_MON=`date +'%m' | cut -f2 -d0`
else
CUR_MON=`date +'%m'`
fi
OLD_MON=`echo "$CUR_MON"-1 | bc`
CUR_DATE=`date +'%Y%m%d'`
if [ "$DET_MON" = "0" ]
then
OLD_DATE=`date +'%Y'`0"$OLD_MON"`date +'%d'` else
OLD_DATE=`date +'%Y'`"$OLD_MON"`date +'%d'` fi
SERVER=bk1
TARSTAT=0
FTPSTAT=0
RMSTAT=0
echo $OLD_DATE
echo "--------Log Start--------" >> $BAK_PATH/$BAK_LOG echo "" >> $BAK_PATH/$BAK_LOG
//将catalog数据打包
# make backup of catalog
echo "`date +'%Y/%m/%d %H:%M:%S'" >> $BAK_PATH/$BAK_LOG
echo " make new backup of catalog" >> $BAK_PATH/$BAK_LOG
for i in 1 2
do
CMD="tar cf $BAK_PATH/ca_"$SERVER"_"$CUR_DATE"_"$i".tar
$BAK_PATH/catalog"$i""
tar cf $BAK_PATH/ca_"$SERVER"_"$CUR_DATE"_"$i".tar $BAK_PATH/catalog"$i"
TARSTAT=`echo $TARSTAT+$? | bc`
echo "`date +'%Y/%m/%d %H:%M:%S'" >> $BAK_PATH/$BAK_LOG
echo " $CMD" >> $BAK_PATH/$BAK_LOG
if [ "$TARSTAT" = "0" ]
then
echo " sucessful" >> $BAK_PATH/$BAK_LOG
else
echo "fail" >> $BAK_PATH/$BAK_LOG
fi
echo "" >> $BAK_PATH/$BAK_LOG done
//将tar包ftp到bk2上
# ftp backup to server bk2
if [ "$TARSTAT" = "0" ]
then
echo "`date +'%Y/%m/%d %H:%M:%S'" >> $BAK_PATH/$BAK_LOG
echo " ftp new backup of catalog to server bk2" >> $BAK_PATH/$BAK_LOG
else
exit $TARSTAT
fi
for i in 1 2
do
ftp -n bk2 << EOF >> $BAK_PATH/$BAK_LOG
user any any
lcd $BAK_PATH
bin
put ca_"$SERVER"_"$CUR_DATE"_"$i".tar
bye
EOF
FTPSTAT=`echo $FTPSTAT+$? | bc` done
# delete expired backup of catalog
//删除旧的tar包
if [ "$FTPSTAT" = "0" ]
then
echo " sucessful" >> $BAK_PATH/$BAK_LOG
echo "" >> $BAK_PATH/$BAK_LOG
echo "`date +'%Y/%m/%d %H:%M:%S'" >> $BAK_PATH/$BAK_LOG
echo " delete expired backup of catalog" >> $BAK_PATH/$BAK_LOG
else
exit $FTPSTAT
fi
for i in 1 2
do
CMD="rm $BAK_PATH/ca_"$SERVER"_"$OLD_DATE"_"$i".tar"
rm $BAK_PATH/ca_"$SERVER"_"$OLD_DATE"_"$i".tar
RMSTAT=`echo $TARSTAT+$? | bc`
echo "`date +'%Y/%m/%d %H:%M:%S'" >> $BAK_PATH/$BAK_LOG
echo " $CMD" >> $BAK_PATH/$BAK_LOG
if [ "$RMSTAT" = "0" ]
then
echo " sucessful" >> $BAK_PATH/$BAK_LOG
elif [ "$RMSTAT" = "2" ]
then
echo "file not exist" >> $BAK_PATH/$BAK_LOG
RMSTAT=0
else
echo "fail" >> $BAK_PATH/$BAK_LOG
fi
echo "" >> $BAK_PATH/$BAK_LOG
done
echo "--------Log Stop--------" >> $BAK_PATH/$BAK_LOG echo ""
RSTAT=`echo $TARSTAT+$FTPSTAT+$RMSTAT | bc` exit $RSTAT
这个脚本可以使用cron定义每天执行,这样就保证catalog的备份在异地也
有备份,并且及时删除一个月钱的就备份。
用于netbackup duplicate的shell脚本
在介绍脚本之前介绍以下脚本用到的资源文件policy_list
# backup policy list
# netbackup duplicate script uses this list
# type sample
# FS = File system
# ORA = Oracle
# CTL = Oracle Control File
# SAP = SAP
# ARC = SAP Archive Log
# NULL = None
//type是标记关键字来区分不同备份类型
//policy_name是策略的名字
//schedule是使用数字标记复制需要执行的日期(星期) # type policy_name schedule
*FS* DNS-A_fs_sys #5
*FS* HS-DB01_fs_sys #2
*ORA* HS-DB01_ora_b2c_online #0#1#2#3#4#5#6 *FS* HS-Web01_fs_sys #2
*FS* ERPDB_fs_sys #1
*ORA* ERPDB_ora_erpdb_online #0#1#2#3#4#5#6 *FS* hscc1_fs_sys #3
*ORA* hscc1_ora_hsccs_online #0#1#2#3#4#5#6 *CTL* oracle_control_file #0#1#2#3#4#5#6 *FS* qingdao_fs_sys #3
*ORA* qingdao_ora_hscrm_online #0#1#2#3#4#5#6 *FS* SALESDB_fs_sys #1
*NULL* SALESDB_ora_salesdb_offline #0#1#2#3#4#5#6 *FS* sapr3ci_fs_sys #4
*FS* sapr3db_fs_sys #0
*SAP* sapr3db_sap_PRD_offline #0
*SAP* sapr3db_sap_PRD_online #1#2#3#4#5#6 *ARC* sapr3db_sap_archive *
*FS* sapr3dev_fs_sys #0
*SAP* sapr3dev_sap_DEV_offline #0
*SAP* sapr3dev_sap_DEV_online #1#2#3#4#5#6 *ARC* sapr3dev_sap_archive *
*FS* sapr3qas_fs_sys #4
*SAP* sapr3qas_sap_QAS_offline #0
*FS* v880_fs_sys #5
*ORA* v880_ora_PROD_online #0#1#2#3#4#5#6
这个资源文件在shell脚本执行是被读取。
#!/bin/sh
//定义变量
LANG=en
export LANG
CUR_WEEK=`date | awk {'print $1'}`
DUP=/opt/openv/netbackup/bin/admincmd/bpduplicate
//判断当天是星期几,并定义对应的关键字
case "$CUR_WEEK"
in
Sun) KEY_WORD=#0;;
Mon) KEY_WORD=#1;;
Tue) KEY_WORD=#2;;
Wed) KEY_WORD=#3;;
Thu) KEY_WORD=#4;;
Fri) KEY_WORD=#5;;
Sat) KEY_WORD=#6;;
esac
//针对不同类型的备份数据分别进行duplicate
cat /scripts/policy_list | grep $KEY_WORD | grep *ORA* | awk {'print $2'} | xargs -n 1 -I {} $DUP -dstunit bk2-hcart2-robot-tld-1 -dp HuangDao_oracle -policy {} -hoursago 24 -number_copies 1 -rl 0
cat /scripts/policy_list | grep $KEY_WORD | grep *CTL* | awk {'print $2'} | xargs -n 1 -I {} $DUP -dstunit bk2-hcart2-robot-tld-1 -dp control_file_3 -policy {} -hoursago 24 -number_copies 1 -rl 0
cat /scripts/policy_list | grep $KEY_WORD | grep *SAP* | awk {'print $2'} | xargs -n 1 -I {} $DUP -dstunit bk2-hcart2-robot-tld-1 -dp HuangDao_sap_on -policy {} -hoursago 24 -number_copies 1 -rl 0
cat /scripts/policy_list | grep $KEY_WORD | grep *FS* | awk {'print $2'} | xargs -n 1 -I {} $DUP -dstunit bk2-hcart2-robot-tld-1 -dp HuangDao_file_system -policy {} -hoursago 24 -number_copies 1 -rl 0
cat /scripts/policy_list | grep $KEY_WORD | grep *OFF* | awk {'print $2'} | xargs -n 1 -I {} $DUP -dstunit bk2-hcart2-robot-tld-1 -dp HuangDao_sap_off -policy {} -hoursago 24 -number_copies 1 -rl 0
可以使用此脚本对备份数据统一进行复制,也可以添加到crontab里自动执行。关于bpduplicate命令的详细用法可以参考本文关于维护的章节或“VERITAS NetBackup 5.1 Commands for UNIX”( 268116_cmd.pdf)。
本文档为【【芸香阁】veritas SHELL脚本范例】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。