写备份恢复的脚本。卡住了。备份的部分是完成了。唉。只怪我的shell水平太弱了。恢复的部分怎么想都觉得不好。还是手工恢复吧。等我想好了再来完善。do,undo,redo,日志。作为我理想中设计完善的脚本,应该具备这些灵活安全完善的功能,也就是目标是万无一失,像editplus可以无限的撤销重做一样,怎么改都会回到原来的状态。

#!/bin/bash
#
#
 datamgr      This shell script takes care of backup and restore
#
               mysql database.
#
#
 
#
 description: backup your database and restore ,support do, undo,\
#
              
#
 

#取所有参数

option
=$1
targetTime
=$2
targetDB
=$3
targetTable
=$4

#echo $#
[ $# -gt 3 ] || targetTable="NOTABLE"
[ $# -gt 2 ] || targetDB="mambog_corp"
[ $# -gt 1 ] || targetTime=`date +%Y-%m-%d`
[ $# -gt 0 ] || exit 1

#设置备份文件和数据库数据存放的路径。
dataBkDir=/home/bailing/databk
dataDir
=/var/lib/mysql
configFile
="${bkDir}/datamgr.conf";

#设置错误提示
error_db_not_exists="数据库不存在"
error_table_not_exists
="表不存在"
error_time_bad_format
="wrong date format ,must be(yyyy-mm-dd,like 2006-03-03)"

#设置用户提示
usage="Usage: $0  [-options][ yyyy-mm-dd ][ databasename [tablename] ] 
  or:  $0 
"

usage_try
="
Try \`$0 --help' for more information.
"

usage_help
="

[参数列表]
-b 备份
-r 恢复
-u 撤销本次恢复操作
-d 库名 备份/恢复一数据库
-t 表名 备份/恢复某一表
-t 时间 恢复哪天(格式:年-月-日,如2006-02-02)的表/数据库

-l 列出所有已备份的文件名 / 列出所有数据库的名称
-h 帮助
"

if [ $# -eq 0 ]; then
  echo >&2 "$usage"
  
echo >&2 "$usage_try"
  
exit 127
fi

fail
=0
case $# in
  1 )
    
case "z${1}" in
      z
--help )
      
echo -"$usage" || fail=127echo -"$usage_help" || fail=127
      
exit $fail;;
      z
--version )
      
echo "datamgr  0.1" || fail=127
      
exit $fail;;
      
* ) ;;
    esac
    ;;
  
* ) ;;
esac

RETVAL
=0
dataFileName
="NULL"
bkFileName
="NULL"

#设置备份文件名
genBkFileName(){
    
if [ $targetTable != "NOTABLE" ]; then
        
if [ $option = "-r" ]; then
            uTime
=`date +%H-%M-%S`
            bkFileName
="${dataBkDir}/${targetDB}.${targetTable}.${targetTime}.${uTime}"
        
else
            bkFileName
="${dataBkDir}/${targetDB}.${targetTable}.${targetTime}"
        fi
    
else 
        
if [ $option = "-r" ]; then
            uTime
=`date +%H-%M-%S`
            bkFileName
="${dataBkDir}/${targetDB}.${targetTime}.${uTime}"
        
else
            bkFileName
="${dataBkDir}/${targetDB}.${targetTime}"
        fi
    fi
    oldBkFileName
=$bkFileName
    tmpstr
="0 1 2 3 4 5 6 7 8 9"
    
for i in $tmpstr
    
do
        
if [ -$bkFileName.zip ]; then    
            bkFileName
="$oldBkFileName-$i"
        fi
    
done
    bkFileName
=$bkFileName.zip;
}

#设置数据文件名
genDataFileName(){
    
if [ $targetTable != "NOTABLE" ]; then
        dataFileName
="${targetDB}/${targetTable}.*"
    
else 
        dataFileName
="${targetDB}/*.*"
    fi
}

#备份
backup() {
    
echo "Starting backup.. "
    targetTime
=`date +%Y-%m-%d`
    
    
#测试数据库是否存在
    [ -"${dataDir}/${targetDB}" ] 
    RETVAL
=$?
    
if [ $RETVAL -gt 0 ]; then
        
echo $error_db_not_exists;
        
exit $RETVAL;
    fi

    
#设置文件名
    genDataFileName
    genBkFileName
    
echo $1
    
echo "data Files :${dataFileName}";
    
echo "backup File Name :${bkFileName}";
    
    cd 
$dataDir
    RETVAL
=$?
    
if [ $RETVAL -gt 0 ]; then
        
exit $RETVAL
    fi
    zip 
--$dataBkDir -9 $bkFileName $dataFileName
    RETVAL
=$?
    
#return $RETVAL
}

#恢复数据
restore() {
    
# Stop daemons.
    echo -n $"restore? !!!! (y/n): "
    read confirm
    
case "$confirm" in
     y
|Y)
        
echo " restore starting "
        backup
        
echo $dataFileName
        
echo $bkFileName
        bkFileName
="${dataBkDir}/${targetDB}.${targetTime}.zip"
        
echo $bkFileName
        ;;
     n
|Y)
        
echo "restore cancel, no data was restored, no modified happened"
        
exit 1;
        ;;
    
*)
        
echo "bad param, no data was restored, no modified happened"
        
exit 1
        ;;
    esac

    
if [[ $targetTime == [0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] ]] ;then
        
echo $targetTime;    
    
else
        
echo "${error_time_bad_format}- ${targetTime}";
        
exit 1
    fi
    RETVAL
=$?
    
return $RETVAL
}

#列出所有已备份的文件
list(){
  
echo "all backuped files"
  ls 
$dataBkDir
}

undo(){
  
echo "undo the restore operation";
}
redo(){
  
echo "redo the restore operation";
}

# See how we were called.
case "$1" in
  
-b)
    backup
    ;;
  
-r)
    restore
    ;;
  
-u)
    undo
    ;;
  
-l)
    
list
    RETVAL
=$?
    ;;

  
*)
    
echo $usage_help
    
exit 1
esac

exit $RETVAL
Posted on 2006-03-14 13:36  古代  阅读(475)  评论(0)    收藏  举报