分享
 
 
 

ORACLE自动备份并且自动FTP到备份机的SHELL脚本

王朝oracle·作者佚名  2008-05-18
窄屏简体版  字體: |||超大  

本次上传的脚本有很多可以改进的地方!这也是本人第一次在网上发帖,SH写的不好的地方

不要见笑!!!!!!本SH以在SCO OPENSERVER 505(ORACLE 7.3.2)和IBM RS6000 AIX 4.3(ORACLE 8.1.6)调试通过!!如果要转载,请加上出处!!!谢谢!!!详细功能见脚本文件SH的批注!!!如果能要加上自动执行的功能请使用crontab配置即可!!!!

第一个文件:INIT.TXT这是脚本INI初始化文件:

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

#This is a system ini file :

# CopyRight By WangZuXiang 2002

# the '#' is ingnor :

#the format style is xxxx=value

#

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

#Oracle cionfig

[oracle]

username=ydyx

password=ydyx

con_alias=MISDB

#the main machine config

[mainhost]

myhost_ip=10.232.193.2

myhost_username=oracle

myhost_password=oracle

dump_dir=/u2/oracleback

#the backup machine config

[backuphost]

backhost_ip=10.232.193.5

backhost_username=oracle

backhost_password=oracleydyx

backup_dir=/u2/oracleshaoshanback

#delete the dump file x days ago?!!!

[deletedumpfile]

delete_days=2

#the Oracle database's back method

#如果start_tactic=Y 则采用策略备份,否则按每天完全到出

#如果采用策略备份,则必须给SYSTEM用户的口令

[backmethod]

start_tactic=N

system_password=manager11

#the recode the system execute's log!

[systemlog]

sys_log=/home/oracle/wzx/x.log

#end

第二个文件:主程序文件:MY.SH:

#!/bin/sh

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

#

#Get the all ini file config

#CopyRight By WangZuXiang 2002-2005?

#版权所有(C) 2002-2005? WangZuXiang .

#All Rights Reserved.

#program date 2002-10-22

#usage: main

#This script is used to start oracle dump database .

#It should ONLY be executed as part of the crontabs.

#function content is:

#1:自动检查是否能连上Oracle!

#2:通过初始化文本来解析各种需要的参数!

#3:自动完全到出ORACLE数据库(每天)!,以后将增加相关的增量备份等!

#4:自动删除配置文件中规定的前X天的备份文件!

#5:自动将到出文件打包并转存到其他的备份机器上!

#6:自动记录程序执行过程中的所有日期信息!

#if you find some bugs please send it to my mailpost :

#e-mail:wzxherry@sina.com !

#new function:增加了对ORACLE数据库备份策略的方法!2002-10-31

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

mypwd=`pwd`

inifile=/home/oracle/wzx/init.txt

oratab=/etc/oratab

TEMP=temp.$$

DUMP_FILE=`date +'%Y%m%d`

initme ()

{

#read from the config file 'ini.txt'

#oracle config

USERNAME=`cat ${inifile:-"init.txt"} | grep -i '^username' | awk -F = '{print $2}'`

PASSWORD=`cat ${inifile:-"init.txt"} | grep -i '^password' | awk -F = '{print $2}'`

MY_ALIAS=`cat ${inifile:-"init.txt"} | grep -i '^con_alias' | awk -F = '{print $2}'`

#the main host config

MYHOST_IP=`cat ${inifile:-"init.txt"} | grep -i '^myhost_ip' | awk -F = '{print $2}'`

MYHOST_USERNAME=`cat ${inifile:-"init.txt"} | grep -i '^myhost_username' | awk -F = '{print $2}'`

MYHOST_PASSWORD=`cat ${inifile:-"init.txt"} | grep -i '^myhost_password' | awk -F = '{print $2}'`

DUMP_DIR=`cat ${inifile:-"init.txt"} | grep -i '^dump_dir' | awk -F = '{print $2}'`

#the backup host config

BACKHOST_IP=`cat ${inifile:-"init.txt"} | grep -i '^backhost_ip' | awk -F = '{print $2}'`

BACKHOST_USERNAME=`cat ${inifile:-"init.txt"} | grep -i '^backhost_username' | awk -F = '{print $2}'`

BACKHOST_PASSWORD=`cat ${inifile:-"init.txt"} | grep -i '^backhost_password' | awk -F = '{print $2}'`

BACKUP_DIR=`cat ${inifile:-"init.txt"} | grep -i '^backup_dir' | awk -F = '{print $2}'`

#the define's delete dump file days!

DAYS=`cat ${inifile:-"init.txt"} | grep -i '^delete_days' | awk -F = '{print $2}'`

#to get the system log

LOGS=`cat ${inifile:-"init.txt"} | grep -i '^sys_log' | awk -F = '{print $2}'`

TACTIC=`cat ${inifile:-"init.txt"} | grep -i '^start_tactic' | awk -F = '{print $2}'`

SYSTEMPASS=`cat ${inifile:-"init.txt"} | grep -i '^system_password' | awk -F = '{print $2}'`

#read the config file end.

}

