现在的位置: 首页 > 综合 > 正文

ORACLE自动备份并且自动FTP到备份机的SHELL脚本(http://doc.linuxpk.com/456.html)

2013年06月23日 ⁄ 综合 ⁄ 共 13473字 ⁄ 字号 评论关闭
本次上传的脚本有很多可以改进的地方!这也是本人第一次在网上发帖,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

抱歉!评论已关闭.