shell如何实现自动记录备份次数??...
时间:2010-08-15 来源:winonatong
shell如何实现自动记录备份次数??
# 这基本上是我的真实备份shell的框架,实际使用中我的机器上有四个数据库,并有日初、 # 日终的处理,当然也只是把下面的函数多几回调用而已。 # 启运方式使用cron机制自动启动 # 我没有主刻意去实现楼主要求的记数工作,因为我实在不太明白他具体的要求、目的, # 但我想看了下在的shell,增个小功能不会太难的。 # 我懒,所以没有给各位朋友Email,大家自己看吧! # 备份主shell 文件名:bk.sh HOMEDIR=/u1/autodbbk/bkdir # 自动备份主程序目录 INFORMIXNAME=informix # informix用户名 TODAY=`date '+%Y%m%d'` # 备份日期 echo $TODAY $HOMEDIR >;today # 日期文件 BKDIR=/u3/dbbk # 备份目录 LOGNAME=$BKDIR/log/$TODAY.bk.log # 备份日志 fun_dbexport() { # DBNAME=$1 # 数据库名 # MAGNAME=$2 # 管理用户 echo "\nbk$1 start ........................................................\n" date '+%Y%m%d-%H:%M:%S' set -x su - $INFORMIXNAME -c "onmode -F" # 释放未使用的内存 su - $INFORMIXNAME -c "ontape -s -L 0" rm -r $BKDIR/$1.exp $BKDIR/dbexport.$1 su - $2 -c "dbexport $1 -ss -o $BKDIR" >;$BKDIR/dbexport.$1 sleep 10 FLAG=`grep "dbexport completed" $BKDIR/dbexport.$1` if [ -z "$FLAG" ] then echo "$1 dbexport ERR!" else echo "$1 dbexport OK!" fi set +x date '+%Y%m%d-%H:%M:%S' echo "\nbk$1 end .........................................................\n" } fun_compress() { # DBNAME=$1 echo "\ncompress $1 start ................................................\n" date '+%Y%m%d-%H:%M:%S' cd $BKDIR echo "compress $1.exp/*" compress $1.exp/* echo "tar cvfm $BKDIR/data/$TODAY.$1.ax.tar $1.exp dbexport.$1" tar cvfm $BKDIR/data/$TODAY.$1.ax.tar $1.exp dbexport.$1 date '+%Y%m%d-%H:%M:%S' echo "\ncompress $1 end ..................................................\n" } fun_ftp() { # DBNAME=$1 echo "\nftp $1 start .....................................................\n" date '+%Y%m%d-%H:%M:%S' set -x chmod 644 $BKDIR/data/$TODAY.$1.* # 做以下 cp 及传输是因为要与另一服务器上备份数据对传数据,并互相异机备份, # 以便达到在两台机器的硬盘上、磁带上都有备份。 cp $BKDIR/data/$TODAY.$1.* $BKDIR/tar cd $BKDIR/tar ftp -n 192.1.41.67<<! user down abcdefg bin cd /u3/dbbk/tar put $TODAY.$1.ax.tar ! set +x date '+%Y%m%d-%H:%M:%S' echo "\nftp $1 end .......................................................\n" } fun_dbchk() { # DBNAME=$1 # 数据库名 echo "\noncheck start ....................................................\n" date '+%Y%m%d-%H:%M:%S' su - $INFORMIXNAME -c "$HOMEDIR/update.sh $1" su - $INFORMIXNAME -c "oncheck -cDI $1" date '+%Y%m%d-%H:%M:%S' echo "\noncheck end ......................................................\n" } fun_deldbfile() { # 此函数专门为自动删除备份目录中超过指定天数的文件而设计 if [ $# -lt 2 ] then echo "格式:fun_deldbfile 数据库名 保留天数" else # DBNAME=$1 # MAXDAY=$2 N=`ls $BKDIR/data/*.$1.ax.tar|sort|wc -l` # 文件总数 if [ $N -gt $2 ] then M=`expr $N - $2` ls $BKDIR/data/*$1.ax.tar|sort|sed -n "1,$M"p | \ sed "s/^/rm /" >;tmp_dir.sh sh tmp_dir.sh; rm tmp_dir.sh fi fi } fun_wrttyp() { FILE=`echo $1 | sed "s/\//|/g"` if [ $# -lt 1 ] then echo "格式:wrtty 文本文件名" else who |awk -F ' ' '{print $2}'|sed "s/^/cat $FILE >; \/dev\//" | \ sed "s/|/\//g" >; tmp_wrtty.sh sleep 1 sh tmp_wrtty.sh; rm tmp_wrtty.sh fi } fun_killterm() { echo "\nkillterm start ...................................................\n" date '+%Y%m%d-%H:%M:%S' set -x # 根据informix用户的环境变量设置环境变量,一定要保证informix环境变量正确 INFORMIXNAME=informix # informix用户名 INFORMIXDIR=`su - $INFORMIXNAME -c env|grep INFORMIXDIR|cut -f2 -d'='` INFORMIXSERVER=`su - $INFORMIXNAME -c env|grep INFORMIXSERVER|cut -f2 -d'='` ONCONFIG=`su - $INFORMIXNAME -c env|grep ONCONFIG|cut -f2 -d'='` PATH=$PATHINFORMIXDIR/bin export INFORMIXDIR INFORMIXSERVER ONCONFIG PATH who -ux; w; onstat -u #杀telnet终端 cd $HOMEDIR who -u|grep ttyp|awk -F ' ' '{printf "kill -9 %s\n",$7; }' >;tmp_killt.sh sh tmp_killt.sh cat tmp_killt.sh rm tmp_killt.sh sleep 30 date '+%Y%m%d-%H:%M:%S' #杀informix线索,因此shell后台执行,须先设置informix环境变量 echo "INFORMIXDIR=$INFORMIXDIR" >; tmp_killu.sh echo "INFORMIXSERVER=$INFORMIXSERVER" >;>; tmp_killu.sh echo "ONCONFIG=$ONCONFIG" >;>; tmp_killu.sh echo "ATH=$PATH" >;>; tmp_killu.sh echo "export PATH INFORMIXDIR INFORMIXSERVER ONCONFIG">;>; tmp_killu.sh onstat -u onstat -u|sed -n "6,$"p|grep -v "maximum concurrent"|grep -v "^$" | \ grep -v " root "|grep -v " informix " | \ awk -F ' ' '{printf "onmode -z %s\n",$3;}' >;>; tmp_killu.sh sh tmp_killu.sh cat tmp_killu.sh rm tmp_killu.sh sleep 10 who -ux; w; onstat -u set +x date '+%Y%m%d-%H:%M:%S' echo "\nkillterm end .....................................................\n" # 这段的shell的正确与否有待高手指点 } fun_main_after() { # DBNAME=$1 # 后续处理:备份压压宿、数据传送、优化及检查、删除多余的备份 fun_compress $1 2>;&1 | tee -a $LOGNAME fun_ftp $1 2>;&1 | tee -a $LOGNAME fun_dbchk $1 2>;&1 | tee -a $LOGNAME fun_deldbfile $1 25 2>;&1 | tee -a $LOGNAME } main() { echo "\n自动备份启动 ........................................\n"|tee $LOGNAME date '+%Y%m%d-%H:%M:%S' | tee -a $LOGNAME # 初始处理:发布通告、杀终端、删除tar目录中的旧备份 fun_wrttyp $HOMEDIR/tz/tz0 # 把tz0文件的内容写到当前所有在线ttyp上 fun_killterm 2>;&1 | tee -a $LOGNAME rm $BKDIR/tar/*tar # 备份备理:执行dbexport fun_dbexport data1 ocbps 2>;&1 | tee -a $LOGNAME # 后续处理:备份压缩、数据传送、优化及检查、删除多余的备份 fun_main_after data1 # 写入数据到磁带 echo "tar c8vm $TODAY.* \n" # 下面sleep两小时,是为了等待另一台机器上的数据备份完成后传过来,再一起tar cd $BKDIR/tar; sleep 7200; tar c8vm $TODAY.* # tar到磁带上 date '+%Y%m%d-%H:%M:%S' | tee -a $LOGNAME echo "\n自动备份结束 .....................................\n"|tee -a $LOGNAME } main # 执行备份主程序 # 数据库优化shell 文件名:update.sh #此文件为优化数据库用,它被系统自动备调用,请不要删除。 #格式:update.sh 数据库名 echo "\nupdate $1 start ...................................................\n" date '+%Y%m%d-%H:%M:%S' set -x dbaccess $1 << ! update statistics ; ! set +x date '+%Y%m%d-%H:%M:%S' echo "\nupdate $1 end .....................................................\n |
相关阅读 更多 +