#WHOAMI=`id | awk '/uid=[0-9]*(oracle)/ {print $1}'`

#WHOAMI=`id | awk '{print $1}' | sed 's/uid=[0-9]*(.*).*/1/'`

WHOAMI=`id | sed 's/uid=[0-9]*(.*) gid.*/1/'`

#if test "$WHOAMI" = "" ; then

if test "$WHOAMI" != "(oracle)" ; then

echo "

"

echo "=============================================================="

echo "=========you must use oracle user to run this script!========="

echo "=============================================================="

echo "

"

exit 0

fi

#run the init parameter

test ! -e $inifile && echo "not find the init file:"$inifile"!" && exit 0

initme

if [ -z $LOGS ]; then

echo "<<can not to find the define of system log...!!!>>"

fi

#LOG = ${LOGS:-"x.log"}

LOGME="tee -a ${LOGS:-"x.log"}"

if [ -e $LOGS -a -f $LOGS ]; then

if test ! -w $LOGS; then

echo "<<the log file:"$LOGS" can not to write!....................>>"

exit

fi

fi

echo "

" | $LOGME

echo "-----------------------------------------------------------------" | $LOGME

echo "<<system now is initing ..............!>>" | $LOGME

#check the parameter value

if [ -z $USERNAME ]; then

echo "<<the oracle database's username is null..............!>>" | $LOGME

exit 1

fi

if [ -z $PASSWORD ]; then

echo "<<the oracle database's password is null..............!>>" | $LOGME

exit 2

fi

if [ -z $MY_ALIAS ]; then

echo "<the oracle connect alias is null!..............>>" | $LOGME

exit 0

fi

if [ -z $MYHOST_IP ]; then

echo "<<the oracle's host ip is null..............!>>" | $LOGME

exit 3

fi

if [ ! -d $DUMP_DIR ]; then

echo "<the oracle's dump dir is not exist..............!>>" | $LOGME

exit 0

fi

if [ -z $MYHOST_USERNAME ]; then

echo "<<then oracle host username is null..............!>>" | $LOGME

exit 4

fi

if [ -z $MYHOST_PASSWORD ]; then

echo "<<the oracle host password is null..............!>>" | $LOGME

exit 5

fi

if [ -z $BACKHOST_IP ]; then

echo "<<the backup host's ip is null..............!>>" | $LOGME

exit 6

fi

if [ -z $BACKHOST_USERNAME ]; then

echo "<<the backup host's uesername is null..............!>>" | $LOGME

exit 7

fi

if [ -z $BACKHOST_PASSWORD ]; then

echo "<<the backup host's password is null..............!>>" | $LOGME

exit 8

fi

if [ -z $BACKUP_DIR ]; then

echo "<<the backup host's backup dir is null..............!>>" | $LOGME

exit 9

fi

#elif [ ! -e $BACKUP_DIR -o ! -d $BACKUP_DIR ]; then

#echo "<<the backup dir "$BACKUP_DIR" is not exist or is not directory..............!>>" | $LOGME

#exit 0

#fi

#if [ ! -O $BACKUP_DIR ]; then

#echo "<<the backup host's backup dir is not owner to oracle..............!>>" | $LOGME

#exit 0

#fi

