免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3422 | 回复: 9
打印 上一主题 下一主题

oracle数据库全智能备份 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-02-18 18:00 |只看该作者 |倒序浏览
说明:本程序采用crontab 定时exp(我用户逻辑备份,你也可以指定为整库逻辑备份),exp出来的数据放在本地硬盘,但总共只保留最近几天的数据,然后将当日备份的数据通过FTP备份到远程服务器,完毕,将已上传到FTP的文件与本地已备份出来的文件进行比较,如完全一致,则将FTP服务器上的前几天的老文件删除,只保留最近几天的文件,整个备份过程出现例外时,程序会通过短信或IVR外呼方式通知数据库管理人员(这个要配合我开发的报警接入服务器使用,各位可参考我的Blog,起码可以实现短信通知方式,当然喽,要实现这个你的信箱一定是要和手机进行绑定的,比如联通的如意邮箱)。整个程序可完全实现无人工参于备份,本地硬盘和FTP服务器上总只保留最近几天的备份文件(你要是怕最近几天的还不够的话,你还可以自已定期磁带备份)

主机有问题时,只要把已备份出来的数据FTP到备机上,再imp就可以了。若没有备机,重装一下操作系统及数据库(注意,如果是用整用户备份,原来创建脚本要保留,如果采用整库备份,那就无所谓了),imp即OK了。

#######################################################################
#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=.PATHORACLE_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/JREORACLE_HOME/jlibORACLE_HOME/rdbms/jlib
CLASSPATH=$CLASSPATHORACLE_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/yourpasswd  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.7.16.txt   #10.212.11.131 为监控主机之IP地址
echo $1>./10.243.70.176.txt
ftp -ni 10.243.7.21<<FTP_Message
user alertsmg alertsmg
asc
put  ./10.243.7.16.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  "130060**#"数据库用户$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.179 <<FTP_delete
user backup mypasswd
cd  /DBBackUp/$1
delete $deletefile
bye
FTP_delete
    echo "Send OK Message To AlertSMGIVRServer..."
#    send_message_ftp  "1300606***#"$Message
####文件校验不一致则######################################################
else                #文件校验通不过
  echo "Send Error Message To AlertSMGIVRServer..."
  send_message_ftp  "1300220022**#"$1备份文件上传有问题请及时查看
  echo `date "+%Y/%m/%d %H:%M:%S"`" Process END."
exit
fi
}
##############################shell主程序开始################################
for oracle_user in cal_fee #原来备分用户共三个用户,现在只备一个
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

[ 本帖最后由 weicr 于 2006-2-26 10:02 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-02-18 18:55 |只看该作者
顶一个先.谢谢了.

论坛徽章:
0
3 [报告]
发表于 2006-02-18 20:26 |只看该作者
good job

论坛徽章:
0
4 [报告]
发表于 2006-02-18 21:57 |只看该作者
謝謝~

论坛徽章:
0
5 [报告]
发表于 2006-02-20 19:24 |只看该作者

好贴

好贴,顶一下,是我最想要的。楼主底子深呀,I服了You

论坛徽章:
0
6 [报告]
发表于 2006-02-21 19:09 |只看该作者

运行完全通过,谢谢楼主

运行完全通过,谢谢楼主,已经投入使用了。

论坛徽章:
0
7 [报告]
发表于 2006-02-26 10:06 |只看该作者

今天有空,把自己的贴子说明稍改一下

如题,新手发贴,总爱回头看看,呵。。。。。

论坛徽章:
0
8 [报告]
发表于 2006-02-26 21:10 |只看该作者
顶,谢谢!

论坛徽章:
0
9 [报告]
发表于 2006-02-27 10:21 |只看该作者
謝謝~

论坛徽章:
0
10 [报告]
发表于 2006-02-27 11:23 |只看该作者
产品库,主要还是用联机备份才是正理,exp方式,导出导入的,也慢啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP