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
代码如下:
说明一下:数据备份到远程的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
相关阅读 更多 +