if [ -z $DAYS ]; then

echo "<<the delete file define days is null so not to delete...............!>>" | $LOGME

fi

if test $TACTIC = "Y" ; then

if test -z $SYSTEMPASS ; then

echo "<<if you use TACTIC back,then you must give the oracle system password!...............!>>" | $LOGME

exit 0

fi

fi

if test $? -eq 0 ; then

echo "<<system init is OK............................!>>" | $LOGME

fi

#check end.

#

#main

#

if [ ! -f $oratab -o ! -e $oratab ]; then

echo "<<the oracle define's oratab file is not normal file or is not exist..............!>>" | $LOGME

exit 0

fi

ORACLE_SID=`cat $oratab | grep -v "^#" | grep "Y$" | awk -F : '{print $1}' `

if [ -z $ORACLE_SID ]; then

echo "<<the ORACLE_SID is not find ..............!>>" | $LOGME

exit -1

fi

export ORACLE_SID

ORACLE_HOME=`cat $oratab | grep -v "^#" | grep "Y$" | awk -F : '{print $2}' `

if [ ! -d $ORACLE_HOME ]; then

echo "the oracle's home directory "$ORACLE_HOME" is not exist..............!>>" | $LOGME

exit -1

fi

export ORACLE_HOME

PATH=$PATH:$ORACLE_HOME/bin:/usr/lib:/bin:$HOME/bin:.

ORACLE_BASE=/u1/app/oracle

export ORACLE_BASE

ORACLE_SID=misdb

export ORACLE_SID

ORACLE_HOME=$ORACLE_BASE/product/8.1.6

export ORACLE_HOME

PATH=$PATH:$ORACLE_HOME/bin

export PATH

LIBPATH=$LIBPATH:$ORACLE_HOME/lib

export LIBPATH

ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data

export ORA_NLS33

export PATH

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

## begin to dump the database

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

#trying to connect oracle .....

if [ -e $TEMP ]; then

rm -f $TEMP

if [ ! $? -eq 0 ]; then

echo "<<delete the file: "$TEMP" is fail..............!!!!>>" | $LOGME

exit -1

fi

fi

if [ -x $ORACLE_HOME/bin/tnsping ]; then

#$ORACLE_HOME/bin/tnsping $MY_ALIAS > $TEMP

tnsping $MY_ALIAS > $TEMP

ME=`cat $TEMP | grep "OK" | awk '{print $1}'`

if [ "$ME" != "OK" ]; then

echo "<<can not to connect oracle by tnsping:"$MY_ALIAS"..............!>>" | $LOGME

rm -f $TEMP

exit $?

else

echo "<<connect oracle is ok!...............................!>>" | $LOGME

fi

fi

rm -f $TEMP

if [ -x $ORACLE_HOME/bin/exp ]; then

#MY_ALIAS

#cd $ORACLE_HOME/bin

#if [ ! $? -eq 0 ]; then

#echo "error

"

#exit 0

#fi

trap "" 1 2 3 15

#如果不用策略备份,则采用倒用户的方式,到出!!!!

#echo $TACTIC

#

#if [ "$TACTIC" = "Y" ]; then

#if [ -x $ORACLE_HOME/bin/svrmgrl ]; then

#svrmgrl <<EOF

#connect $USERNAME/$SYSTEMPASS@$MY_ALIAS

#exit

#EOF

#if test $? -ne 0 ; then

#echo "<<SYSTEM user password is error!.................>>" | $LOGME

#exit $?

#fi

#fi

#fi

#

if [ "$TACTIC" != "Y" -o "$TACTIC" != "y" ]; then

echo "<<系统将按倒出用户方式进行!..............................>>" | $LOGME

$ORACLE_HOME/bin/exp $USERNAME/$PASSWORD@$MY_ALIAS buffer=40960 file=$DUMP_DIR/$DUMP_FILE.dmp owner=$USERNAME grants=Y rows=Y compress=Y indexes=Y log=$DUMP_DIR/$DUMP_FILE.log

#采用策略备份,则对整个数据库进行策略备份!

else

echo "<<系统将按策略备份用户方式进行!..............................>>" | $LOGME

MYWEEK=`date | awk '{print $1}'`

