zoukankan      html  css  js  c++  java
  • ORACLE自动备份并且自动FTP到备份机的SHELL脚本(http://doc.linuxpk.com/456.html)

    本次上传的脚本有很多可以改进的地方!这也是本人第一次在网上发帖,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

  • 相关阅读:
    POJ 2031 Building a Space Station (最小生成树)
    HDU 1875 畅通工程再续 (最小生成树)
    HDU 1233 还是畅通工程 (最小生成树)
    POJ 1679 The Unique MST (最小生成树)
    js调试工具console详解
    使用阿里云集成包快速搭建LAMP+FTP教程
    PHP使用纯真IP数据库
    mysql配置文件my.cnf解析
    Javascript常用函数收集(不定期更新)
    性能测试工具:AB
  • 原文地址:https://www.cnblogs.com/wangbin/p/1435307.html
Copyright © 2011-2022 走看看