文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>oracle数据库全智能备份

oracle数据库全智能备份

时间:2006-02-18  来源:weicr

今天在论坛里看到一位兄弟求删除某日文件的贴子,想起前年我写的一个oracle智能自动备份脚本,里面也包含如何删除带日期字样的文件的方法(百分之百准确)。一个复制粘贴出来供大家参考(对了,我这代码运行有一年多两年了吧,我记不清了)
代码如下:
说明一下:数据备份到远程的FTP服务器上,远程服务器只保存近几天来的文件,在比较本地及远程数据文件确认准确无误后,删除老文件。
#######################################################################
#Written by weichuanren for backuping all the important exported data #
#File From my Oracle database to some a remote FTP Server in schedule.#
#Env: Unix or Linux     .                                             #
#######################################################################

###########为正确exp用户数据库文件,先取得oracle之用户环境#####################
# Oracle Environment
export LD_ASSUME_KERNEL=2.4.1
export THREADS_FLAG=native
export ORACLE_BASE=/u01/oracle; export ORACLE_BASE
export ORACLE_HOME=/u01/oracle/product/9.2.0; export ORACLE_HOME
export ORACLE_SID=hnzhpt; export ORACLE_SID
export ORACLE_TERM=xterm; export ORACLE_TERM
NLS_LANG="american_america.ZHS16GBK"; export NLS_LANG
export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib; export LD_LIBRARY_PATH
PATH=.:$PATH:$ORACLE_HOME/bin:/usr/local/java/bin:/usr/local/bin; export PATH
TNS_ADMIN=$ORACLE_HOME/config; export TNS_ADMIN
NLS_SORT=xcroatian; export NLS_SORT

CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
CLASSPATH=$CLASSPATH:$ORACLE_HOME/network/jlib
export CLASSPATH

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

#############################构造shell函数韦传仁200208 #####################################
#####求子串函数 参数: 字符串  开始位置  长度 这个函数好象一些系统有现成的,我开发的哪个系统没有,于是写一个,反正awk里就有的。
substr()
{
 content=$1
 strbegin=$2
 strlen=$3
 awk 'END { print substr("'$content'","'$strbegin'","'$strlen'") }' /dev/null
}
#####求某月有几天 参数为 年年年年月月
get_month_days()
{
  yy=`substr $1 1 4`
  mm=`substr $1 5 2`
  re1=`expr $yy \% 4`
  re2=`expr $yy \% 100`
  re3=`expr $yy \% 400`
  case $mm in
    0[13578]|1[02]) days=31;;
    0[469]|11)      days=30;;
  esac
  if [ $mm -eq 02 ]
  then
      if [ $re1 -eq 0 -a $re2 -ne 0 -o $re3 -eq 0 ]
         then days=29
         else days=28
      fi
  fi
  echo $days
}
####求昨日之日期 函数   返回 '年年年年月月日日'格式  
yesterday()
{
  yy=`substr $1 1 4`
  mm=`substr $1 5 2`
  dd=`substr $1 7 2`
  if [ $dd -eq 01 ]
  then
       if [ $mm -eq 01 ]
       then
            yyy=`expr $yy - 1`
            mmy=12
            ddy=31
            echo `printf "%04d" $yyy`1231
       else
            yyy=$yy
            mmy=`expr $mm - 1`
            mmy=`printf "%02d" ${mmy}`
            Mytemp=$yyy$mmy
            echo  $yyy$mmy`get_month_days  $Mytemp`
       fi      
  else
     ddy=`expr $dd - 1`
     ddy=`printf "%02d" $ddy`
     mmy=$mm
     yyy=$yy
     echo $yyy$mmy$ddy
  fi
}
####数据库整用户逻辑导出  参数用户名  密码  返回整数类型 1为成功 其他为错
exp_user()
{
 cd /backup/$1
 rm -f *.dmp
 curdir=/backup/$1
 exp userid=system/mypasswd owner=$1  file=./$1`date "+%Y%m%d"`.dmp log=./$1`date "+%Y%m%d"`.log
 datestr=`date "+%Y%m%d"`
 rev=`more ./$1${datestr}.log|grep 'Export terminated successfully without warnings'|wc -l`
 echo $rev
}
###通过FTP方式发布报警短信/IVR呼出  参数 '手机号码#/#内容' 这段大伙可以不要哦
因为我是配合我自开发的报警
send_message_ftp()
{
rm -f ./10.243.70.176.txt   #10.212.11.131 为监控主机之IP地址
echo $1>./10.243.70.176.txt
ftp -ni 10.243.70.231<<FTP_Message
user alertsmg kkkkkppswd
asc
put  ./10.243.70.176.txt
bye
FTP_Message
}
FTP_backup_message()       ##远程备份函数   参数为数据库用户名
{
putdate=`date "+%Y%m%d"`   #上传文件时间标识
deletedate=$putdate        #应删除dmp文件的时间标识
for i in 1 2 3             #求4天之前的dmp文件
do
  deletedate=`yesterday $deletedate`
done
putfile=`echo $1${putdate}.dmp`        #今日上传文件名
deletefile=`echo $1${deletedate}.dmp`  #今日应删除的文件名
echo "*****************************************"
echo `date "+%Y/%m/%d %H:%M:%S"` Process Begin...
cd /backup/$1             #进入数据库用户备导出文件所在目录
test -s ./$putfile        #验证今日导出文件是否存在
if [ $? -eq 0 ]
then                      #存在则....
  echo "FTP PutLoad Begin..."
  ftp -ni 10.243.70.179<<FTP_backup
user backup mypasswd
binary
cd  /DBBackUp/$1
lcd /backup/$1
put $putfile
ls -l ./list.log
bye
FTP_backup
  echo "FTP PutLoad END"
else  #导出文件不存在
  echo "Send Error Message To AlertSMGIVRServer..."
  send_message_ftp  "1332200??#"数据库用户$1导出文件不存在请及时查看
  exit
fi
#如果前面操作成功,设rsize为远程文件大小,lsize为本地文件大小###########
rsize=`more ./list.log|grep $putfile|awk '{printf $5}'`
lsize=`ls -l|grep $putfile|awk '{printf $5}'`
echo "The size of the remote file "$rsize
echo "The size of the local  file "$lsize
if [ $rsize -eq $lsize ]
  then
    rsize=`echo "scale=3;$rsize/1024/1024"|bc -l` #远程文件大小为(Mbytes)
    Message="$1导出文件远程FTP备份成功,文件大小为:${rsize}Mbytes."
    echo "Delete remote old file..."
    ftp -ni 10.243.70.1<<FTP_delete
user backup mypasswd
cd  /DBBackUp/$1
delete $deletefile
bye
FTP_delete
    echo "Send OK Message To AlertSMGIVRServer..."
#    send_message_ftp  "132200??#"$Message
####文件校验不一致则######################################################
else                #文件校验通不过
  echo "Send Error Message To AlertSMGIVRServer..."
  send_message_ftp  "1300220**#"$1备份文件上传有问题请及时查看
  echo `date "+%Y/%m/%d %H:%M:%S"`" Process END."
exit
fi
}
##############################shell主程序开始################################
for oracle_user in cti #原来备分用户共三个用户,现在只备一个
do
  result=`exp_user $oracle_user mypasswd`
  if [ $result -eq 1 ]
  then
    FTP_backup_message ${oracle_user}
  else  #######小概述事件,一般不会发生
    send_message_ftp "132200**#"${oracle_user}导出失败麻烦
  fi
done
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载