case $MYWEEK in

#星期一完全导出

Mon)exp system/$SYSTEMPASS@$MY_ALIAS inctype=complete buffer=40960 file=$DUMP_DIR/$DUMP_FILE.dmp grants=Y rows=Y compress=Y indexes=Y log=$DUMP_DIR/$DUMP_FILE.log

echo "<<Mon is complete dump the db,file:"$DUMP_FILE.dmp"...............!>>" | $LOGME

;;

#星期二增量导出

Tue)exp system/$SYSTEMPASS@$MY_ALIAS inctype=incremental buffer=40960 file=$DUMP_DIR/$DUMP_FILE.dmp grants=Y rows=Y compress=Y indexes=Y log=$DUMP_DIR/$DUMP_FILE.log

echo "<<Tue is incremental dump the db,file:"$DUMP_FILE.dmp"...............!>>" | $LOGME

;;

#星期三增量导出

Wed)exp system/$SYSTEMPASS@$MY_ALIAS inctype=incremental buffer=40960 file=$DUMP_DIR/$DUMP_FILE.dmp grants=Y rows=Y compress=Y indexes=Y log=$DUMP_DIR/$DUMP_FILE.log

echo "<<Wed is incremental dump the db,file:"$DUMP_FILE.dmp"...............!>>" | $LOGME

;;

#星期四增量导出

Thu)exp system/$SYSTEMPASS@$MY_ALIAS inctype=incremental buffer=40960 file=$DUMP_DIR/$DUMP_FILE.dmp grants=Y rows=Y compress=Y indexes=Y log=$DUMP_DIR/$DUMP_FILE.log

echo "<<Thu is incremental dump the db,file:"$DUMP_FILE.dmp"...............!>>" | $LOGME

;;

#星期五累计导出

Fri)exp system/$SYSTEMPASS@$MY_ALIAS inctype=cumulative buffer=40960 file=$DUMP_DIR/$DUMP_FILE.dmp grants=Y rows=Y compress=Y indexes=Y log=$DUMP_DIR/$DUMP_FILE.log

echo "<<Fri is cumulative dump the db,file:"$DUMP_FILE.dmp"...............!>>" | $LOGME

;;

#星期六增量导出

Sat)exp system/$SYSTEMPASS@$MY_ALIAS inctype=incremental buffer=40960 file=$DUMP_DIR/$DUMP_FILE.dmp grants=Y rows=Y compress=Y indexes=Y log=$DUMP_DIR/$DUMP_FILE.log

echo "<<Sat is incremental dump the db,file:"$DUMP_FILE.dmp"...............!>>" | $LOGME

;;

#星期日增量导出

Sun)exp system/$SYSTEMPASS@$MY_ALIAS inctype=incremental buffer=40960 file=$DUMP_DIR/$DUMP_FILE.dmp grants=Y rows=Y compress=Y indexes=Y log=$DUMP_DIR/$DUMP_FILE.log

echo "<<Sun is incremental dump the db,file:"$DUMP_FILE.dmp"...............!>>" | $LOGME

;;

*)

;;

esac

fi

if test $? -eq 0 -a -s $DUMP_DIR/$DUMP_FILE.dmp

then

echo "<<dump the oracle database success at: "$DUMP_FILE"..............!>>" | $LOGME

else

echo "<<dump the oracle database fail at: "$DUMP_FILE"..............!>>" | $LOGME

exit $?

fi

else

echo "<<sorry!,the exp not to find or not execute,please check it..............!>>" | $LOGME

exit $?

fi

#其实可以用find . -atime -days -exec rm {} 删除前DAYS天的备份文件,但查找不是很精确!

#if define the days then to execute delete the dump file $DAYS ago!

if [ -n $DAYS -a $DAYS -gt 0 ]; then

echo "<<system will to remove the dump file $DAYS days ago..............!>>" | $LOGME

if [ -x $ORACLE_HOME/bin/svrmgrl ]; then

svrmgrl <<EOF

connect $USERNAME/$PASSWORD@$MY_ALIAS

spool $TEMP

select to_char(sysdate-$DAYS,'yyyymmdd') mydate from dual;

spool off

exit

EOF

if test $? -eq 0 -a -f $TEMP -a -s $TEMP ; then

echo "<<get the $DAYS days ago's date is ok..............!>>" | $LOGME

else

echo "<<to get $DAYS days ago's date is fail(connect oracle is fail---------)..............!>>" | $LOGME

#exit $?

fi

else

echo "<<not find the oracle's svrmgrl program or cant not execute and get the days is fail..............!>>" | $LOGME

exit $?

fi

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

##

## Gegin to remove the dump file

##

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

#TEMPDATE=`cat $TEMP | sed '1d' | sed '$d' | grep -v '^--*'`

TEMPDATE=`cat $TEMP | sed '1d' | sed '$d' | sed '/^--*/d'`

#echo "$TEMPDATE"

rm -f $TEMP

if test ! $? -eq 0 ; then

echo "<<can not to remove the temp file:"$TEMP"..............!>>" | $LOGME

fi

#echo "${DUMP_DIR}/${TEMPDATE}.dmp"

if test -e $DUMP_DIR/$TEMPDATE.dmp -a -f $DUMP_DIR/$TEMPDATE.dmp -a -n $TEMPDATE; then

rm -f $DUMP_DIR/$TEMPDATE.dmp

rm -f $DUMP_DIR/$TEMPDATE.log

rm -f $DUMP_DIR/$TEMPDATE.tar.Z

if test $? -eq 0 ; then

echo "<<remove the "$DUMP_DIR/$TEMPDATE.dmp" is ok..............!>>" | $LOGME

else

echo "<<remove the "$DUMP_DIR/$TEMPDATE.dmp" is fail..............!>>" | $LOGME

#exit $?

fi

else

echo "<<can not to find the file: "$DUMP_DIR/$TEMPDATE.dmp" ..............!>>" |

$LOGME

#exit $?

fi

fi

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

#

#to transfer the dump file to other's host user ftp

#

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

if [ -e $DUMP_DIR/$DUMP_FILE.dmp -a -e $DUMP_DIR/$DUMP_FILE.log ]; then

tar -cvf $DUMP_DIR/$DUMP_FILE.tar $DUMP_DIR/$DUMP_FILE.dmp $DUMP_DIR/$DUMP_FILE.log && compress $DUMP_DIR/$DUMP_FILE.tar | $LOGME

if test $? -eq 0 -a -e $DUMP_DIR/$DUMP_FILE.tar.Z ; then

echo "<<the dump file "$DUMP_FILE.tar.Z" is archive ok.........!>>" | $LOGME

rm -f $DUMP_DIR/$DUMP_FILE.tar

rm -f $DUMP_DIR/$DUMP_FILE.log

rm -f $DUMP_DIR/$DUMP_FILE.dmp

if test ! $? -eq 0 ; then

echo "<<delete the dump file is fail!.........................!>>" | $LOGME

else

echo "<<delete the dump file is ok!.........................!>>" | $LOGME

fi

else

echo "<<the dump file "$DUMP_FILE.tar.Z" is archive fail..........!>>" | $LOGME

exit $?

fi

fi

echo "<<system now is transfering file to ${BACKHOST_IP}..............!>>" | $LOGME

ftp -n $BACKHOST_IP <<! | $LOGME

user $BACKHOST_USERNAME $BACKHOST_PASSWORD

bin

prompt

put $DUMP_DIR/$DUMP_FILE.tar.Z $BACKUP_DIR/$DUMP_FILE.tar.Z

close

bye

!

if test $? -eq 0 ; then

echo "<<Transfer the file:"$DUMP_DIR/$DUMP_FILE.tar.Z" to "$BACKHOST_IP"$BACKUP_DIR is OK.................! >>" | $LOGME

else

echo "<<Transfer the file:"$DUMP_DIR/$DUMP_FILE.tar.Z" to "$BACKHOST_IP"$BACKUP_DIR is fail..................! >>" | $LOGME

exit $?

fi

if test $? -eq 0 ; then

echo "<<the script is execute finish!,please check it!.......................................!>>" | $LOGME

echo "-----------------------------------------------------------------" | $LOGME

exit 0

fi

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有